Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Функции менеджера памяти Windows






Для выделения регионов памяти в Windows используется функция VirtualAlloc. Эта функция может решать две задачи – резервирование региона памяти за приложением и передача физической памяти зарезервированному региону.

LPVOID VirtualAlloc(

LPVOID lpAddress, // region to reserve or commit

SIZE_T dwSize, // size of region

DWORD flAllocationType, // type of allocation

DWORD flProtect // type of access protection

);

Параметр flAllocationType определяет, какую операцию необходимо выполнить. Основными значениями этого параметра являются MEM_RESERVE – резервирование региона памяти за приложением и MEM_COMMIT – передать физическую память зарезервированным страницам. Оба эти параметра можно указать одновременно.

С помощью параметров lpAddress и dwSize можно задать адрес начала и размер области, которую следует зарезервировать или выделить. В случае если расположение региона памяти не принципиально, в качестве значения lpAddress можно задать NULL. Однако если вы запрашиваете выделение страниц памяти под заранее зарезервированную область, то адрес указывать обязательно.

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

Параметр flProtect позволяет задать тип доступа к выделяемой памяти. Он может принимать следующие значения, соответствующие правам доступа к памяти Windows: PAGE_READONLY, PAGE_READWRITE, PAGE_EXECUTE, PAGE_EXECUTE_READ, PAGE_EXECUTE_READWRITE, PAGE_GUARD, PAGE_NOACCESS, PAGE_NOCACHE.

Функция VirtualAlloc возвращает базовый адрес блока, который был зарезервирован или выделен. В случае ошибки она возвращает значение NULL.

Вернуть физическую память или освободить зарезервированный регион можно с помощью функции VirtualFree:

BOOL VirtualFree(

LPVOID lpAddress, // address of region

SIZE_T dwSize, // size of region

DWORD dwFreeType // operation type

);

Также как в случае VirtualAlloc можно указать необходимую операцию с помощью параметра dwFreeType. Значение MEM_DECOMMIT говорит о том, что необходимо освободить физическую память внутри зарезервированного региона, MEM_RELEASE – о том, что необходимо снять резервирование.

При освобождении страниц можно указать адрес и размер освобождаемой области, используя параметры lpAddress и dwSize. При этом освобождаемый регион также будет расширен до границы страниц, на которые он попадает. Снятие резервирования возможно только целиком для всего блока, как он был зарезервирован. Размер блока при этом указывать не надо.

Функция возвращает логическое значение, которое говорит об успешности выполнения операции.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.