Распределение памяти динамическими разделами
В этом случае память машины не делится заранее на разделы. Сначала вся память,отводимая для приложений, свободна. Каждому вновь поступающему на выполнениеприложению на этапе создания процесса выделяется вся необходимая ему память (еслидостаточный объем памяти отсутствует, то приложение принимается на выполнение ипроцесс для него не создается). После завершения процесса память освобождается, и наэто место может быть загружен другой процесс. Таким образом, в произвольный моментвремени оперативная память предоставляет собой случайную последовательность занятыхи свободных участков (разделов) произвольного размера. На рис. показано состояниепамяти в различные моменты времени при использовании динамического распределения.
Так, в момент t0 в памяти находится только ОС, а к моменту t1 память разделена между 5процессами, причем процесс П4, завершаясь, покидает память. На освободившееся отпроцесса П4 место загружается процесс П6, поступивший в момент t3.
Функции операционной системы, предназначенные для реализации данного метода управления памятью:
- Ведение таблиц свободных и занятых областей, в которых указываются начальные адреса и размеры участков памяти.
- При создании нового процесса — анализ требований к памяти, просмотр таблицы свободных областей и выбор раздела, размер которого достаточен для размещения кодов и данных нового процесса. Выбор раздела может осуществляться по разным правилам, например: «первый попавшийся раздел достаточного размера», «раздел, имеющий наименьший достаточный размер» или «раздел, имеющий наибольший достаточный размер».
- Загрузка программы в выделенный ей раздел и корректировка таблиц свободных изанятых областей. Данный способ предполагает, что программный код не перемещается вовремя выполнения, а значит, настройка адресов может быть проведена единовременно вовремя загрузки.
- После завершения процесса корректировка таблиц свободных и занятых областей.По сравнению с методом распределения памяти фиксированными разделами данныйметод обладает гораздо большей гибкостью, но ему присущ очень серьезный. Недостаток— фрагментация памяти. Фрагментация — это наличие большого кланесмежных участковсвободной памяти очень маленького размера, (фрагментов). Настолько маленького, что ниодна из вновь поступающих программ не может поместиться ни в одном из участков, хотясуммарный объем фрагментов может составить значительную величину, намногопревышающую требуемый объем памяти.
Распределение памяти динамическими разделами лежит в основе подсистем управления памятью многих мультипрограммных операционных системах 60-70-х годов, в частности такой популярной операционной системы, как OS/360.
Перемещаемые разделы
Одним из методов борьбы с фрагментацией является перемещение всех занятых участков в сторону старших или младших адресов, так, чтобы вся свободная память образовала единую свободную область (рис.). В дополнение к функциям, которые выполняет ОС при распределении памяти динамическими разделами, в данном случае она должна еще время от времени копировать содержимое разделов из одного места памяти в другое, корректируя таблицы свободных и занятых областей. Эта процедура называется сжатием. Сжатие может выполняться либо при каждом завершении процесса, либо только тогда, когда для вновь создаваемого процесса нет свободного раздела достаточного размера. В первом случае требуется меньше вычислительной работы при корректировке таблиц свободных и занятых областей, а во втором — реже выполняется процедура сжатия.
Так как программы перемещаются по оперативной памяти в ходе своего выполнения, то в данном случае невозможно выполнить настройку адресов с помощи перемещающего загрузчика. Здесь более подходящим оказывается динамическое образование адресов.
Хотя процедура сжатия и приводит к более эффективному использованию памяти, она может потребовать значительного времени, что часто перевешивает преимущества данного метода.
Концепция сжатия применяется и при использовании других методов распределения памяти, когда отдельному процессу выделяется не одна сплошная область памяти, а несколько несмежных участков памяти произвольного размера (сегментов). Такой подход был использован в ранних версиях OS/2, в которых память распределялась сегментами, а возникавшая при этом фрагментация устранялась путем периодического перемещения сегментов.