Подпишитесь на наши новости
Вернуться к началу с статьи up
 

ДИНАМИ́ЧЕСКОЕ РАСПРЕДЕЛЕ́НИЕ ПА́МЯТИ

Авторы: Л. Е. Карпов, А. В. Ермолович (актуализация)

ДИНАМИ́ЧЕСКОЕ РАСПРЕДЕЛЕ́НИЕ ПА́МЯ­ТИ, спо­соб рас­пре­де­ле­ния опе­ра­тив­ной па­мя­ти ЭВМ, при ко­то­ром она вы­де­ля­ет­ся и ос­во­бо­ж­да­ет­ся ком­пи­ля­то­ром или опе­ра­ци­он­ной сис­те­мой по за­про­сам про­грам­мы в хо­де её вы­пол­не­ния. Как пра­ви­ло, Д. р. п. вы­би­ра­ет­ся в тех слу­ча­ях, ко­гда на ста­дии ком­пи­ля­ции не уда­ёт­ся оп­ре­де­лить по­ло­же­ние объ­ек­та (напр., про­це­ду­ры) в не­ко­то­рой об­лас­ти па­мя­ти и/или его раз­мер. Для осу­ще­ст­в­ле­ния Д. р. п. ком­пи­ля­тор ус­та­нав­ли­ва­ет со­от­вет­ст­вие ме­ж­ду лек­сич. еди­ни­ца­ми (иден­ти­фи­ка­то­ры, мет­ки, кон­стан­ты и др.) ис­пол­няе­мой про­грам­мы и ад­ре­са­ми, раз­ме­ра­ми, а так­же ат­ри­бу­та­ми об­лас­тей па­мя­ти (со­во­куп­но­стя­ми объ­е­ди­нён­ных ме­ж­ду со­бой эле­мен­тов па­мя­ти) вы­чис­лит. сис­те­мы, от­ве­дён­ных для хра­не­ния этих лек­сич. еди­ниц при вы­пол­не­нии про­грам­мы. Вы­бор об­лас­ти па­мя­ти и вы­де­ле­ние в ней со­от­вет­ст­вую­щих фраг­мен­тов про­во­дят­ся как для объ­ек­тов дан­ных, так и для вы­пол­няе­мых фраг­мен­тов про­грамм – опе­ра­то­ров, бло­ков, функ­ций и про­це­дур. Уп­рав­ле­ние об­лас­тя­ми па­мя­ти вы­пол­ня­ет­ся опе­рац. сис­те­мой на ос­но­ве ис­поль­зо­ва­ния тех­но­ло­гий вир­ту­аль­ной па­мя­ти с сег­мент­ной, стра­нич­ной или сег­мент­но-стра­нич­ной ор­га­ни­за­ци­ей. В ди­на­мич. об­лас­ти па­мя­ти мо­гут рас­по­ла­гать­ся как зо­ны, вы­де­ляе­мые поль­зо­ва­те­лем (ра­бо­таю­щей про­грам­мой), так и зо­ны, вы­де­ляе­мые ком­пи­ля­то­ром ав­то­ма­ти­че­ски, но и те и дру­гие вы­де­ля­ют­ся в про­цес­се вы­пол­не­ния про­грам­мы.

Су­ще­ст­ву­ют разл. ме­то­ды Д. р. п., наи­бо­лее из­вест­ны­ми из ко­то­рых яв­ля­ют­ся сте­ко­вый и ме­тод про­из­воль­но­го рас­пре­де­ле­ния (рас­пре­де­ле­ние в «ку­че»). При сте­ко­вом ме­то­де Д. р. п. на за­про­сы ре­сур­сов па­мя­ти вы­де­ля­ет­ся не­ко­то­рая об­ласть сво­бод­ной опе­ра­тив­ной па­мя­ти (стек), в ко­то­рой про­во­дит­ся ра­бо­та с фраг­мен­та­ми па­мя­ти по пра­ви­лу «по­след­ний при­шёл – пер­вый вы­шел». Этот ме­тод обыч­но вы­би­ра­ет­ся для вы­де­ле­ния па­мя­ти под ло­каль­ные пе­ре­мен­ные бло­ков и про­це­дур, а так­же под за­пи­си об ак­ти­ва­ции про­це­дур.

