- •Глава 2. Информационные структуры
- •2.1. Линейные списки
- •2.2. Хранение линейных списков
- •2.3. Циклические списки
- •2.4. Массивы
- •2.4.1. Классификация и преобразование массивов
- •2.4.2. Адресация массивов
- •2.4.3. Представление разреженных матриц
- •2.5.1. Исходные понятия
- •2.5. Деревья
- •2.5.2. Бинарные деревья
- •2.5.3. Обход бинарных деревьев
- •2.6. Динамическое распределение памяти
2.6. Динамическое распределение памяти
Представление динамических массивов — частный случай динамического распределения памяти, когда несколько объектов (списков, массивов, файлов) могут независимо расти или уменьшаться в области общего пула памяти. Обычно элементы (узлы) этих объектов имеет разный размер, и желательны технологии для резервирования и освобождения блоков переменного размера в большой области памяти из последовательных ячеек.
Технология резервирования памяти. После нескольких актов занятия/освобождения ячеек в общем пуле памяти, последний, будучи изначально сплошным, приобретает «пунктирный» вид, когда по мере возрастания адресов свободные сплошные — не закрашенные — участки чередуются с занятыми, закрашенными (рис. 21). Технология резервирования в таком фрагментированном пуле должна решать две задачи:
(а) фиксация фрагментации пула в памяти компьютера;
(б) построение
подходящего алгоритма поиска свободного
блока из
последовательных ячеек при заданном
.

Рис. 21.
Задача (а) решается путём поддержания списка свободной памяти в определённом месте; чаще всего такой список содержится в том же общем пуле, подлежащем динамическому распределению. Первое слово каждой свободной области памяти содержит размер области и адрес первого слова следующей свободной области. Свободные области при адресации могут быть связаны в порядке возрастания или убывания размера, либо в порядке возрастания адресов, либо в произвольном порядке.
Алгоритм решения
задачи (б): если необходима свободная
область размера
,
то находится область, у которой размер
,
её размер уменьшается до
,
и соответствующим образом изменяется
адрес новой, уменьшенной свободной
области в согласии с принятым способом
упорядочивания. Выбор свободной области
размера
может осуществляться двумя наиболее
распространёнными способами:
1) Метод
наилучшего подходящего блока
— выбирается блок с наименьшим
допустимым размером
.
Это предполагает просмотр всего списка
свободной памяти и соответствующих
затрат машинного времени. Идеология
метода — сохранение бóльших свободных
областей «на потом», с целью уменьшения
фрагментации общего пула памяти.
Недостатком метода является тенденция
к увеличению количества свободных
блоков малого размера.
2) Метод
первого подходящего блока
— выбирается первый
встретившийся в списке
блок с допустимым размером
.
Технология высвобождения памяти. Когда необходимость в выделенном блоке отпадает, он должен быть возвращён в список свободного пространства. Здесь обычно используются два подхода:
1) Сборка мусора — список свободного пространства не изменяется вплоть до тех пор, пока пул не окажется заполненным; после этого строится новый список.
Недостатком метода является тенденция к замедлению работы при почти заполненном пуле совместно используемой памяти. Кроме того, фактически освободившаяся, но неучтенная как свободная, область памяти, вынуждает алгоритм резервирования занимать часть свободной памяти в другом месте, увеличивая фрагментацию пула.
2) Уплотнение — немедленный возврат и слияние освобождённых областей. Все занятые блоки перемещаются в соседние позиции, после чего вся свободная область оказывается одним сплошным блоком.
Недостатком этой технологии является увеличение затрат времени на перемещение задействованных блоков и изменение указателей связи.
