Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
sp.docx
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
213.38 Кб
Скачать

38. Динамическое распределение памяти программами (heap). HeapApiWin32.

Как правило, библиотечные функции работы с памятью используют т.н. "кучу", или heap – область, специально предназначенную для этой цели. Память, выделенная в "куче", должна быть защищена от повторного выделения средствами ОС для предотвращения конфликтов с другими программами. Как правило, память, выделенная в "куче", автоматически освобождается по завершении программы. DOS не предоставляет никаких стандартных средств поддержки "кучи", поэтому все функции должна выполнять сама прикладная программа. В том или ином виде эта возможность имеется в большинстве систем программирования. Обычно создание "кучи" и управляющих структур выполняет "прикладной" загрузчик, а доступ к ней обеспечивают библиотечные функции.

Функции работы с кучами (heap-область)

Т.н. “куча” (heap) – динамически распределяемая область данных, предоставленная процессу. По умолчанию размер кучи составляет 1 Мбайт, но он может быть изменен параметром /HEAP при построении исполняемого модуля.

Куча идентифицируется ее описателем (handle), посредством которого осуществляется доступ к ней. Каждому создаваемому процессу обязательно выделяется одна основная куча (куча “по умолчанию”), описатель которой возвращает функция:

HANDLE GetProcessHeap(VOID).

Для работы с кучей предназначены следующие основные функции.

LPVOID HeapAlloc(hHeap,dwFlags,dwSize) – выделение блока памяти заданного размера из кучи (возвращает указатель на этот блок в адресном пространстве кучи).

LPVOID HeapReAlloc(hHeap,dwFlags,lpOldBlock,dwSize) – изменение размера выделенного блока памяти (при этом блок может быть перемещен, если в куче нет места для простого расширения).

BOOL HeapFree(hHeap,dwFlags,lpBlock) – освобождение ранее выделенного блока памяти в куче.

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

– защиты друг от друга различных структур данных.

– повышения эффективности управления памятью.

– уменьшения рабочего множества процесса.

Кратко поясним последние два положения.

Хотя в системах со страничной организацией отсутствует проблема фрагментации физической памяти, сохраняется проблема фрагментации адресного пространства. Если эта проблема не актуальна в полном адресном пространстве (4 Гбайт), то в пространстве кучи (стандартно 1 Мбайт) она существенна. Если элементы структур данных различаются по размеру, то полезно размещать эти структуры в разных кучах.

Работа с разными структурами данных, в соответствии с принципом локальности, чаще всего происходит не одновременно. Границы элементов разных структур не выровнены на границу страницы, поэтому обращение к одной структуре вызывает подкачку всей страницы вместе с другими структурами, что увеличивает рабочее множество процесса.

Для создания дополнительной кучи используется функция:

HANDLE HeapCreate(DWORD dwFlags,DWORD dwInitSize,DWORD dwMaxSize)

Более подробная информация об этих и других функциях для работы с кучами содержится в соответствующей документации.

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