При про­из­воль­ном ме­то­де Д. р. п. вы­де­ле­ние и ос­во­бо­ж­де­ние фраг­мен­тов па­мя­ти осу­ще­ст­в­ляют­ся по про­из­воль­ным за­про­сам без к.-л. сис­те­мы. Про­из­воль­ное Д. р. п. мо­жет про­из­во­дить­ся са­мим раз­ра­бот­чи­ком про­грам­мы (т. е. яв­но) или осу­ще­ст­в­лять­ся ав­то­ма­ти­че­ски (т. е. не­яв­но). Д. р. п. для пе­ре­мен­ных, со­зда­вае­мых по яв­но­му за­про­су, раз­ра­ботчик про­во­дит, как пра­ви­ло, с по­мо­щью спец. опе­ра­то­ров или биб­лио­теч­ных функ­ций (напр., опе­ра­то­ры ALLOCATE в язы­ке PL/1, new в Pascal и Сi++, функ­ция malloc в Сi). Эти опе­ра­то­ры и функ­ции, в свою оче­редь, мо­гут ис­поль­зо­вать воз­мож­но­сти опе­рац. сис­те­мы, а мо­гут про­из­во­дить Д. р. п. са­мо­стоя­тель­но, в рам­ках ста­ти­че­ски вы­де­лен­но­го боль­шо­го уча­ст­ка па­мя­ти.

Автоматическое Д. р. п. осуществляется если в программе используются такие операции над данными, которые требуют перераспределения памяти, а сами операторы перераспределения в программе отсутствуют [напр., операция слияния значений (конкатенации) строковых переменных в языке Basic или в языке Object Pascal]. Также автоматически проводится управление сегментами и страницами памяти в операц. системах, которые для этого могут пользоваться аппаратной поддержкой. При применении метода произвольного Д. р. п. возникает серьёзная проблема освобождения памяти и повторного использования освобождённых фрагментов (т. к. моменты возврата памяти не всегда очевидны, а порядок возврата памяти непредсказуем), которая имеет разл. решения в зависимости от метода выделения участков памяти. Напр., производится периодическая «сборка мусора» (англ. Garbage Collection) – выделенная ранее память пересматривается с целью обнаружения неиспользуемых фрагментов, а высвобожденная память передаётся для повторного использования. Однако этот метод требует либо явной поддержки со стороны языка программирования (напр., Java), либо специализированного оборудования с тегированием указателей в памяти (напр., контекстная защита в семействе ЭВМ «Эльбрус»). Произвольное Д. р. п. также чревато фрагментацией доступной ОП, приводящей к невозможности выделения фрагмента памяти запрашиваемого размера несмотря на превосходящий его объём свободной памяти в системе ввиду раздробленности этого объёма на множество составляющих меньшего, нежели запрашиваемый, размера. Проблему можно решить при помощи компактировки занимаемой памяти, что, однако, также требует явной поддержки со стороны языка программирования либо специализированного оборудования. Аналогичная проблема в терминах физической, а не математической памяти решается за счёт использования механизма виртуальной памяти либо сегментации (ныне практически не используется).

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

Лит.: Таненбаум А. Современные операционные системы. 2-е изд. СПб., 2002; Гордеев А. В., Молчанов А. Ю. Системное программное обеспечение. СПб., 2003.

  • ДИНАМИ́ЧЕСКОЕ РАСПРЕДЕЛЕ́НИЕ ПА́МЯТИ способ распределения оперативной памяти ЭВМ, при котором она выделяется и освобождается компилятором или операционной системой по запросам программы в ходе её выполнения (2007)
Вернуться к началу