![]() |
Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | |
|
Администратор кучи – служебная программа, которая автоматически пристыковывается к программе пользователя во время компоновки и управляет взаимодействием программы пользователя с кучей. Администратор кучи обрабатывает запросы на выделение и освобождение памяти, определение размера свободной памяти и т.п, используя для этого стандартные указатели, которые определены в модуле SYSTEM Turbo Pascal (рис. 42):
HeapOrg – указатель на начало кучи,
HeapEnd – указатель на верхнюю границу кучи,
HeapPtr – указатель на нижнюю границу свободного пространства
кучи,
FreeList – указатель на список свободных участков кучи.
Рис. 42. Распределение области памяти кучи
Каждый свободный блок описывается дескриптором, имеющим следующую структуру:
Type PFreeRec = ^ TFreeRec;
TFreeRec = record
next: pointer;
size: pointer
end;
Var FreeList: PFreeRec;
Т.о., указатель FreeList указывает на дескриптор первого свободного блока в куче. Данная списочная структура предназначена для описания всех свободных блоков памяти, которые расположены ниже границы HeapPtr. Происхождение блоков связано со случайной последовательностью запросов на выделение / освобождение памяти в процессе выполнения программы. Поле next в записи TFreeRec указывает на дескриптор следующего по списку свободного блока кучи или содержит адрес, совпадающий с HeapEnd, если этот участок последний в списке. Поле size содержит размер свободного блока (в байтах), представленный в ненормализованном виде, или 0, если ниже адреса, содержащегося в HeapPtr, нет свободных блоков. Ненормализованная длина определяется так: в старшем слове поля size содержится число свободных параграфов, т.е. участков размером 16 байт, а в младшем слове - число байт в диапазоне 0..15.
Сразу после загрузки программы указатели HeapPtr и FreeList содержат один и тот же адрес, который совпадает с началом кучи и находится в HeapOrg. При этом в первых восьми байтах кучи хранится запись, соответствующая типу TFreeRec (поле next содержит адрес, совпадающий со значением HeapEnd, а поле size – нулевое значение) (рис. 43).
Рис. 43. Распределение области памяти кучи после загрузки программы
После выполнения серии запросов на выделение памяти область кучи будет распределена следующим образом (рис. 44):
Дата публикования: 2014-11-26; Прочитано: 525 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!