Наверх Системное программирование
Предыдущий раздел Оглавление Следующий раздел

4.2. СВОПИНГ

Если сложить значения объемов памяти, необходимые для размещения всех имеющихся в системе процессов, то с большей долей вероятности полученный суммарный объем будет значительно превышать имеющийся объем оперативной памяти системы. При запуске современных систем (Windows, Linux, OS X) возможен одновременный запуск до ста и более процессов. Например, установленное приложение Windows может потребовать от системы при последующих ее запусках, чтобы она запускала фоновый процесс, выполняющий только проверку на наличие обновлений для данного приложения. Такой фоновый процесс может потребовать до десяти мегабайт оперативной памяти. Кроме того, некоторые фоновые процессы могут следить за состоянием электронной почты, сетевыми подключениями и др. И все это еще будет происходить до первого запуска пользователем некоторой программы. А современные приложения (например, графические редакторы или программы видеомонтажа) могут потребовать от системы для запуска до 500 Мбайт памяти, а при обработки данных до нескольких гигабайт. Поэтому одновременное содержание в памяти всех процессов может потребовать очень больших объемов, что в случае дефицита памяти просто невозможно.

Чтобы преодолеть перегрузку памяти, разработаны два различных подхода к решению данной задачи. Первый подход заключается в размещении полностью всего процесса в памяти, запуске этого процесса на некоторое определенное время, а затем его переносе на диск. Такой подход получил название свопинга. Находящиеся в состоянии ожидания или блокировки процессы хранятся на диске, а не используют пространство оперативной памяти. Второй подход заключается в частичном хранении программ в оперативной памяти, но с возможностью запуска и исполнения таких приложений. Данный подход называется виртуальной памятью.

Использование свопинга в работе системы представлено на рис. 4.1. В начальный момент времени в памяти находится только процесс A. Затем в памяти появляются процессы B и C. Процесс A с использованием свопинга переносится на диск (рис. 4.1, г). После чего в память переносится процесс D, а процесс B наоборот выгружается. Затем процесс A вновь загружается в память. Так как процесс A занимает теперь другое место в памяти, то и адреса, которые содержатся в нем, должны измениться или в процессе свопинга программным путем, или в процессе исполнения программы с использованием аппаратных средств (например, механизмов базового и ограничительного регистров).

Рис

Рис. 4.1. Изменение состояния памяти
при загрузке и выгрузке процессов
(неиспользованные области обозначены
сплошным черным цветом)

Для объединения полученных в результате свопинга свободных областей памяти в одну за счет переноса процессов в область нижних адресов используется технология уплотнения памяти. Но так как ее выполнение использует достаточно много процессорного времени, многие операционные системы не пользуются данной технологией. Например, для компьютера с 16 Гбайт оперативной памяти, которая копирует данные со скоростью 1 байт в 1 нс, необходимо около 16 с для уплотнения всего объема памяти.

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

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

Рис

Рис. 4.2. Выделение памяти: а — под
увеличивающийся сегмент данных;
б — под увеличивающийся стек
и сегмент данных

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

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

Предыдущий раздел Оглавление Следующий раздел