Динамическое распределение памяти
ДИНАМИЧЕСКОЕ РАСПРЕДЕЛЕНИЕ ПАМЯТИ, способ распределения оперативной памяти ЭВМ, при котором она выделяется и освобождается компилятором или операционной системой по запросам программы в ходе её выполнения. Как правило, динамическое распределение памяти выбирается в тех случаях, когда на стадии компиляции не удаётся определить положение объекта (например, процедуры) в некоторой области памяти и/или его размер. Для осуществления динамического распределения памяти компилятор устанавливает соответствие между лексическими единицами (идентификаторы, метки, константы и др.) исполняемой программы и адресами, размерами, а также атрибутами областей памяти (совокупностями объединённых между собой элементов памяти) вычислительной системы, отведённых для хранения этих лексических единиц при выполнении программы. Выбор области памяти и выделение в ней соответствующих фрагментов проводятся как для объектов данных, так и для выполняемых фрагментов программ-операторов, блоков, функций и процедур. Управление областями памяти выполняется операционной системой на основе использования технологий виртуальной памяти с сегментной, страничной или сегментно-страничной организацией. В динамической области памяти могут располагаться как зоны, выделяемые пользователем (работающей программой), так и зоны, выделяемые компилятором автоматически, но и те и другие выделяются в процессе выполнения программы.
Реклама
Существуют различные методы динамического распределения памяти, наиболее известными из которых являются стековый и метод произвольного распределения (распределение в «куче»). При стековом методе динамического распределения памяти на запросы ресурсов памяти выделяется некоторая область свободной оперативной памяти (стек), в которой проводится работа с фрагментами памяти по правилу «последний пришёл - первый вышел». Этот метод обычно выбирается для выделения памяти под локальные переменные блоков и процедур, а также под записи об активации процедур.
При произвольном методе динамического распределения памяти выделение и освобождение фрагментов памяти осуществляется по произвольным запросам без какой-либо системы. Произвольное динамическое распределение памяти может производиться самим разработчиком программы (т. е. явно) или осуществляться автоматически (т. е. неявно). Динамическое распределение памяти для переменных, создаваемых по явному запросу, разработчик проводит, как правило, с помощью специальных операторов или библиотечных функций (например, операторы ALLOCATE в языке PL/1, new в Pascal и Ci++, функция malloc в Ci). Эти операторы и функции, в свою очередь, могут использовать возможности операционной системы, а могут производить динамическое распределение памяти самостоятельно, в рамках статически выделенного большого участка памяти.
Автоматическое динамическое распределение памяти осуществляется, если в программе используются такие операции над данными, которые требуют перераспределения памяти, а сами операторы перераспределения в программе отсутствуют [например, операция слияния значений (конкатенации) строковых переменных в языке Basic или в языке Object Pascal]. Также автоматически проводится управление сегментами и страницами памяти в операционных системах, которые для этого могут пользоваться аппаратной поддержкой.
При применении метода произвольного динамического распределения памяти возникает серьёзная проблема освобождения памяти и повторного использования освобождённых фрагментов (т. к. моменты возврата памяти не всегда очевидны, а порядок возврата памяти непредсказуем), которая имеет различные решения в зависимости от метода выделения участков памяти. Например, выделенная ранее память пересматривается с целью обнаружения неиспользуемых фрагментов, а высвобожденная память передаётся для повторного использования.
Лит.: Таненбаум А. Современные операционные системы. 2-е изд. СПб., 2002; Гордеев А. В., Молчанов А. Ю. Системное программное обеспечение. СПб., 2003.
Л. Е. Карпов.