4.4.2. Методы управления памятью

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

Типы адресов

Для идентификации переменных и команд используются символьш имена (метки), виртуальные адреса и физические адреса (рис. 4.9).

Символьные имена присваивает пользователь при написании программ на алгоритмическом языке или ассемблере.

Рис.4.9. Типы адресов

Виртуальные адреса вырабатывает транслятор, переводящий программу на машинный язык. Так как во время трансляции в общем случае неизвестно, в какое место ОП будет загружена программа, то транслятор присваивает пе­ременным и командам виртуальные (условные) адреса, обычно считая по умолчанию, что программа будет размещена, начиная с нулевого адреса. Со­вокупность виртуальных адресов процесса (программы) называется вирту­альным адресным пространством. Каждый процесс имеет собственное вирту­альное адресное пространство. Максимальный размер виртуального адресно­го пространства ограничивается разрядностью адреса, присущей данной ар­хитектуре компьютера и, как правило, не совпадает с объемом физической памяти, имеющимся в компьютере.

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

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

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

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

Все методы управления памятью могут быть разделены на два класса (рис. 4.10):

- методы распределения ОП без использования внешней памяти (дис­кового пространства);

- методы распределения памяти с использованием дискового простран­ства;

Рассмотрим вначале первую группу методов.

Рис.4.10. Методы распределения памяти

Распределение памяти фиксированными разделами

Самым простым способом управления оперативной памятью является разделение её на несколько разделов (сегментов) фиксированной величины (статическое распределение). Это может быть выполнено вручную операто­ром во время старта системы или во время её генерации. Очередная задача, поступающая на выполнение, помещается либо в общую очередь (рис. 4.11,а), либо в очередь к некоторому разделу (рис. 4.11,6). Подсистема управления памятью в этом случае выполняет следующие задачи: сравнивает размер программы, поступившей на выполнение, и свободных разделов па­мяти; выбирает подходящий раздел; осуществляет загрузку программы и на­стройку адресов.

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

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

Рис. 4.11. Распределение памяти фиксированными разделами: а) с общей очередью; б) с отдельными очередями

Распределение памяти разделами переменной величины

В этом случае память машины не делится заранее на разделы. Сначала вся память свободна. Каждой вновь поступающей задаче выделяется необхо­димая ей память. Если достаточный объем памяти отсутствует, то задача не принимается на выполнение и стоит в очереди. После завершения задачи па­мять освобождается, и на это место может быть загружена другая задача. Та­ким образом, в произвольный момент времени оперативная память представ­ляет собой случайную последовательность занятых и свободных участков (разделов) произвольного размера. На рис. 4.12 показано состояние памяти в различные моменты времени при использовании динамического распределе­ния. Так в момент tg в памяти находится только ОС, а к моменту t, память разделена между 5 задачами, причем задача П4, завершая работу, покидает память к моменту t;. На освободившееся место загружается задача П6, посту­пившая в момент 1з.

Задачами операционной системы при реализации данного метода управ­ления памятью являются: ведение таблиц свободных и занятых областей, в которых указываются начальные адреса и размеры участков памяти; анализ запроса (при поступлении новой задачи), просмотр таблицы свободных об­ластей и выбор раздела, размер которого достаточен для размещения посту­пившей задачи; загрузка задачи в выделенный ей раздел и корректировка таблиц свободных и занятых областей; корректировка таблиц свободных и занятых областей (после завершения задачи).

Рис. 4.12. Распределение памяти динамическими разделами

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

Выбор раздела для вновь поступившей задачи может осуществляться по разным правилам: «первый попавшийся раздел достаточного размера»; «раз­дел, имеющий наименьший достаточный размер»; «раздел, имеющий наи­больший достаточный размер». Все эти правила имеют свои преимущества и недостатки.

По сравнению с методом распределения памяти фиксированными разде­лами данный метод обладает гораздо большей гибкостью, но ему присущ очень серьезный недостаток — фрагментация памяти. Фрагментация — это наличие большого числа несмежных участков свободной памяти очень ма­ленького размера (фрагментов). Настолько маленького, что ни одна из вновь поступающих программ не может поместиться ни в одном из участков, хотя суммарный объем фрагментов может составить значительную величину, на­много превышающую требуемый объем памяти1.

Перемещаемые разделы

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

Рис.4.13. Распределение памяти перемещаемыми разделами

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

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