Операционные системы. Учебное пособие
.pdf
4.2. Функции ОС по управлению памятью
памятью. В настоящее время все множество реализаций ВП может быть представлено тремя классами.
1.Страничная ВП организует перемещение данных между памятью и диском страницами – частями ВАП, фиксированного и сравнительно небольшого размера.
2.Сегментная ВП предусматривает перемещение данных сегментами – частями ВАП произвольного размера, полученными с учетом смыслового значения данных.
3.Сегментно-страничная ВП использует 2-уровневое деление: ВАП делится на сегменты, а затем сегменты делятся на страницы, которые и являются единицей перемещения данных.
Длявременногохранениясегментовистраницнадискеотводится либо специальная область, либо специальный файл, которые во многих ОС по традиции называют файлом свопинга. Другое популярное название этой области – страничный файл. Его размер является важным настраиваемым параметром, выбираемым администратором системы для достижения компромисса между уровнем мультипрограммирования
ибыстродействием.
4.2. Функции ОС по управлению памятью
Память является важнейшим ресурсом, требующим тщательного управления со стороны ОС, поскольку процессор может выполнять программы только в том случае, если они находятся в памяти. Она распределяется между модулями приложения и самой ОС. Функциями по управлению памятью в мультипрограммной системе являются:
1)отслеживание свободной и занятой памяти;
2)выделение памяти процессам и освобождение памяти по их завершению;
3)полное или частичное вытеснение кодов и данных из ОП на диск, когда размеры основной памяти недостаточны для размещения
вней всех процессов, и возвращение их в ОП, когда в ней освобождается место;
4)настройка адресов программы на конкретную область физической памяти;
61
4.Управление памятью
5)дефрагментация памяти;
6)защита конкретных областей памяти.
Перечисленные функции особого пояснения не требуют, остановимся только на задаче преобразования адресов программы при ее загрузке в ОП.
Для идентификации переменных и инструкций на разных этапах жизненного цикла программы используются символьные имена (метки), виртуальные адреса (ВА) и физические адреса (ФА). Метки присваивает пользователь при написании программы на языке программирования. ВА вырабатывает транслятор, переводящий программу на язык машины, но поскольку в момент трансляции неизвестно, в какое место ОП будет загружена программа,то транслятор присваивает переменным и инструкциям условные (виртуальные) адреса, считая, что начальным адресом программы будет 0. ФА соответствуют номерам ячеек ОП, где в действительности будут расположены переменные и инструкции.
Нами выше рассматривалось определение ВАП процесса как совокупности всех ВА процесса. Диапазон возможных адресов ВАП у всех процессов является одним и тем же (у 32-разрядных машин этот диапазон от 0000000h до FFFFFFFFh, что составляет 4 Гб), но каждый процесс имеет собственное ВАП – транслятор присваивает ВА переменным и кодам каждой программе независимо.
Водних ОС ВАП процесса представлено в виде непрерывной линейной последовательности ВА. Такую структуру АП называют также плоской. Здесь ВА является единственное число, представляющее собой смещениеотносительноначалаВАП.ЭтотадресназываютлинейнымВА.
Вдругих ОС ВАП делится на части, называемые по-разному, но чаще пользуются термином «сегмент». Здесь ВА представляет собой пару чисел (n, m), где n – номер сегмента, а m – смещение внутри него.
Существуют и более сложные способы структуризации ВАП, когда ВА образуется тремя или более числами.
Совпадение ВА у различных процессов не приводит к конфликтам, так как ОС отображает их на разные ФА. При этом отображается либо все ВАП, либо его часть. Процедура преобразования ВА в ФА должна быть максимально прозрачной для пользователя и программиста. Существуют два подхода к преобразованию ВА в ФА. В первом случае замена ВА на ФА выполняется один раз для каждого процесса во
62
4.2. Функции ОС по управлению памятью
время начальной загрузки программы в память специальной системной программой – перемещающим загрузчиком.
Второй способ заключается в том, что программа загружается
впамять в неизменном виде в ВА. При загрузке ОС фиксирует смещение действительного расположения кода относительно ВАП. Во время выполнения программы при каждом обращении к ОП выполняется ди-
намическое преобразование ВА в ФА.
Необходимо различать максимально возможное ВАП процесса и назначенное (выделенное) процессу ВАП. В первом случае речь идет о максимальном размере ВАП, определяемом архитектурой компьютера, на котором выполняется ОС, в том числе разрядностью его схем адресации (в процессах Intel Pentium – до 4 Гб). Назначенное ВАП представляет собой набор ВА, действительно нужных процессу для работы. Эти адреса назначаются программе транслятором. При создании процесса ОС фиксирует назначенное ВАП в своих системных таблицах. Во время работы процесс может изменять размер первоначально назначенного ему ВАП путем запроса на создание дополнительных сегментов или увеличения размера уже существующих.
Как правило, объем ВАП превышает доступный объем ОП. В таком случае ОС для хранения данных ВАП процесса, не помещающихся
вОП, использует внешнюю память (обычно НЖМД). На этом принципе основана ВП.
Содержимое назначенного процессу ВАП представляет собой об-
раз процесса.
Вбольшинстве ОС ее сегменты разделяют ВАП с прикладными сегментами активного процесса. То есть сегменты ОС и сегменты активного процесса образуют единое ВАП. Обычно ВАП процесса делится на две непрерывные части: системную и пользовательскую. В некоторых ОС эти части имеют одинаковый размер, хотя это не обязательно. Часть ВАП каждого процесса, отводимая под сегменты ОС, является идентичной для всех процессов. Поэтому при смене активного процесса заменяется только вторая часть ВАП, содержащая его индивидуальные сегменты (коды и данные прикладной программы). При этом системная часть ВП включает область, подвергаемую страничному вытеснению, и область, на которую страничное вытеснение не распространяется. В невытесняемой области размещаются модули ОС, требующие
63
4. Управление памятью
быстрой реакции или постоянного присутствия в памяти (например, диспетчер потоков или менеджер памяти). Остальные модули ОС могут быть вытеснены, как и пользовательские сегменты.
4.3. Алгоритмы распределения памяти
Организация памяти – это то, каким образом представляется и используется ОП. Будем ли мы помещать в ОП только одну программу или несколько программ одновременно? Если в ОП размещается несколько программ сразу, то предоставлять ли каждой из них одинаковое количество ячеек или разбить ОП на части (разделы) различных размеров? Разбивать ОП жестким образом, когда разделы определяются на достаточно длительные периоды времени, или предусмотреть динамичное разбиение, позволяющее вычислительной машине быстро реагировать на изменение потребностей программ пользователя в ресурсах? Будет ли программа выполняться только в конкретном разделе или программы могут находиться в любом подходящем разделе? Требуется ли, чтобы каждая программа помещалась в одном непрерывном, сплошном блоке ячеек памяти или допустимо разбиение программ на отдельные блоки, размещаемые в любых свободных участках ОП?
Разные ОС по-разному отвечают на эти и другие базовые вопросы управления памятью. Далее будут рассмотрены наиболее общие подходы к распределению памяти.
Алгоритмы распределения могут быть разделены на два класса: алгоритмы, в которых используется перемещение сегментов процессов между ОП и диском, и алгоритмы, в которых внешняя память не привлекается (рис. 4.1).
Распределение памяти фиксированными разделами
Самым простым способом управления ОП является разделение ее на несколько разделов фиксированной величины. Это может быть выполнено вручную оператором во время старта системы или во время ее генерации. Разделы могут быть одинакового размера. При таком разделении возникают две проблемы:
1. Программа может быть слишком велика для размещения в разделе. В этом случае программист должен разрабатывать программу,
64
4.3. Алгоритмы распределения памяти
использующую оверлеи, чтобы в любой момент времени требовался только один раздел памяти. Когда требуется модуль, отсутствующий в данный момент в ОП, пользовательская программа должна сама его загрузить в раздел памяти программы. Таким образом, в данном случае управление памятью во многом возлагается на программиста.
2. Использование ОП крайне неэффективно. Любая программа, независимо от ее размера, занимает раздел целиком. При этом могут оставаться неиспользованные участки памяти большого размера. Этот феномен появления неиспользованной памяти называется внутренней фрагментацией.
Методы распределения памяти
Без использования внешней памяти
Фиксированными
разделами
Динамическими
разделами
Перемещаемыми
разделами
С использованием внешней памяти
Страничное
распределение
Сегментное
распределение
Сегментно-страничное распределение
Рис. 4.1. Классификация методов распределения памяти
Частично решить эти проблемы можно посредством использования разделов разных размеров. В этом случае программа большого размера может обойтись без оверлеев, а разделы малого размера позволяют уменьшить внутреннюю фрагментацию при загрузке небольших программ.
В том случае, когда разделы имеют одинаковый раздел, размещение процессов тривиально – в любой свободный раздел. Если все разделы заняты процессами, которые не готовы к немедленной работе, любой из них может быть выгружен для освобождения памяти для нового процесса.
65
4. Управление памятью
Когда разделы имеют разные размеры, есть два возможных подхода к назначению процессов разделам памяти. Простейший путь состоит в том, чтобы каждый процесс размещался в наименьшем разделе, способном вместить данный процесс. При таком подходе для каждого раздела требуется очередь планировщика, в которой хранятся выгруженные из памяти процессы, предназначенные для данного раздела памяти. Достоинство такого способа состоит в возможности распределения процессов между разделами ОП так, чтобы минимизировать внутреннюю фрагментацию. Недостаток заключается в том, что отдельные очереди для разделов могут привести к неоптимальному распределению памяти системы в целом. Более предпочтительным является использование одной очереди для всех процессов. В момент, когда требуется загрузить процесс в ОП, выбирается наименьший доступный раздел, способный вместить данный процесс.
Подсистема управления памятью в этом случае выполняет следующие задачи:
1)сравнивая размер программы, поступившей на выполнение,
исвободных разделов, выбирает подходящий раздел;
2)осуществляет загрузку программы и настройку адресов. Преимущество распределения памяти фиксированными раздела-
ми – простота реализации, недостаток – жесткость, так как число разделов заранее ограничено, вне зависимости от размера программы. В настоящее время может встречаться только в системах реального времени.
Распределение памяти динамическими разделами
В этом случае память машины не делится заранее на разделы. Сначала вся память свободна. Каждой вновь поступающей задаче выделяется необходимая ей память. Если достаточный объем памяти отсутствует, то задача не принимается на выполнение и стоит в очереди. После завершения задачи память освобождается, и на это место может быть загружена другая задача. Таким образом, в произвольный момент времени оперативная память представляет собой случайную последовательность занятых и свободных участков (разделов) произвольного размера. На рис. 4.2 показано состояние памяти в различные моменты времени при использовании динамического распределения. Так, в момент t0 в памяти находится только ОС, а к моменту t1 память разделена между пятью задачами, причем задача П4, завершаясь, покидает па-
66
4.3. Алгоритмы распределения памяти
мять. На освободившееся после задачи П4 место загружается задача П6, поступившая в момент t3.
Задачами ОС при реализации данного метода управления памятью являются:
1)ведение таблиц свободных и занятых областей, в которых указываются начальные адреса и размеры участков памяти;
2)при поступлении новой задачи – анализ запроса, просмотр таблицы свободных областей и выбор раздела, размер которого достаточен для размещения поступившей задачи;
3)загрузка задачи в выделенный ей раздел и корректировка таблиц свободных и занятых областей;
4)после завершения задачи – корректировка таблиц свободных
изанятых областей.
Рис. 4.2. Распределение памяти динамическими разделами
Программный код не перемещается во время выполнения, т. е. может быть проведена единовременная настройка адресов посредством использования перемещающего загрузчика.
Выбор раздела для вновь поступившей задачи может осуществляться по разным правилам, таким, например, как «первый попавшийся раздел достаточного размера», или «раздел, имеющий наименьший
67
4. Управление памятью
достаточный размер», или «раздел, имеющий наибольший достаточный размер». Все эти правила имеют свои преимущества и недостатки.
По сравнению с методом распределения памяти фиксированными разделами данный метод обладает гораздо большей гибкостью, но ему присущ очень серьезный недостаток – внешняя фрагментация памяти. Фрагментация – это наличие большого числа несмежных участков свободной памяти очень маленького размера (фрагментов). Настолько маленького, что ни одна из вновь поступающих программ не может поместиться ни в одном из участков, хотя суммарный объем фрагментов может составить значительную величину, намного превышающую требуемый объем памяти.
В настоящее время такой способ распределения почти не встречается, он был присущ многим ОС 1960–70-х гг., в частности в OS/360.
Распределение памяти перемещаемыми разделами
Одним из методов борьбы с фрагментацией является перемещение всех занятых участков в сторону старших либо в сторону младших адресов, так, чтобы вся свободная память образовывала единую свободную область (рис. 4.3). В дополнение к функциям, которые выполняет
Рис. 4.3. Распределение памяти перемещаемыми разделами
ОС при распределении памяти динамическими разделами, в данном случае она должна еще время от времени копировать содержимое разделов из одного места памяти в другое, корректируя таблицы свободных
68
4.3.Алгоритмы распределения памяти
изанятых областей. Эта процедура называется сжатием. Сжатие может выполняться либо при каждом завершении задачи, либо только тогда, когда для вновь поступившей задачи нет свободного раздела достаточного размера. В первом случае требуется меньше вычислительной работы при корректировке таблиц, а во втором – реже выполняется процедура сжатия. Так как программы перемещаются по оперативной памяти в ходе своего выполнения, то преобразование адресов из виртуальной формы в физическую должно выполняться динамическим способом.
Хотя процедура сжатия и приводит к более эффективному использованию памяти, она может потребовать значительного времени, что часто перевешивает преимущества данного метода.
Страничное распределение
Вэтом случае ВАП каждого процесса делится на части одинакового, фиксированного для данной системы размера, называемые виртуальными страницами. В общем случае размер виртуального адресного пространства не является кратным размеру страницы, поэтому последняя страница каждого процесса дополняется фиктивной областью. Вся ОП машины делится на части такого же размера, называемые физическими страницами (или блоками, или кадрами). Размер страницы выбирается равным степени двойки: 512, 1024, 4096 и т. д., что позволяет упростить механизм преобразования адресов.
При создании процесса ОС загружает в ОП несколько его виртуальных страниц (начальные страницы кодового сегмента и сегмента данных). Копия всего ВАП находится на диске. Смежные виртуальные страницы не обязательно располагаются в смежныхфизическихстраницах. Для каждого процесса ОС создает таблицу страниц – информационную структуру, содержащую записи обо всех виртуальных страницах процесса. Запись этой таблицы, называемая дескриптором этой страницы, включает следующую информацию:
1) номер физической страницы, в которую загружена данная виртуальная страница;
2) признак присутствия, устанавливаемый в единицу, если виртуальная страница находится в ОП;
3) признак модификации страницы, который устанавливается в единицу всякий раз, когда производится запись по адресу, относящемуся к данной странице;
69
4.Управление памятью
4)признак обращения к странице, называемый также битом доступа, который устанавливается в единицу при каждом обращении по адресу, относящемуся к данной странице.
При активизации очередного процесса в специальный регистр процессора загружается адрес таблицы страниц данного процесса.
При каждом обращении к памяти происходит чтение из таблицы страниц информации о виртуальной странице, к которой произошло обращение. Если данная виртуальная страница находится в ОП, то выполняется преобразование виртуальных адресов в физические адреса. Если же нужная виртуальная страница в данный момент выгружена на диск, то происходит так называемое страничное прерывание. Выполняющийся процесс блокируется и активизируется другой процесс из очереди готовых. Параллельно обработчик страничного прерывания находит на диске требуемую виртуальную страницу и пытается загрузить ее в ОП. Если в памяти имеется свободная физическая страница, то загрузка выполняется немедленно, если же свободных страниц нет, то решается вопрос, какую страницу следует выгрузить из оперативной памяти.
Вданной ситуации может быть использовано много разных критериев выбора:
1)дольше всего не использовавшаяся страница;
2)первая попавшаяся страница;
3)страница, к которой в последнее время было меньше всего обращений.
В некоторых системах используется понятие рабочего множества страниц. Рабочее множество определяется для каждого процесса и представляет собой перечень наиболее часто используемых страниц, которые должны постоянно находиться в ОП и поэтому не подлежат выгрузке.
После того как выбрана страница, которая должна покинуть ОП, анализируется ее признак модификации из таблицы страниц. Если выталкиваемая страница с момента загрузки была модифицирована, то ее новая версия должна быть переписана на диск. Если нет, то она может быть просто уничтожена, т. е. соответствующая физическая страница объявляется свободной.
Рассмотрим механизм преобразования виртуальных адресов в физические адреса при страничной организации памяти.
70
