![]() |
Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | |
|
Как и виртуальная память проецирование файлов в память позволяет резервировать регион адресного пространства и передавать ему физическую память, но физическая память берётся не из страничного файла, а из файла, уже находящегося на диске или из вновь создаваемого файла.
Когда файл спроецирован в память к нему можно обращаться как к ячейкам памяти, не используя операции файлового ввода/вывода. Этот механизм применяется для:
1. Загрузки и исполнения ехе и dll файлов. Это позволяет экономить на размере страничного файла и на времени, необходимом ОС для подготовки приложения к исполнению.
2. Для доступа к файлу данных, размещённых на диске. Это позволяет обойтись без операций файлового ввода вывода и без предварительной буферизации его содержимого.
3. Для совместного доступа к данным, принадлежащим нескольким процессам.
Рассмотрим механизм проецирования файлов.
1) Создать или открыть объект ядра файл, идентифицирующий файл на диске. Этот файл будет использоваться для проецирования в память. ОС должна хранить данные о рабочих ресурсах. Kernel32 создаёт системную кучу. В этой куче создаются структуры, описывающие все ресурсы системы.
CreateFile(…). Используется как для создания новых, так и для открытия существующих файлов. Результатом работы является дескриптор файла.
таблица дескрипторов база данных файла
Виртуальный адрес объекта |
.
.
.
указатель на объект ядра
Чтобы получить реальный адрес, надо побитно обработать виртуальный адрес с помощью оператора XOR. В результате выполнения первого пункта мы будем знать куда обращаться.
2) Создание объекта ядра проецируемый файл, чтобы сообщить системе размер файла и способ доступа к нему.
CreateFile(…)
CreateFileMapping(…) – создания объекта ядра проецируемый файл. Результатом выполнения является дескриптор объекта ядра проецируемый файл.
3) Выделение региона адресного пространства процесса и проецирование на этот регион файла. Другими словами выделение физической памяти региону.
MapViewOfFile(…). Входными данными для этой функции является дескриптор объекта ядра проецируемый файл, полученный в пункте 2. Результатом выполнения этой функции является витуальный адрес региона.
4) p^[0]:=’a’;
Работа с проецируемым файлом. Когда работа с ним закончена, то необходимо выполнить следующие действия.
5) Сообщить системе об отмене проецирования на адресное пространство процесса объекта ядра проецируемый файл. Выполняется это с помощью функции UnMapViewOfFile(…). Результатом является адрес региона адресного пространства, на который спроецирован файл, то есть адрес, полученный в пункте 3.
6) Закрыть объект ядра файл проецируемый в память.
CloseHandle(…). Параметром является дескриптор в пункте 2.
7) Закрыть объект ядра файл.
CloseHandle(…).
В случае, если не выпонены 6 и 7 в системной куче kernel32 будет содержаться информация о несуществующих объектах.
Дата публикования: 2014-11-03; Прочитано: 421 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!