Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Shpora_1-10_bez_vosmogo1 (1).docx
Скачиваний:
4
Добавлен:
16.04.2019
Размер:
133.72 Кб
Скачать

18. Механизмы работы с памятью. Использование виртуальной памяти.

Механизмы работы с памятью:

  1. Виртуальная память (используется для работы с большими объемами памяти);

  2. Отображение файлов на память (используется для быстрой работы с файлом, если необходимо его записиобрабатывать в произвольном порядке, для создания разделяемой памяти между процессами)№

  3. «Кучи» (используются для выделения небольших обьемов памяти в приложении).

Использование виртуальной памяти:

Функция VirtualAlloc предназначена для выделения региона. Так как размер региона и его кратность определена гранулярность (65536), то выделять регион для области памяти размером меньше 65536 не имеет смысла.

LPVOID VirtualAlloc(

LPVOID lpAddress, //начальный адрес выделенной области

DWORD dwSize, //размер региона в байтах

DWORD flAllocationType, //тип операции выделения DWORD flProject //флаг защиты);

Возвращаемое значение:

Успех – адрес памяти.

Ошибка – NULL.

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

Для возврата физической памяти используется функция VirtualFree.

BOOL VirtualFree(

LPVOID lpAddress, // адрес начала освобождаемой памяти

SIZE_T dwSize, // размер области

DWORD dwFreeType // определяет, какая оперция произойдет);

В процессе выполнения программы может потребовать изменение атрибутов защиты. Для изменения атрибутов защиты связанной памяти в процессе выполнения программы используется функция VirtualProtect или VirtualProtectEx (последняя функция позволяет сделать изменение для заданного процесса).

BOOL VirtualProtect(

LPVOID lpAddress, //адрес

DWORD dwSize, //размер

DWORD flNewProtect, //новый атрибут защиты

PDWORD lpflOldProtect, //адрес переменной, куда записывается старый Атрибут);

Как правило, вытесняется страница, которая наиболее долго не использовалась. Некоторые из страниц можно заблокировать функцией VirtualLock.

BOOL VirtualLock (

LPVOID lpAddress, //адрес начала области

DWORD dwSize //раз мер области);

Если для страниц задан режим PAGE_NOACCESS, блокирование невозможно. По умолчанию процесс может максимально блокировать 30 страниц.

Для разблокирования области используется функция VirtualUnlock. Заблокированные страницы автоматически разблокируются при завершении процесса.

19. Механизмы работы с памятью. Отображение файлов на память.

Механизмы работы с памятью:

  1. Виртуальная память (используется для работы с большими объемами памяти);

  2. Отображение файлов на память (используется для быстрой работы с файлом, если необходимо его записиобрабатывать в произвольном порядке, для создания разделяемой памяти между процессами)№

  3. «Кучи» (используются для выделения небольших обьемов памяти в приложении).

В отличие от виртуальной памяти, которой всегда соответствует страничный файл, отображаемой памяти соответствует реальный файл. Используется при интенсивном обращении к файлу. Как только файл отображен на память, можно считать, что он весь в памяти.

Когда нужно использовать:

  1. Загрузка и выполнение исполняемых файлов – время уменьшается за счет того, что не требуется копирование исполняемого файла в память.

  2. Доступ к файлу как к обычной памяти – время уменьшается, так как ОС выполняет управление памятью в наиболее эффективном режиме.

  3. Разделение данных между несколькими процессами.

Объект «Отображаемый файл File Mapping» является объектом ядра, хранится в памяти, доступной всем процессам, и может иметь имя, по которому процессы обращаются к нему.

Общий набор функций по работе с отображаемыми файлами:

Сначала файл открывается с помощью CreateFile(),

HANDLE CreateFile(

LPCTSTR lpFileName, //имя файла

DWORD dwDesiredAccess, //атрибут доступа к файлу

DWORD dwShareMode, //режим совместного использования файла

LPSECURITY_ATTRIBUTES lpSecurityAttributes, //атрибуты защиты

DWORD dwCreationDistribution, // способ открытия файла

DWORD dwFlagsAndAttributes, //атрибут создаваемого файла

HANDLE hTemplateFile // файл шаблона, равен 0);

Если открытие прошло успешно, то идентификатором файла можно воспользоваться для создания отображенного файла CreateFileMapping(),

HANDLE CreateFileMapping(

HANDLE hFile, // дескриптор файла

LPSECURITY_ATTRIBUTES lpAttributes, // защита

DWORD flProtect, // атрибуты защиты

DWORD dwMaximumSizeHigh, // старшее слово размера

DWORD dwMaximumSizeLow, // младшее слово размера

LPCTSTR lpName // имя объекта);

После этого мы получим идентификатор отраженного файла, на основе которого мы можем проецировать файл в память с помощью функции MapViewOfFile().

LPVOID MapViewOfFile(

HANDLE hFileMappingObject, // дескриптор объекта

DWORD dwDesiredAccess, // режим доступа

DWORD dwFileOffsetHigh, // старшее DWORD смещения

DWORD dwFileOffsetLow, // младшее DWORD смещения

SIZE_T dwNumberOfBytesToMap // число отображаемых байтов);

Эта функция даст нам указатель LPVOID, который используется для последующих операций, в том числе и по отмене проецированного файла UnmapViewOfFile()

BOOL UnmapViewOfFile(

LPCVOID lpBaseAddress // начальный адрес отображаемого представления файла, отображение которого должно быть прекращено);

В том случае, если с отображенным файлом будут работать несколько приложений одно приложение создает файл проецированный на память CreateFileMaping(), а остальные открывают эту проекцию OpenFileMapping().

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]