2. Восстановление памяти. Память, которая была распределена и использова лась в течение какого-то времени, после того как занимающий ее объект пе рестал быть нужным, должна быть восстановлена для повторного использо вания. Восстановление памяти может быть очень простым, как в случае перемещения указателя стека, или очень сложным, как в случае сбора мусора.
3. Уплотнение и повторное использование. Восстановленная память может быть сразу же повторно использована, но может потребоваться и процедура ее уплотнения — построение более крупных блоков свободной памяти из ма леньких. Повторное использование памяти обычно подразумевает приме нение тех же механизмов, что и при начальном распределении.
В настоящее время известны и используются в реализациях языков много различных методов управления памятью. В данной книге невозможно рассказать обо всех таких методах, но для того, чтобы получить представление об основных принципах, достаточно познакомиться с отдельными примерами. Большинство используемых методов являются всего лишь вариациями какого-либо из рассматриваемых ниже основных методов.
10.3. Статическоеуправлениепамятью
Простейший способ распределения памяти — это статическое распределение, то есть распределение во время трансляции, которое остается неизменным во время
464
Глава 10. Управление памятью
выполнения. Обычно для сегментов кода пользовательских и системных программ, а также для буферов ввода-вывода и различных системных данных память распределяется статически. Такое распределение памяти не требует выполнения каких-либо действий по управлению памятью во время выполнения программы, и конечно, в таком случае вопросы восстановления и повторного использования памяти отпадают.
В обычной реализации FORTRAN вся память распределяется статически. Каждая подпрограмма компилируется отдельно, при этом компилятор создает сегмент кода (включая запись активации), содержащий скомпилированную программу, ее области данных, временные переменные, точку возврата, а также различные системные данные. Загрузчик выделяет пространство в памяти для этих скомпилированных блоков во время загрузки, так же как и для системных программ, необходимых во время выполнения. Во время выполнения программы не требуется никакого управления памятью.
Статическое распределение памяти эффективно, так как не требует дополни-тельных временных и пространственных затрат на управление памятью в процессе выполнения. Транслятор может непосредственно сгенерировать l-значения (адреса) для всех элементов данных. Однако статический метод несовместим с рекурсивным вызовом подпрограмм, со структурами данных, чьи размеры зависят от входных или вычисляемых в программе данных, а также со многими другими желательными возможностями языка. В следующих разделах этой главы мы обсудим различные методы динамического (во время выполнения) управления памятью. Читатель тем не менее не должен упускать из виду важность статического распределения памяти. Два широко используемых языка программирования, FORTRAN и COBOL, разработаны в расчете на исключительно статическое распределение памяти (хотя, как было уже сказано, теперь FORTRAN 90 позволяет использовать динамические массивы и рекурсивные процедуры). В языках, подобных С, которые используют динамическое распределение памяти, допускается также и статическое управление для повышения эффективности.
10.4. Управлениекучей
Третий основной вид управления памятью после стекового и статического называется управлением кучей. Куча — это блок памяти, области которого выделяются и освобождаются некоторым относительно произвольным образом. В этом случае проблемы выделения, восстановления, уплотнения и повторного использования памяти могут стать весьма серьезными. Не существует какого-либо одного метода управления кучей; скорее, следует говорить о наборе методов для регулирования различных аспектов управления при такой организации памяти.
Необходимость в куче возникает тогда, когда язык позволяет распределять и освобождать память в произвольных точках выполнения программы, а также тогда, когда язык предоставляет средства для создания, разрушения и расширения пользовательских структур данных в произвольных местах программы. Например, в ML в любой момент можно объединить два списка в один или динамически определить новый тип данных. В LISP в любой точке программы к существующему
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.