Управление памятью

Страницы работы

6 страниц (Word-файл)

Содержание работы

Глава 10. Управление памятью

В главе 9 мы обсуждали стековую структуру управления подпрограммами. Но в большинстве языков также имеется возможность динамически выделять и освобождать память для объектов данных некоторым произвольным образом. Говорят, что для таких объектов память выделяется из кучи. Во многих реализациях стек начинается с одного конца памяти компьютера, а куча — с другого. Если эти две структуры — стек и куча — когда-либо встречаются, то программе не хватает памяти и она останавливается. В этой главе мы обсудим различные методы управления кучей, обусловленные требованиями, предъявляемыми к языку программирования. Управление памятью для хранения данных является одной из основных забот программиста, разработчика языка и разработчика транслятора. В этой главе рассматриваются различные проблемы и методы управления памятью.

В типичных языках мы находим множество особенностей или ограничений, которые можно объяснить только желанием разработчиков применить тот или иной метод управления памятью. Рассмотрим, например, язык FORTRAN, в котором запрещаются рекурсивные вызовы подпрограмм. Рекурсивные вызовы можно было бы допустить в FORTRAN, даже не меняя его синтаксис, но реализация таких вызовов потребовала бы наличия стека точек возврата во время выполнения, а эта структура данных требует динамического управления памятью. FORTRAN, в котором запрещен рекурсивный вызов подпрограмм, может быть реализован с использованием только статического управления памятью. Огромная разница между последним стандартом этого языка, FORTRAN 90, и предыдущими версиями заключается как раз в том, что в FORTRAN 90 допускается (в ограниченном объеме) динамическое распределение памяти. Pascal был специально разработан таким образом, чтобы управление памятью основывалось на использовании стеков, LISP — чтобы допускался сбор мусора и т. д.

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

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



460


Глава 10. Управление памятью



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

10.1. Размещаемыевпамятиэлементы

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

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

Информация о работе