Управление памятью в операционной системе WINDOWS, страница 10

Вызовы для работы с несколькими кучами свободной памяти                Таблица 2.

Функция

Описание

HeapCreate

Создает новую кучу

НеарАllос

Выделяет блок памяти в куче

HeapCompact

Дефрагментирует кучу

HeapDestroy

Уничтожает кучу

HeapFree

Освобождает блок памяти в куче

GetProcessHeap

Возвращает дескриптор стандартной кучи процесса

GetProcessHeaps

Возвращает дескрипторы всех куч

HeapLock

Блокирует доступ к куче для остальных потоков

HeapUnlock

Разрешает нормальный доступ к куче после того, как она была заблокирована при помощи HeapLock

HeapReAlloc

Изменяет размер блока памяти, выделенного в куче

HeapSize

Возвращает размер блока, выделенного в куче

HeapValidate

Тестирует целостность кучи

HeapWalk

Последовательно перебирает блоки памяти, выделенные в куче

ЗАКЛЮЧЕНИЕ

Основной способ управления памятью в Win32 — это системный вызов VirtualAlloc. Этот вызов может оказаться полезным в следующих ситуациях:

·  вы хотите быть уверенным в том, что освобождаемая вами память возвращается под контроль операционной системы;

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

·  некоторый участок выделяемого вами блока памяти или весь блок целиком должен обладать специальным атрибутом (например, только для чтения).

В любом случае вызов VirtualAlloc обычно используется для выделения достаточно больших участков памяти. Минимальный объем памяти, с которым работает VirtualAlloc, называется страницей. Для компьютеров на базе процессоров Intel каждая станица имеет размер 4 Кбайт. Другие компьютеры могут использовать больший размер страницы (определить размер страницы можно при помощи вызова GetSystemInfo).

Использование VirtualAlloc и VirtualFree

Системный вызов VIrtualAlloc принимает четыре аргумента:

·  Линейный адрес выделяемого участка. Этот аргумент может иметь значение NULL в случае, если вы желаете получить память в любом доступном месте адресного пространства,

·  Размер выделяемого блока в байтах. Windows округляет это значение таким образом, чтобы оно соответствовало целому количеству страниц памяти, Другими словами, если вы хотите выделить 1 байт на компьютере архитектуры Intel, функция VIrtualAlloc выделит 4 Кбайт, то есть целую страницу. Если вы запрашиваете 4100 байт, будет выделено 8 Кбайт, то есть две страницы.

·  Режим работы функции. Этот параметр может содержать либо значение МЕМ_СОММ1Т (память выделяется обычным способом), либо значение MEM_RESERVE (происходит резервирование диапазона адресов, но реальная память не выделяется). Любое из этих значений можно использовать совместно с флагом MEM_TOPDOWN, который приказывает Windows выделять память таким образом, чтобы указанный в качестве первого аргумента функции адрес был самым старшим адресом диапазона. Если вы резервируете адресное пространство позже, вы должны вновь обратиться к VirtualAlloc для того, чтобы выделить соответствующую память, иначе вы не сможете сохранить по указанным адресам каких-либо данных. За одну операцию можно выделить участок памяти соответствующий всему зарезервированному диапазону адресов, а можно ограничиться выделением участка, соответствующего только части диапазона.