Разработка компиляторов

       

Фазы управления памятью


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

  • Начальное выделение памяти
  • Утилизация памяти
  • Уплотнение и повторное использование

Во время начального распределения памяти необходимо разметить всю память как свободную либо используемую в каких-то целях. Кроме того, необходимо каким-то образом учитывать свободную память. Далее, система должна обнаруживать фрагменты памяти, которые были использованы, но уже стали ненужными. Такие фрагменты подлежат утилизации для дальнейшего повторного использования. Утилизация может быть как простой (в тех случаях, когда освобождаемые участки памяти смежны и непрерывны), так и достаточно сложной (в тех случаях, когда участки освобождаются в различных областях памяти или в случайном порядке). Наконец, память должна быть повторно использована. Для этого, возможно, потребуется применение механизмов уплотнения свободной памяти в целях создания нескольких больших блоков свободной памяти из множества маленьких.

Можно выделить три основных метода управления памятью (мы приводим их в порядке возрастания сложности реализации):

  • Статическое распределение памяти
  • Стековое распределение памяти
  • Представление памяти в виде кучи (heap)

Ранее многие языки проектировались в расчете на какой-то один их этих механизмов управления памятью. Сегодня большинство языков программирования требуют от компиляторов использования всех трех механизмов управления памятью - обычно подразумевается применение самого "дешевого" из пригодных способов. В дальнейшем



Содержание раздела