Управление памятью, страница 2

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

+ Определяемые пользователем структуры данных и константы. Для всех структур данных, объявленных в пользовательских программах или созданных ими, включая константы, требуется выделить место в памяти.

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

+ Среды ссылок. Размещение сред ссылок (ассоциаций идентификаторов) во время выполнения программы может потребовать значительных ресурсов памяти, как, например, для А-списка в языке LISP (приложение, раздел П.6).


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


461


+ Временная память для вычисления выражений. При вычислении выражений необходимо использовать определяемую системой временную память для хранения промежуточных результатов вычисления. Например, при вычислении выражения (х + у) х (u + v) может возникнуть необходимость сохранения результата первого сложения во временной памяти, пока будет вычисляться второе сложение. Если в выражении присутствуют рекурсивные вызовы функций, для хранения промежуточных результатов на каждом уровне рекурсии может потребоваться потенциально неограниченный объем временной памяти.

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

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

+ Различные системные данные. В реализации почти каждого языка требуется память для хранения различных системных данных: таблиц, информации о состоянии устройств ввода-вывода и другой разнообразной информации о состоянии (например, счетчики ссылок или биты сбора мусора).

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

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

+ Операции создания и уничтожения структур данных. Если в языке предусмотрены операции, позволяющие в произвольной точке программы (а не только на входе в подпрограмму) создавать новые структуры данных (например, операция new в языке Java), то эти операции обычно требуют выделения памяти отдельно от той, которая выделяется при входе в подпрограмму. Язык может также предоставлять явные операции уничтожения ранее созданных структур данных, например функции dispose в Pascal и free в С, которые могут потребоваться для освобождения выделенной под какие-то структуры данных памяти. В Java такая явная операция отсутствует; для этого предназначен процесс сбора мусора.

+ Операции вставки и удаления компонентов. Если язык предоставляет операции вставки и удаления компонентов структур данных, то для их реализа-


462


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



ции может потребоваться выделение и освобождение памяти (например, функция push в языке Perl добавляет элемент к массиву).