Загрузка EXE & DLL модулей в память.


Для оптимизации времени загрузки используемых модулей на исполнение и исключения из лишнего обмена страницами со страничным файлом ОС не загружает модуль в страничный в страничный файл а присоединяет его к файлу. Тем самым размер страничного файла увеличивается на размер модуля. Затем ОС резервирвирует регион адресного пространства и помечает что физ память связанная с этим регионом и есть сам исполн файл.
При запуске программы со сменного носитетеля она копируется в страничный файл.
Атрибуты защиты
Page_NOACCESS – доступ к странице запрещен
PAGE_READONLY — только для чтения
PAGE_READ_WRITE — обычный блок данных
PAGE_EXECUTE – разреш выполнять этой стр-ы
PAGE_EXECUTE_READ – доступ на чтение и выполнение
PAGE_EXECUTE_READ_WRITE – полный доступ
PAGE_WRITECOPY – чтение + запись на новую страницу
PAGE_EXECUTE_WRITECOPY
Использование виртуальной памяти в приложениях

Сущ 3 механизма работы с вирт памятью:
1. виртуальная память предназначена для работы с большими массивами данных.
2. Проецируемые в память файлы: предназначены для обмена данными между приложениями и использ-и при интенсивных операциях чтения/записи.
3. Механизм кучи: использ-ся для работы с множеством малых объектов.
Алгоритм работы с виртуальной памятью
1. зарезервировать регион адресного пространсва:
LPVOID VirtualAlloc (LPVOID Address, DWORD size, DWORD allocation type, DWORD protect);
LPVOID Address – адресс начиная с которого выделить блок памяти функция возвращает адрес
DWORD size – размер блока который мы хотим выдеоить округл до стр-цы
DWORD allocation type — МЕМ_RESERVE – зарезервировать регион адр-го пространства
MEM_COMMIT – передать выделенному ранее региону физ память
DWORD protect – аттрибут защиты.
Освобождение памяти происходит в два этапа:
1. освобождение физ памяти (частично или полностью) связанной с регионом. Этот этап выполняется при помощи вызова функции: bool VirtualFree (
LPVOID addr – алр с которого надо освободить
DWORD size – размер осовбождения.
DWORD freetype — флаг)
freetyope: MEM_RELEASE – освободить регион.
MEM_DECOMMIT –освободить память.
При освобождении региона надо чтобы size = 0 регион не могет освободиться не целиком. Эти флаги можно объединить операцией или, что позволяет вызвать функцию только один раз.
Проблема возникающая при освобождении объектов расположенных в виртуальной памяти: при удалении объектов из виртуальной памяти поскольку размер объекта как правило не равен размеру страницы необходимо проверять чтобы соседние объекты в пределах той же страницы были свободны. Для оптимизации алгоритма желательно чтобы размер объекта(ов) был выровнен по границе страницы. Самым простым способом решения явл учет использовании объектов в виде битового массива объекты которых соответствуют расположенным в пределах физ-й стр-цы на предмет их использования. Если ни один объект страницы не используется то ее можно отдать системе.
2-й способ: использование потока сборщика мусора с низким приоритетом. Этот поток анализирует флаги использования структур в пределах выделенной физ памяти и отдает системе не использ-е стр-цы.

Загрузка...