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

3.8 Динамическое распределение памяти

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

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

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

В таких случаях постраничное распределение памяти становится малоэффективным, и прибегают к альтернативному механизму распределения памяти – динамическому распределению памяти из кучи (большого пула памяти, заранее зарезервированного в виртуальном адресном пространстве).

Рассмотрим наиболее распространенные алгоритмы, используемые для целей динамического распределения памяти.

Куча (heap)

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

В таком случае более целесообразным становится сначала выделить стандартными механизмами виртуальной памяти один блок памяти достаточно большого размера, а затем, по мере необходимости, выделять из него участки памяти требуемого размера. Область памяти в адресном пространстве процесса, предназначенная для целей динамического выделения из нее по запросам программы блоков памяти меньшего размера, называется кучей (heap).

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

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

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