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

15. При выделении памяти необходимо учитывать следующие ограничения:

— некоторые процессоры старых образцов могут работать только с первыми 16 Мбайт памяти. Если ОС должна поддерживать работу таких процессоров, то это ограничение должно учитываться;

— для современных ОС недостаточно виртуального пространства 2^32 байт, может потребоваться объем виртуального пространства больше этой величины. Очевидно, что работа со старшими адресами этого виртуального пространства должна быть обеспечена особыми способами;

— аппаратные средства работают не с виртуальной, а с физической памятью, поэтому выделение памяти для буферов внешних устройств должно выполняться также особыми средствами.

В связи с вышеизложенными ограничениями вся память делиться на 3 зоны:

- зона памяти до 16 Мбайт — используется старыми устройствами

- зона памяти до (232 - 1) байт включительно, используется разными модулями ОС и приложениями;

-зона памяти, начиная с 232 байт, используется, если ОС и приложения поддерживает 36-битную или 64-битную адресацию.

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

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

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

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

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

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

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

LPVOID VirtualAlloc(

LPVOID lpAddress,

DWORD dwSize,

DWORD flAllocationType,

DWORD flProject );

Где:

lpAddress – определяет начальный адрес выделенной области. Адрес виртуальной памяти выравнивается на границу 64 Кбайт. Если память уже связывается (выделяется физическая память), адрес выравнивается на границе страницы. При первом выделении памяти этот параметр = NULL.

DwSize – размер региона в байтах.

FlAllocationType – тип операции выделения. Можно задать флаг или комбинацию флагов.

Флаг

Назначение

MEM_COMMIT

Выделяет физическую память

MEM_RESERVE

Резервирует виртуальное адресное пространство заданного размера. Зарезервированный диапазон не может использоваться другими функциями

MEM_TOP_DOWN

Выделяется память в верхней области адресного пространства

FlProtect – тип защиты. Для физической памяти могут быть заданы флаги PAGE_GUARD и PAGE_NOCACHE совместно с флагами, определенными ниже.

Флаг

Назначение

PAGE_READONLY

Страница только для чтения. Используется для физической памяти

PAGE_READWRITE

Чтение и запись

PAGE_EXECUTE

Только исполнение програмного кода

PAGE_EXECUTE_READ

Исполнение и чтение

PAGE_EXECUTE_READWRITE

Исполнение, чтение, запись

PAGE_GUARD

Защищенная страница. Любой доступ к странице – ошибка

PAGE_NOACCESS

Выключен доступ к странице, отраженной в физической памяти

PAGE_NOCACHE

Не кэшируется содержимое страницы. Используется в драйверах

PAGE_WRITECOPY

Запись в страницу приводит к тому, что процессу предоставляется личная копия этой страницы физической памяти

PAGE_EXECUTE_WRITECOPY

Любые действия приводят к формированию новой копии

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

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

Ошибка – NULL.

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

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

BOOL VirtualFree(

LPVOID lpAddress,

SIZE_T dwSize,

DWORD dwFreeType); где:

lpAddress – адрес начала освобождаемой памяти;

dwSize – размер области;

dwFreeType – определяет, какая оперция произойдет с памятью (Флаг MEM_RELEASE – страница освобождена; MEM_DECOMMIT – страница зарезервирована, но не используемая). Если задан размер 0, то освобождается вся выделенная память.

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

BOOL VirtualProtect(

LPVOID lpAddress, //адрес

DWORD dwSize, //размер

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

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

Атрибут

);

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

BOOL VirtualLock (

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

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

);

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

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

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