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

Структура арены.

Арена в занятых блоках. Начинается с поля длины блока. Затем в некоторых версиях Windows кроме длины блока могут указываться значения счётчика команд перед обращением к куче.

Арена в свободных блоках. SIZE – размер PREV – указатель на пустой свободный блок. NEXT – указатель на следующий свободный блок, то есть свободные блоки связаны в цепочки.

Функции управления кучей Win32.

GetProcessHeap(…) – получить дескриптор кучи, предоставляемый процессу по умолчанию. Эта функция находит PDB и извлекает из базы данных дескриптор кучи.

HeapCreate(…) – создание кучи. Вызывают не только приложения пользователя, но и kernel32.dll и user32.dll вызывает для создания системных структур данных, например PDB или базы данных потока (TDB).

Процесс создания кучи проходит в 2 этапа:

  1. резервирование памяти для кучи и связывание кучи в списке куч процесса.

  2. инициализация всех полей заголовка кучи.

Функция HeapCreate(…) проверяет корректность параметров. Округляет границу кучи до ближайшего целого числа кратного 4 Кб.

Удаление кучи.

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.

  1. Куча, предоставляемая процессу по умолчанию, и дополнительные кучи. Назначение дополнительных куч Win32.

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

Дополнительные кучи Win32 процесса.

Создаются по следующим причинам:

  1. для защиты компонентов кучи.

  2. для более эффективного управления памятью.

  3. для локализации доступа.

Рассмотрим вариант 1. Пусть есть 2 потока:

A3

B1

A2

B2

B3

A1

Thread1 – Func1 – A

Thread2 – Func2 – B

куча

Имеется ошибка в программном коде Func1, которая приводит к тому, что после заполнения А1 записывается несколько дополнительных байт. Будут запорчены данные В3.

Программист сделает предположение, что ошибка в коде функции Func2. А если бы использовались 2 разные кучи, то локализовать ошибку легче.

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