Программирование — работа в Москве
Дата: 2022-09-03
Детали
Регион
Москва
Метро
Академическая, Семёновская, Нагорная
Занятость
на дому
Стоимость
договорная
Дата публикации
2022-09-03
Описание
Язык программирования: PHP, HTMl,CSS Для работы Обучение с нуля.
Похожие заказы
Обучение Roblox Studio
от 1000.00 руб.
Для ребенка 10 лет Ребенок (10 лет) хочет научиться создавать игры в Roblox
Казань
Репетиторы
2025-10-09
UX-UI дизайн
дистанционно
договорная
3д. Продукт: 3д модель. Объём работ: 1. Технического задания нет.
Новосибирск
Фрилансеры
2025-10-09
Обучение Python
дистанционно
договорная
Для ребёнка Объяснение углубленной школьной программы
Москва
Репетиторы
2025-10-09
Обучение 1С-программированию
дистанционно
договорная
Для себя Пройтись по задачам
Москва
Репетиторы
2025-10-09
Обучение C#
дистанционно
договорная
для вуза СРАВНЕНИЕ ПОДХОДОВ К ОСВОБОЖДЕНИЮ РЕСУРСОВ В ЯЗЫКАХ C++ И C# Теоретические сведения: Освобождение ресурсов. При использовании ссылочных типов, например объектов классов, для них будет отводиться место в стеке, только там будет храниться не значение, а адрес участка памяти в ку че, в котором и будут находиться сами значения данного объекта. Ес ли объект класса перестает использоваться, то при очистке стека ссылка на участок памяти также очищается, однако это не приводит к немедленной очистке самого участка. Впоследствии сборщик мусора (garbage collector) увидит, что на данный участок больше нет ссылок, и очистит его. Пример: class Program { static void Main(string[] args) { Test(); } private static void Test() { Country country = new Country(); country.x = 10; } country.y = 15; } class Country { public int x; public int y; } В методе Test создается объект Country. С помощью оператора new в куче для хранения объекта CLR выделяет участок памяти, а в стек добавляет адрес этого участка памяти. В главном методе Main вызывается метод Test. После того как Test отработает, место в стеке очищается, а сборщик мусора очищает ранее выделенный под хране ние объекта country участок памяти. Сборщик мусора не запускается сразу после удаления из стека ссылки на объект, размещенный в куче. Он запускается в то время, когда среда CLR обнаружит в этом потребность, например когда про грамме требуется дополнительная память. Как правило, объекты в куче располагаются неупорядоченно, между ними могут быть пустоты. Куча довольно сильно фрагменти рована. Поэтому после очистки памяти в результате очередной сбор ки мусора оставшиеся объекты перемещаются в один непрерывный блок памяти. Вместе с этим происходит обновление ссылок, чтобы они правильно указывали на новые адреса объектов. Также надо отметить, что для крупных объектов существует своя куча – Large Object Heap. В эту кучу помещаются объекты, размер которых больше 85 000 байт. Особенность этой кучи состоит в том, что при сборке мусора сжатие памяти не проводится по причине больших издержек, связанных с размером объектов. Несмотря на то что на сжатие занятого пространства требуется время и приложение не сможет продолжать работу, пока не отработа ет сборщик мусора, благодаря подобному подходу также происходит оптимизация приложения. Теперь, чтобы найти свободное место в куче, среде CLR не надо искать островки пустого пространства среди занятых блоков. Достаточно обратиться к указателю кучи, который указывает на свободный участок памяти, что уменьшает количество обращений к ней. Кроме того, чтобы снизить издержки от работы сборщика мусо ра, все объекты в куче разделяются по поколениям. Существует три поколения объектов: 0, 1 и 2. К поколению 0 относятся новые объекты, которые ни разу не подвергались сборке мусора, к поколению 1 ‒ объекты, которые пе режили одну сборку, к поколению 2 – объекты, прошедшие более од ной сборки мусора. Когда сборщик мусора приступает к работе, он сначала анализи рует объекты из поколения 0. Те объекты, которые остаются актуаль ными после очистки, повышаются до поколения 1. Если после обработки объектов поколения 0 все еще необходима дополнительная память, то сборщик мусора приступает к объектам из поколения 1. Те объекты, на которые уже нет ссылок, уничтожаются, а те, которые по-прежнему актуальны, повышаются до поколения 2. Поскольку объекты из поколения 0 более молодые и нередко находятся в адресном пространстве памяти рядом друг с другом, то их удаление проходит с наименьшими издержками. Класс System.GC. Возможности сборщика мусора в библиотеке классов .NET предоставляет класс System.GC. Через статические ме тоды данный класс позволяет обращаться к сборщику мусора. Наиболее распространенным случаем его использования является сборка мусора при работе с неуправляемыми ресурсами, при интен сивном выделении больших объемов памяти, при которых необходи мо такое же быстрое их освобождение. Некоторые методы и свойства класса System.GC: 1. Метод Collect, приводит в действие механизм сборки мусора. Перегруженные версии метода позволяют указать поколение объек тов, вплоть до которого надо произвести сборку мусора. 2. Метод GetGeneration(Object), позволяет определить номер по коления, к которому относится переданный в качестве параметра объ ект. 3. Метод GetTotalMemory, возвращает объем памяти в байтах, ко торое занято в управляемой куче. 4. Метод WaitForPendingFinalizers приостанавливает работу те кущего потока до освобождения всех объектов, для которых произво дится сборка мусора. Работать с методами System.GC очень просто: // ................................. long totalMemory = GC.GetTotalMemory(false); GC.Collect(); GC.WaitForPendingFinalizers(); //...................................... С помощью перегруженных версий метода GC.Collect можно вы полнить более точную настройку сборки мусора. Так, его перегру женная версия принимает в качестве параметра число – номер поко ления, вплоть до которого надо выполнить очистку. Например, GC.Collect(0) – удаляются только объекты поколения 0. Еще одна перегруженная версия принимает еще и второй пара метр – перечисление GCCollectionMode. Это перечисление может принимать три значения: 1) Default, значение по умолчанию для данного перечисления (Forced); 2) Forced, вызывает немедленное выполнение сборки мусора; 3) Optimized, позволяет сборщику мусора определить, является ли текущий момент оптимальным для сборки мусора. Например, немедленная сборка мусора вплоть до первого поко ления объектов: GC.Collect(1, GCCollectionMode.Forced); Большинство объектов, используемых в программах на C#, отно сятся к управляемым или managed-коду и легко очищаются сборщи ком мусора. Однако встречаются и такие объекты, которые задей ствуют неуправляемые объекты (низкоуровневые файловые дескрип торы, сетевые подключения и т.д.). Такие неуправляемые объекты обращаются к API операционной системы через службы PInvoke. Сборщик мусора может справиться с управляемыми объектами, одна ко он не знает, как удалять неуправляемые. В этом случае разработ чик должен сам реализовывать механизмы очистки на уровне про граммного кода. Освобождение неуправляемых ресурсов подразумевает реализа цию одного из двух механизмов: создание деструктора и реализация классом интерфейса System.IDisposable. Создание деструкторов. Концепция деструкторов в языке C# схожа с таковой в языке C++. Метод деструктора носит имя класса (как и конструктор), перед которым стоит знак тильды (~). Например, деструктор класса Person: public class Person { public string Name { get; set; } ~Person() { } } Console.Beep(); Console.WriteLine("Disposed"); Деструктор в отличие от конструктора не может иметь модифи каторов доступа. В данном случае в деструкторе в целях демонстра ции просто вызывается звуковой сигнал и выводится строка на кон соль, но в реальных программах в деструктор вкладывается логика освобождения неуправляемых ресурсов. Однако на деле при очистке сборщик мусора вызывает не де структор, а метод Finalize класса Person, потому что компилятор C# компилирует деструктор в конструкцию, которая эквивалентна сле дующей: protected override void Finalize() { try { // здесь идут инструкции деструктора } finally { base.Finalize(); } } Метод Finalize уже определен в базовом для всех типов классе Object, однако его нельзя так просто переопределить. Фактическая его реализация происходит через создание деструктора. Используя в программе класс Person, после ее завершения можно услышать голосовой сигнал и увидеть на консоли выводимую строку: class Program { static void Main(string[] args) { Test(); GC.Collect(); Console.ReadLine(); } private static void Test() { Person p = new Person(); } } Даже после завершения метода Test и, соответственно, удаления из стека ссылки на объект Person в куче, может не последовать не медленный вызов деструктора. Лишь при завершении всей програм мы гарантированно произойдет очистка памяти и вызов деструктора. Поэтому для более быстрой очистки памяти применяется метод GC.Collect. На уровне памяти это выглядит так: сборщик мусора при разме щении объекта в куче определяет, поддерживает ли данный объект метод Finalize. Если объект имеет метод Finalize, то указатель на него сохраняется в специальной таблице, которая называется «очередь фи нализации». Когда наступает момент сборки мусора, сборщик видит, что данный объект должен быть уничтожен, и если он имеет метод Finalize, то копируется в еще одну таблицу и окончательно уничтожа ется лишь при следующем проходе сборщика мусора. Интерфейс IDisposable. Иногда необходимо немедленно вызвать деструктор и освободить все связанные с объектом неуправляемые ресурсы. В этом случае можно использовать второй подход – реали зацию интерфейса IDisposable. Интерфейс IDisposable объявляет один-единственный метод Dispose, в котором при реализации интерфейса в классе должно про исходить освобождение неуправляемых ресурсов. Например: class Program { static void Main(string[] args) { Test(); Console.ReadLine(); } private static void Test() { Person p=null; try { p = new Person(); } finally { if (p != null) { p.Dispose(); } } } } public class Person : IDisposable { public string Name { get; set; } public void Dispose() { Console.Beep(); Console.WriteLine("Disposed"); } } Конструкцию try...finally предпочтительнее использовать при вызове метода Dispose, так как она гарантирует, что даже в случае возникнове ния исключения произойдет освобождение ресурсов в методе Dispose. Общие рекомендации по использованию Finalize и Dispose: 1. Деструктор следует реализовывать только у тех объектов, ко торым он действительно необходим, так как метод Finalize оказывает сильное влияние на производительность. 2. После вызова метода Dispose необходимо блокировать у объ екта вызов метода Finalize с помощью GC.SuppressFinalize. 3. При создании производных классов от базовых, которые реа лизуют интерфейс IDisposable, следует также вызывать метод Dispose базового класса. 4. Следует отдавать предпочтение комбинированному шаблону, реализующему как метод Dispose, так и деструктор. Содержание и порядок выполнения работы Работа состоит из двух частей: разобраться в предоставленном примере и дополнить программу из предыдущей работы. Первая часть. Рассмотреть представленный ниже пример, по строить диаграмму времени жизни объектов и ответить на следующие вопросы: 1. Какое максимальное поколение объектов в ходе выполнения программы было выявлено? Сколько их в C# всего? 2. Что будет, если закомментировать строчку GC.Collect(0);? Из менится ли вывод программы, если да, то как и почему? 3. Что будет, если закомментировать строчку GC.Collect(2);? Из менится ли вывод программы, если да, то как и почему? Измените параметр метода GC.GetTotalMemory() с true на false. На что это влияет? В методе MakeSomeGarbage() добавьте к объекту vt создание еще одного любого объекта, например класса StringBuilder. Что измени лось в выводе программы? Листинг программы using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace GarbageCollectorInCSharp { class GCProgram { private const long maxGarbage = 1000; static void Main() { GCProgram myGCCol = new GCProgram(); Console.WriteLine("The highest generation is {0}", GC.MaxGeneration); myGCCol.MakeSomeGarbage(); Console.WriteLine("Generation: {0}", GC.GetGeneration(myGCCol)); Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(false)); GC.Collect(0); Console.WriteLine("Generation: {0}", GC.GetGeneration(myGCCol)); Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(false)); GC.Collect(2); Console.WriteLine("Generation: {0}", GC.GetGeneration(myGCCol)); Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(false)); Console.Read(); } void MakeSomeGarbage() { Version vt; for (int i = 0; i < maxGarbage; i++) { vt = new Version(); } } } } Вторая часть. Получить от преподавателя специальную биб лиотеку для работы с файлом. Подключить её к новому проекту, ис пользуя следующие команды: [DllImport("file32.dll")] public static extern IntPtr open(string path, bool read); [DllImport("file32.dll")] public static extern void close(IntPtr file); [DllImport("file32.dll")] public static extern bool read(IntPtr file, int num, StringBuilder word); [DllImport("file32.dll")] public static extern void write(IntPtr file, string text); [DllImport("file32.dll")] public static extern int length(IntPtr file); Данные команды приведены для 32-разрядной версии библиоте ки, для 64-разрядной требуется использовать file64.dll. Это позволит использовать в программе следующие функции: Открыть файл IntPtr open(string path,bool read) Возвращает дескриптор файла. Параметры: path – путь к файлу. read – режим работы с файлом, если read – true, файл будет до ступен только для чтения, если false – всё содержимое файла будет удалено, но будет возможна запись в файл. Закрыть файл close(IntPtr file) Закрывает файл с переданным дескриптором. Чтение из файла bool read(IntPtr file, int num, StringBuilder word) Пытается прочесть из файла одно слово. Возвращает true в случае корректности номера слова, false – в ином случае. Нумерация слов идёт с единицы. Параметры: file – дескриптор файла. num – номер требуемого слова в файле. word – объект типа StringBuilder, в который будет помещено сло во. Важно: предварительно необходимо проинициализировать данный объект, задав ему в качестве capacity 255. Запись в файл write(IntPtr file,string text) Заменяет содержимое файла с дескриптором file строкой, содер жащейся в text; Количество слов в файле int length(IntPtr file). Возвращает количество слов в переданном файле. все файлы имеются Задание. Написать класс-для работы с данной библиотекой: при создании объекта класса, он открывает файл по переданному кон структору в качестве параметра пути и хранит дескриптор файла всё время жизни объекта. Созданный класс должен содержать конструктор, принимающий два параметра: путь к файлу и режим открытия файла. Созданный класс должен закрывать связанный файл при вызове метода Dispose, либо финализации. Созданный класс не должен предусматривать повторное открытие файла. Предусмотреть обработку всех возможных исключений при ра боте с файлом. В качестве тестовых файлов преподаватель выдаст заранее под готовленные файлы, содержащие набор отдельных слов, с возможны ми повторения. Написать программу для тестирования созданного класса, кото рая должна выполнять указанные в варианте операции.Программа должна содержать меню, со следующими функциями: открыть файлы, получить количество слов в файлах, а также указанные в варианте действия над файлами. Если не сказано иного, то изменяться должны те же файлы, что и были предоставлены. Использовать иные методы работы с файлом кроме библиотеки запрещено! Вариант: Оставить в файлах только десять самых часто встречающихся в них слов. Заменить каждое чётное слово из первого файла на соответствую щее по порядку слово из второго. Заменить каждое нечётное слово из второго файла на соответствующее по порядку слово из первого. (в случае разной длины файлов циклично перебирать меньший из них).
Москва
Репетиторы
2025-10-08
UX-UI дизайн
дистанционно
договорная
Дизайн мобильного приложения. Платформа: Android, iOS. Продукт: Казуальная мобильная игра (2D симулятор нефтеперерабатывающего завода, вертикальный экран, минималистичный стиль). Объём работ: Задачи: Интеграция всех 2D-графических ассетов (иконки, кнопки, фоны) в Unity. Настройка Canvas, UI Prefabs, Sorting Layers, Sprite Atlas, Addressables. Подготовка структуры UI префабов с правильной иерархией, адаптацией под разные экраны. Автоматизация импорта данных из таблиц (CSV → ScriptableObject). Организация ассетов в проекте по лучшим практикам (папки, нейминг, структура). Помощь в сборке UI-кита и поддержании визуальной чистоты проекта. Техническое задание есть.
Москва
Фрилансеры
2025-10-08