Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы ОСиСП.doc
Скачиваний:
68
Добавлен:
11.05.2015
Размер:
1.78 Mб
Скачать

Модель автоматической утилизации динамической памяти, основанная на аппаратной поддержке (тегированной памяти).

Наличие «сборки мусора» означает, что программист может быть уверен: система следит за потерей ссылок на объекты и устраняет «утечку памяти». Наличие безопасного принудительного освобождения памяти означает, что программист вправе уничтожить объект; при этом память объекта возвращается системе, а все имеющиеся на него ссылки становятся недействительными (например, обнуляются).

Эта модель, называемая нами моделью с автоматической «сборкой мусора» и принудительным освобождением памяти, на самом деле не нова и уже давно применяется в компьютерах «Эльбрус» (на основе одноименного процессора) и AS/400 (на основе процессора PowerPC), которые обеспечивают очень эффективную реализацию этой модели за счет аппаратной поддержки.

На каждое машинное слово в этих компьютерах отводится два дополнительных бита, называемых битами тегов. Значения этих битов показывают, свободно ли машинное слово или занято, и если занято, то хранится ли в нем указатель или скалярное значение. Этими битами управляют аппаратура и операционная система, прикладным программам они недоступны. Программа не может создать ссылку сама, например, превратив в нее число или другие скалярные данные. Созданием объектов занимается система, которая размещает в памяти объекты и создает ссылки на них. При уничтожении объектов соответствующие теги памяти устанавливаются в состояние, запрещающее доступ. Попытка обратиться к свободной памяти по «зависшему» указателю приводит к аппаратному прерыванию (подобно обращению по нулевому указателю). Поскольку вся память помечена тегами, «сборщику мусора» нет необходимости анализировать информацию о типах, чтобы разобраться, где внутри объектов располагаются ссылки на другие объекты. Что более важно, ему почти не нужно тратить время на поиск недостижимых объектов, поскольку освобожденная память помечена с помощью тех же тегов.

Вопрос № 12

Сборка мусора в среде .Net. Построение графа достижимых объектов.

Вопрос № 13

Сборка мусора в среде .Net. Механизм поколений объектов.

Вопрос № 14

Завершение объектов в среде .NET. Метод Finalize. Список завершаемых объектов (finalization queue) и очередь завершения (freachable queue).

Вопрос № 15

Модель детерминированного освобождения ресурсов в среде .Net. Интерфейс iDisposable и его совместное использование с завершителем (методом Finalize).

Вопрос № 16

«Мягкие ссылки» и кэширование данных в среде .Net.

Сборщик мусора не может собрать объект, используемый приложением, пока код приложения взаимодействует с этим объектом. Говориться, что приложение имеет строгую ссылку на объект.

Слабая ссылка дает сборщику мусора возможность удалить объект, но в то же время обеспечивает приложению доступ к этому объекту.

Слабая ссылка допустима только в течение неопределенного количества времени до сборки объекта при отсутствии строгих ссылок. При использовании слабой ссылки приложение все еще может получить строгую ссылку в объекте, что предотвратит удаление последнего. Однако всегда существует вероятность удаления объекта сборщиком мусора до повторного создания строгой ссылки.

Слабые ссылки полезны для объектов, которые используют большой объем памяти, но могут быть созданы повторно без особых усилий, если они были удалены сборщиком мусора.

Предположим, что в иерархическом представлении приложения Windows Forms пользователь видит разветвленную иерархическую структуру различных решений. Если базовые данные большие по объему, хранение этого дерева в памяти является неэффективным, особенно если пользователь делает в этом приложении что-либо еще.

Если пользователь переключается в другую часть приложения, можно использовать класс WeakReferenceдля создания слабой ссылки на дерево и удалить все строгие ссылки. Когда пользователь переключиться обратно к этому дереву, приложение попытается получить строгую ссылку на дерево и, при успешном выполнении этой операции, избежать повторного создания дерева.

Чтобы установить слабую ссылку на объект, следует создать WeakReferenceс помощью экземпляра отслеживаемого объекта. Затем следует задать свойствоTarget, равным этому объекту, и задать для объекта значение null. Пример кода см. в описании объектаWeakReferenceв библиотеке классов.