|
Администратор кучи – служебная программа, которая автоматически пристыковывается к программе пользователя во время компоновки и управляет взаимодействием программы пользователя с кучей. Администратор кучи обрабатывает запросы на выделение и освобождение памяти, определение размера свободной памяти и т.п, используя для этого стандартные указатели, которые определены в модуле SYSTEM Turbo Pascal: HeapOrg – указатель на начало кучи, HeapEnd – указатель на верхнюю границу кучи, HeapPtr – указатель на нижнюю границу свободного пространства кучи, FreeList – указатель на список свободных участков кучи. Каждый свободный блок описывается дескриптором, имеющим следующую структуру:
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 – нулевое значение). При работе с кучей указатели HeapPtr и FreeList будут иметь одинаковые значения до тех пор, пока в куче не образуется хотя бы один свободный блок ниже границы, содержащейся в указателе HeapPtr. Как только это произойдет, указатель FreeList станет ссылаться на начало этого блока, а в первых восьми байтах освобожденного участка памяти будет размещен дескриптор, т.е. запись TFreeRec.
|