Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Shpory_tyap (1).doc
Скачиваний:
40
Добавлен:
17.04.2019
Размер:
1.05 Mб
Скачать

26. Управление кучей.

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

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

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

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

Управление кучей фиксированного размера.

Пусть элементы фиксированного размера, размещенные в куче и позднее утилизируемые, занимает каждый по N слов памяти. Обычно N бывает = 1 или 2. Предполагая, что куча занимает непрерывный блок памяти, разобьем этот блок на k элементов длиной N: каждый, где k*N = длине всего блока. Это разбиение кучи на k элементов фиксированного размера образует основу метода управления кучей. Когда требуется элемент, то выделяется в куче один из элементов на которые она разбита.

Можно было бы выполнить начальное распределение памяти из кучи с помощью простого указателя, аналогично указателю стека. Указатель в куче !!! будет указывать на следующий свободный элемент кучи. Каждый раз, когда требуется новый элемент, указатель продвигается на следующий элемент, а указатель на предыдущий элемент возвращается в качестве адреса области, которую можно использовать. Но такой указатель совершенно бесполезен при освобождении элемента, так как он будет в общем случае лежать в некотором производственном месте занятой части кучи.

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

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

В общем случае свободные элементы разбросаны по куче некоторым случайным образом и перемешаны с используемыми в данный момент элементами.

Обычные метод состоит в организации связанного списка свободных элементов — списка свободного пространства.

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

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]