Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 700363.doc
Скачиваний:
16
Добавлен:
01.05.2022
Размер:
3.69 Mб
Скачать

Алгоритмы динамического распределения памяти

Для выделения памяти в куче могут быть использованы алгоритмы, построенные на любой из рассмотренных ранее стратегий размещения, например на методе первого подходящего или следующего подходящего. Для этого требуется только, чтобы в куче был в том или ином виде реализован список свободных блоков.

Реализовать такой список, используя для хранения ссылок на элементы списка память самих же свободных блоков, не представляет особого труда, например, как показано на рис. 55.

Рис.55. Построение списка свободных блоков за счет использования памяти самих же свободных блоков

Просматривая такой список свободных блоков, можно без труда выбрать подходящий, блок в соответствии с заданной стратегией размещения. Однако, основные трудности при работе с кучей связаны не с выделением памяти, а с ее освобождением. Главная проблема состоит в необходимости выполнять объединение примыкающих свободных блоков, если таковые появляются в ходе освобождения памяти.

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

Для разрешения противоречия между необходимостью слияния свободных блоков и желанием ускорить операции с памятью, может быть предложено два решения:

  1. отложить объединение свободных блоков кучи до момента, пока не будет получен отказ при очередном запросе на выделение памяти, а затем объединить все примыкающие блоки за один просмотр списка;

  1. оптимизировать структуру списка свободных блоков, чтобы упростить объединение примыкающих свободных блоков.

Отложенное объединение свободных блоков

Откладывание сложной процедуры объединения примыкающих свободных блоков до момента, когда это действительно станет необходимым, позволяет заметно сократить общее время, затраченное на освобождение памяти. Выигрыш в производительности достигается за счет того, что многие освобожденные блоки могут быть повторно использованы для выделения памяти, пока в результате многократных выделений освобождений памяти куча не будет фрагментирована до очень малых блоков.

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

Отложенные (их часто называют ленивые) алгоритмы находят широкое применение в современных операционных системах для самых разных целей.

Однако расплатой за применение отложенного объединения свободных блоков является возможность длительной задержки выделения памяти, возникающей время от времени, когда запрос на выделение памяти не может быть выполнен сразу ввиду фрагментации кучи, и понадобится выполнить объединение свободных блоков кучи.

Поэтому, даже при использовании отложенного объединения свободных блоков, оптимизация структуры списка свободных блоков, позволяющая ускорить процедуру слияния соседних свободных блоков, является целесообразной.

В заключение, отметим еще один недостаток ленивого алгоритма. При использовании отложенного объединения свободных блоков, увеличивается длина списка свободных блоков кучи, что может увеличить время выделения памяти.