Распределитель памяти GsvHeap

Последнее обновление: 14 января 2005

Распределитель памяти TGsvHeap реализует кучу, из которой можно выделять память кусочками любого размера, но освобождать можно только всю кучу целиком. Внутренний алгоритм работы распределителя основан на выделении памяти непосредственно от операционной системы (минуя распределитель памяти Delphi) большими блоками (минимум 64 кб). Скорость выделения небольших кусочков памяти очень высокая и сводится, фактически, к увеличению указателя свободного места, подобно тому, как это происходит в распределителе памяти .NET. Основная мотивация разработки кучи - получение максимально высокой скорости выделения памяти кусками произвольной длины. Куча без частичного возврата памяти позволяет не заботиться об освобождении выделенных кусков памяти и может быть основой для создания в приложении инфраструктуры сборки мусора.

Подробности алгоритма выделения памяти

При выделении памяти анализируется размер свободной области последнего выделенного блока. Если размер свободной области меньше, чем требуемый размер памяти, то выделяется новый блок. Память, остающаяся в предыдущем блоке, теряется для распределения. Размер нового блока должен удовлетворять критериям:

Параметр MinSize
выбирается с учетом максимального прогнозируемого размера кучи и максимального прогнозируемого размера куска выделяемой памяти. MinSize должен быть намного больше максимального прогнозируемого размера - это позволит уменьшить потери в конце блоков. С другой стороны, слишком большой MinSize может оказаться очень расточительным.
Параметр Align
позволяет выравнивать выделяемую память по границе 1, 2, 4 или 8 байт для ускорения последующего доступа к этой памяти.
Параметр Boost
позволяет задать алгоритм форсированного блочного выделения памяти. При обычном выделении размер нового блока устанавливается большим или равным минимальному размеру блока. При форсированном выделении размер нового блока устанавливается большим или равным общему размеру кучи. При обычном выделении размер кучи увеличивается в арифметической прогрессии, а при форсированном - в геометрическом.
Параметр TotalSize
содержит суммарный объем памяти для кучи, выделенный от операционной системы, то есть, суммарный размер блоков.

Основной метод класса TGsvHeap - функция Alloc

Alloc(aSize: Cardinal): Pointer

Эта функция возвращает указатель на кусок памяти указанного размера, выровненного с учетом параметра Align. При необходимости функция выделяет новый блок. Функция AllocCopy не только выделяет память нужного размера, но и также копирует в него переданные данные. Дополнительно в классе имеются перегруженные функции выделения-копирования памяти для строк. Распределитель существует в двух вариантах - однопоточном и многопоточном.

Download

Downloaddelphiheap.zip - Исходные тексты (3K).