![]() |
Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | |
|
HeapDestroy(…). Проблема состоит в том, что 1.куча должна быть свободной, то есть CriticalSection=0. 2. куча может иметь подкучи.
Необходимо удалить весь список связанных подкуч. Windows поддерживает связанный список кучи, то есть HeapDestroy(…) должна выполнять действия по корректировке списка.
Выделение блока памяти в определённой куче.
HeapAlloc(…). Этот процесс состоит из следующих этапов.
1. проверки параметров функции HeapAlloc(…).
2. захват CriticalSection заголовка кучи.
3. выравнивание размера запрошенного блока к ближайшему числу кратному 4 и добавление размера арены. К каждому из 4-х списков относится запрошенный блок. 84 байта, 20h, 80h, 200h.
4. нахождение первого свободного блока в списке. Если блок найден, то функция проверяет насколько этот блок велик, нельзя ли его поделить на 2. Если можно, то создаются 2 блока, настраиваются их арены. Первый блок занят функцией HeapAlloc(…), другой поступает в список свободных блоков.
5. освобождение критической секции. Указатель кучи устанавливается на первый байт следующего за ареной блока. Если функция не найдёт в списке подходящего свободного блока, то kernel32 создаёт подкучу, настраивает её заголовок, вставляет подкучу в список подкуч, а затем функция HeapAlloc(…) возвращается к поиску свободных блоков.
Освобождение блока кучи. HeapFree(…).
1. проверка параметров.
2. захват CriticalSection.
3. если перед освобождаемым блоком уже есть свободный блок, то они сливаются в один.
4. фактическое освобождение блока, возврат его в кучу.
5. освобождение CriticalSection.
10. Куча, предоставляемая процессу по умолчанию, и дополнительные кучи. Назначение дополнительных куч Win32.
Мы рассматривали функции для работы с виртуальной памятью. Для работы с небольшими областями памяти используются кучи.
Дата публикования: 2014-11-03; Прочитано: 376 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!