
ОС архив / Лекция 9
.docЛекция 9.
Виртуальные ресурсы. Подходы к виртуализации памяти. Свопинг. Способы реализации виртуальной памяти. Страничное распределение памяти. Сегментное распределение памяти. Сегментно-страничное распределение памяти. Стратегии управления страничной памятью. Алгоритмы замещения страниц. Особенности диспетчера памяти Windows.
Большое количество задач, необходимое для высокой загрузки процессора, требует большого объема оперативной памяти. В условиях, когда для обеспечения приемлемого уровня мультипрограммирования имеющейся оперативной памяти недостаточно, был предложен метод организации вычислительного процесса, при котором образы некоторых процессов целиком или частично временно выгружаются на диск.
В мультипрограммном режиме помимо активного процесса имеются приостановленные процессы, находящиеся в ожидании завершения ввода-вывода или освобождения ресурсов, а также процессы в состоянии готовности, стоящие в очереди к процессору. Образы таких неактивных процессов могут быть временно выгружены на диск. Несмотря на то что коды и данные выгруженного процесса отсутствуют в оперативной памяти, ОС «знает» о его существовании и учитывает это при распределении процессорного времени и других системных ресурсов. К моменту, когда подходит очередь выполнения выгруженного процесса, его образ возвращается с диска в оперативную память. Если при этом обнаруживается, что свободного места в оперативной памяти не хватает, то на диск выгружается другой процесс.
Такая подмена (виртуализация) оперативной памяти дисковой памятью позволяет повысить уровень мультипрограммирования – объем оперативной памяти при этом не ограничивает количество одновременно выполняемых процессов, поскольку суммарный объем памяти, занимаемой образами этих процессов, может существенно превосходить имеющийся объем оперативной памяти. Виртуальным называется ресурс, который пользователю или пользовательской программе представляется обладающим свойствами, которыми он в действительности не обладает. В данном случае в распоряжение прикладного программиста предоставляется виртуальная оперативная память, размер которой намного превосходит всю имеющуюся в системе реальную оперативную память.
Виртуализация оперативной памяти осуществляется совокупностью программных модулей ОС и аппаратных схем процессора и включает решение следующих задач:
-
размещение данных в запоминающих устройствах разного типа, например, часть кодов программы – в оперативной памяти, а часть – на диске;
-
выбор образов процессов или их частей для перемещения из оперативной памяти на диск и обратно;
-
перемещение по мере необходимости данных между памятью и диском;
-
преобразование виртуальных адресов в физические.
Важно, что все действия по организации совместного использования диска и оперативной памяти осуществляется операционной системой и аппаратурой процессора автоматически, без участия программиста, и никак не сказываются на логике работы приложений.
Виртуализация памяти может быть осуществлена на основе двух различных подходов:
-
свопинг, подкачка (swapping) – образы процессов выгружаются на диск и возвращаются в оперативную память целиком;
-
виртуальная память (virtual memory) – между оперативной памятью и диском перемещаются части (сегменты, страницы) образов процессов.
Свопинг представляет собой частный случай виртуальной памяти и, следовательно, более простой в реализации способ совместного использования оперативной памяти и диска. Однако подкачке свойственна избыточность: когда ОС решает активизировать процесс, для его выполнения, как правило, не требуется загружать в оперативную память все го сегменты полностью. Аналогично при освобождении памяти для загрузки нового процесса часто не требуется выгружать другой процесс на диск целиком. Перемещение избыточной информации замедляет работу системы, а также приводит к неэффективному использованию памяти. Кроме того, операционные системы, поддерживающие свопинг, не способны загрузить для выполнения процесс, виртуальное адресное пространство которого превышает имеющуюся в наличии свободную память.
Из-за указанных недостатков свопинг как основной механизм управления памятью почти не используется в современных ОС, и применяется в основном во встроенных системах.
Ключевой проблемой виртуальной памяти, возникающей в результате многократного изменения местоположения в оперативной памяти образов процессов или их частей, является преобразование виртуальных адресов в физические. Решение этой проблемы, в свою очередь, зависит от того, какой способ структуризации виртуального адресного пространства принят в данной подсистеме управления памятью. В настоящее время все множество реализаций виртуальной памяти может быть представлено тремя классами:
-
Страничная виртуальная память организует перемещение данных между памятью и диском страницами – частями виртуального адресного пространства, фиксированного и сравнительно небольшого размера.
-
Сегментная виртуальная память предусматривает перемещение данных сегментами – частями виртуального адресного пространства произвольного размера, полученными с учетом смыслового значения данных.
-
Сегментно-страничная виртуальная память использует двухуровневое деление: виртуальное адресное пространство делится на сегменты, а затем сегменты делятся на страницы.
Для временного хранения сегментов и страниц на диске отводится либо специальная область, либо специальный файл, которые по традиции продолжают называть областью или файлом подкачки. Другое популярное название этой области – страничный файл (page file, paging file). Текущий размер страничного файла является очень важным параметром, оказывающим влияние на возможности операционной системы: чем больше страничный файл, тем больше приложений может одновременно выполнять ОС. Понятно, что увеличение числа работающих приложений за счет увеличения размера страничного файла замедляет их работу, так как значительная часть времени при этом тратится на перекачку кодов и данных из оперативной памяти на диск и обратно.
Страничное распределение памяти. При использовании страничного распределения памяти виртуальное адресное пространство каждого процесса делится на части одинакового, фиксированного для данной системы размера, называемые виртуальными страницами (virtual pages). Вся оперативная память также делится на части такого же размера, называемые физическими страницами (или блоками, кадрами). Размер страницы выбирается равным степени двойки: 512, 1024, 4096 байт и т.д. Это позволяет упростить механизм преобразования адресов.
При создании процесса ОС загружает в оперативную память несколько его виртуальных страниц (начальные страницы кодового сегмента и сегмента данных). Копия всего виртуального адресного пространства процесса находится на диске. Смежные виртуальные страницы не обязательно располагаются в смежных физических страницах. Для каждого процесса операционная система создает таблицу страниц – информационную структуру, содержащую записи обо всех виртуальных страницах процесса.
Запись таблицы, называемая дескриптором страницы, содержит следующую информацию:
-
номер физической страницы, в которую загружена данная виртуальная страница;
-
признак присутствия, устанавливаемый в единицу, если виртуальная страница находится в оперативной памяти;
-
признак модификации страницы, устанавливаемый в единицу всякий раз, когда производится запись по адресу, относящемуся к данной странице;
-
признак обращения к странице, называемый также битом доступа, который устанавливается в единицу при каждом обращении по адресу, относящемуся к данной странице.
Рис. 9.1. Страничное распределение памяти.
Признаки присутствия, модификации и обращения в большинстве современных моделей процессоров устанавливаются аппаратно при выполнении операции с памятью. Информация из таблиц страниц используется для решения вопроса о необходимости перемещения той или иной страницы между памятью и диском, а также для преобразования виртуального адреса в физический. При решении вопросов о перемещении страниц из оперативной памяти и обратно операционная система использует стратегии выборки, размещения и замещения страниц, которые будут рассмотрены ниже.
Таблицы страниц процесса размещаются в оперативной памяти. Адрес таблицы страниц включается в контекст соответствующего процесса и загружается в специальный регистр процессора при активизации процесса. При каждом обращении к памяти выполняется поиск номера виртуальной страницы, содержащий требуемый адрес, а затем по этому номеру определяется нужный элемент таблицы страниц, и из него извлекается описывающая страницу информация. Далее аанализируется признак присутствия. Если данная виртуальная страница находится в оперативной памяти, выполняется преобразование виртуального адреса в физический. Если нужная страница в данный момент выгружена, формируется исключительная ситуация page fault, которая затем обрабатывается операционной системой. Выполняющийся процесс переводится в состояние ожидания, и активизируется другой процесс, стоящий в очереди процессов, находящихся в состоянии готовности. Параллельно программа обработки исключения находит на диске требуемую виртуальную страницу и пытается загрузить ее в оперативную память. Если в памяти имеется свободная физическая страница, загрузка производится немедленно, если же свободных страниц нет, то на основании принятой в системе стратегии замещения решается вопрос о том, какую страницу требуется выгрузить из оперативной памяти.
После того как выбрана страница, которая должна покинуть оперативную память, обнуляется ее бит присутствия и анализируется признак модификации. Если выталкиваемая страница была модифицирована, то ее новая версия должна быть переписана на диск, если нет – запись на диск не производится. Физическая страница объявляется свободной. При этом в некоторых системах из соображений безопасности освобождаемая страница обнуляется.
Преобразование виртуального адреса в физический производится следующим образом:
-
Из специального регистра процессора извлекается адрес AT таблицы страниц активного процесса. На основании начального адреса таблицы страниц, номера виртуальной страницы p (старшие разряды виртуального адреса) и длины записи в таблице страниц L (системная константа) определяется адрес нужного дескриптора в таблице страниц: a=AT+p*L.
-
Из этого дескриптора извлекается номер соответствующей физической страницы n.
-
К номеру физической страницы присоединяется смещение s (младшие разряды виртуального адреса).
Рис. 9.2. Схема преобразования виртуального адреса в физический при страничной организации памяти
Для уменьшения времени преобразования адресов во всех процессорах предусмотрен аппаратный механизм получения физического адреса по виртуальному. С той же целью размер страницы выбирается равным степени двойки, благодаря чему двоичная запись адреса легко разделяется на номер страницы и смещение, и в результате в процедуре преобразования операция сложения заменяется более короткой операцией конкатенации. Используются и другие способы ускорения преобразования – многоуровневые таблицы страниц, кэширование таблицы страниц и т.д.
Страничное распределение памяти может быть реализовано в упрощенном варианте, без выгрузки страниц на диск. В этом случае все виртуальные страницы всех процессов постоянно находятся в оперативной памяти. Такой вариант страничной организации не предоставляет преимуществ работы с виртуальной памятью, но позволяет успешно бороться с фрагментацией физической памяти.
Сегментное распределение памяти. При страничной организации виртуальное адресное пространство процесса делится на равные части без учета смыслового значения данных. В одной странице могут оказаться и коды команд, и данные. Такой подход не позволяет обеспечить дифференцированный доступ к разным частям программы. Например, можно было бы запретить операции записи в сегмент, содержащий коды команд, разрешив ее для сегментов данных.
Кроме того, разбиение виртуального адресного пространства на сегменты делает принципиально возможным совместное использование фрагментов программ разными процессами. Пусть, например, двум процессам требуется одна и та же подпрограмма, обладающая свойством реентерабельности (Реентерабельность (reentrantable) – свойство повторной входимости кода, которое позволяет одновременно использовать его несколькими процессами. При выполнении реентерабельного кода процессы не изменяют его, поэтому в память достаточно загрузить только одну копию кода). Тогда коды этой подпрограммы могут быть оформлены в виде отдельного сегмента и включены в виртуальные адресные пространства обоих процессов. При отображении в физическую память сегменты, содержащие коды подпрограммы из обоих виртуальных пространств, проецируются на одну и ту же область физической памяти.
Рис. 9.3. Сегментное распределение памяти
Деление виртуального адресного пространства на сегменты осуществляется компилятором на основании указаний программиста или по умолчанию, в соответствии с принятыми в системе соглашениями. Размер сегмента определяется с учетом смыслового занчения содержащейся в нем информации. Максимальный размер сегмента определяется разрядностью виртуального адреса. Например, при 32-разрядной адресации максимальный размер сегмента равен 4 Гбайт. Сегменты не упорядочиваются друг относительно друга, так что для сегментов линейного виртуального адреса не существует. Виртуальный адрес задается парой чисел: номером сегмента и линейным виртуальным адресом внутри сегмента.
На этапе создания процесса во время загрузки его образа в оперативную память операционная система создает таблицу сегментов процесса (аналогичную таблице страниц), в которой для каждого сегмента указывается:
-
базовый физический адрес сегмента в оперативной памяти;
-
размер сегмента;
-
правила доступа к сегменту;
-
признаки модификации, присутствия и обращения к данному сегменту.
При загрузке процесса в оперативную память помещается только часть его сегментов, полная копия виртуального адресного пространства находится на диске. Для каждого загружаемого сегмента операционная система подыскивает непрерывный участок свободной памяти достаточного размера. Смежные в виртуальной памяти сегменты одного процесса могут занимать в оперативной памяти несмежные участки. Если во время выполнения процесса происходит обращение по виртуальному адресу, относящемуся к сегменту, который в настоящее время отсутствует в памяти, возникает исключительная ситуация. ОС приостанавливает активный процесс, запускает на выполнение следующий процесс из очереди готовых, а параллельно организует загрузку нужного сегмента с диска При отсутствии в памяти места, необходимого для загрузки сегмент, операционная система выбирает сегмент на выгрузку.
Как видно, сегментное распределение памяти имеет много общего со страничным распределением. Механизмы преобразования адресов также схожи, но имеют и существенные отличия, которые являются следствием того, что сегменты имеют произвольный размер. Виртуальный адрес при сегментной организации памяти представляется парой (g,s), где g – номер сегмента, s – смещение в сегменте. Физический адрес получается путем сложения (а не конкатенации, как при страничной организации) базового адреса сегмента, который определяется по номеру сегмента g из таблицы сегментов и смещения s.
Рис. 9.4. Преобразование виртуального адреса в физический при сегментной организации памяти
Использование операции сложения вместо конкатенации замедляет процедуру преобразования виртуального адреса в физический по сравнению со страничной организацией. Другим недостатком сегментного распределения является избыточность. При сегментной организации единицей перемещения между оперативной памятью и диском является сегмент, имеющий в общем случае объем больший, чем страница. Однако во многих случаях для работы программы не требуется загружать весь сегмент, достаточно было бы одной двух страниц. Аналогично при отсутствии свободной памяти не стоит выгружать весь сегмент.
Главным же недостатком сегментного распределения является фрагментация, которая возникает из-за непредсказуемости размеров сегментов. В процессе работы системы в памяти образуются небольшие участки свободной памяти, в которые не может быть загружен ни один сегмент. Суммарный же объем свободной памяти может быть весьма существенен.
Сегментно-страничное распределение памяти. Данный метод представляет собой комбинацию страничного и сегментного механизмов управления памятью и направлении на реализацию достоинств обоих подходов.
Также как и при сегментной организации памяти, виртуальное адресное пространство процесса разделено на сегменты. Это позволяет определить разные права доступа к разным частям кодов и данных программы. Перемещение данных между памятью и диском осуществляется страницами. Для этого каждый виртуальный сегмент и физическая память делятся на страницы равного размера, что позволяет более эффективно использовать память, сократив до минимума фрагментацию.
В большинстве современных реализаций сегментно-страничной организации памяти все виртуальные сегменты образуют непрерывное линейное виртуальное адресное пространство (см. рис. 9.5).
Рис. 9.5. Сегментация виртуального адресного пространства при сегментно-страничной организации памяти
Для каждого процесса операционная система создает отдельную таблицу сегментов, в которой содержатся дескрипторы всех сегментов процесса. Описание сегмента аналогично описанию при использовании сегментной организации памяти. Но имеется и принципиальное отличие. В поле базового адреса указывается не начальный физический адрес сегмента, отведенный ему в результате загрузки в оперативную память, а начальный линейный адрес сегмента в пространстве виртуальных адресов.
Наличие базового виртуального адреса сегмента в дескрипторе позволяет однозначно преобразовать адрес, заданный в виде пары (номер сегмента, смещение в сегменте), в линейный виртуальный адрес байта, который затем преобразуется в физический страничным механизмом.
Деление общего линейного виртуального адресного пространства процесса и физической памяти на страницы осуществляется так же, как это делается при страничной организации.
Рис. 9.6. Преобразование виртуального адреса в физический при сегментно-страничной организации памяти
Преобразование виртуального адреса в физический происходит в два этапа:
-
На первом этапе работает механизм сегментации. Исходный виртуальный адрес, заданный в виде пары (номер сегмента, смещение), преобразуется в линейный виртуальный адрес. Для этого на основании базового адреса таблицы сегментов и номера сегмента вычисляется адрес дескриптора сегмента. Анализируются поля дескриптора и выполняется проверка возможности выполнения заданной операции. Если доступ к сегменту разрешен, то вычисляется линейный виртуальный адрес путем сложения базового адреса сегмента, извлеченного из дескриптора, и смещения, заданного в исходном виртуальном адресе.
-
На втором этапе работает страничный механизм. Полученный линейный виртуальный адрес преобразуется в искомый физический. В результате преобразования линейный виртуальный адрес представляется в том виде, в котором он используется при страничной организации, а именно в виде пары (номер страницы, смещение в странице). Благодаря тому, что размер страницы выбирается равным степени двойки, эта задача решается простым отделением некоторого количества младших двоичных разрядов. При этом в старших разрядах содержится номер виртуальной страницы, а в младших – смещение искомого элемента относительно начала страницы. Старшие разряды линейного виртуального адреса заменяются номером физической страницы, взятым из таблицы страниц, а младшие остаются без изменений.
Производительность вычислительной системы при использовании виртуальной памятью напрямую зависит от частоты возникновения исключительных ситуаций, связанных к обращениям к страницам, отсутствующим в оперативной памяти (page fault). Время эффективного доступа к отсутствующей странице складывается из:
-
времени обработки исключительной ситуации page fault;
-
времени чтении (подкачки) страницы с диска (и, возможно, времени выталкивания одной из страниц из оперативной памяти);
-
времени возобновления выполнения процесса, вызвавшего page fault.
На первом и третьем этапах операционная система выполняет до нескольких сотен машинных операций в течение нескольких десятков микросекунд. Время подкачки страницы близко к нескольким десяткам миллисекунд. Таким образом, уменьшение частоты page fault является одной из ключевых задач системы управления памятью и связано. Решение этой задачи связано с правильным выбором стратегий управления страничной памятью.
Программное обеспечение подсистемы управления памятью связано с реализацией следующих стратегий:
-
Стратегия выборки (fetch policy) - в какой момент следует переписать страницу с диска в оперативную память. Существует два основных варианта выборки - по запросу и с упреждением. Алгоритм выборки по запросу вступает в действие в тот момент, когда процесс обращается к отсутствующей странице, содержимое которой находится на диске. Его реализация заключается в загрузке страницы с диска в свободную физическую страницу и коррекции соответствующей записи таблицы страниц. Алгоритм выборки с упреждением осуществляет опережающее чтение, то есть кроме страницы, вызвавшей исключительную ситуацию, в память также загружается несколько страниц, окружающих ее (обычно соседние страницы располагаются во внешней памяти последовательно и могут быть считаны за одно обращение к диску). Такой алгоритм призван уменьшить накладные расходы, связанные с большим количеством исключительных ситуаций, возникающих при работе со значительными объемами данных или кода, оптимизировать работу с диском.
-
Стратегия размещения (placement policy) - в какой участок первичной памяти поместить поступающую страницу. В системах со страничной организацией стратегия очень проста – страница помещается в любую свободную физическую страницу. В случае систем с сегментной организацией необходима стратегия, аналогичная стратегии с динамическим распределением.
-
Стратегия замещения (replacement policy) - какую страницу нужно вытолкнуть во внешнюю память, чтобы освободить место в оперативной памяти. Разумная стратегия замещения, реализованная в соответствующем алгоритме замещения страниц, позволяет хранить в памяти самую необходимую информацию и тем самым снизить частоту страничных нарушений. Замещение должно происходить с учетом выделенного каждому процессу количества кадров. Кроме того, нужно решить, должна ли замещаемая страница принадлежать процессу, который инициировал замещение, или она должна быть выбрана среди всех кадров основной памяти.
Существует большое количество разнообразных алгоритмов замещения страниц. Все они делятся на локальные и глобальные. Локальные алгоритмы, в отличие от глобальных, распределяют фиксированное или динамически настраиваемое число страниц для каждого процесса. Когда процесс израсходует все предназначенные ему страницы, система будет удалять из физической памяти одну из его страниц, а не из страниц других процессов. Глобальный алгоритм замещения в случае возникновения исключительной ситуации удовлетворится освобождением любой физической страницы, независимо от того, какому процессу она принадлежала.
Глобальные алгоритмы имеют ряд недостатков. Во-первых, они делают одни процессы чувствительными к поведению других процессов. Например, если один процесс в системе одновременно использует большое количество страниц памяти, то все остальные приложения будут в результате ощущать сильное замедление из-за недостатка памяти для своей работы. Во-вторых, некорректно работающее приложение может подорвать работу всей системы (если, конечно, в системе не предусмотрено ограничение на размер памяти, выделяемой процессу), пытаясь захватить больше памяти. Поэтому в многозадачной системе иногда приходится использовать более сложные локальные алгоритмы.
Оптимальный алгоритм замещения страниц. Этот алгоритм прост: каждая страница в памяти должна быть помечена количеством команд, которые будут выполнены перед первым обращением к этой странице. Выгружаться должна страница с наибольшей меткой. Фактически это означает, что необходимо выгружать страницу, которая не будет использоваться в течение самого длительного периода времени.
С этим алгоритмом связана только одна проблема: он не может быть реализован на практике. В момент ошибки отсутствия страницы операционная система не имеет возможности узнать, когда произойдут следующие обращения к каждой из страниц. Данный алгоритм используется для оценки качества реализуемых алгоритмов замещения страниц.
Алгоритм NRU (Not Recently Used – не использовавшаяся в последнее время страница). Как было сказано выше, в таблице страниц для каждой страницы хранятся признак (бит) обращения к странице R (от Referenced – обращение) и признак (бит) модификации страницы M (от Modified – изменение). Эти биты могут быть использованы для построения простого алгоритма замещения страниц.
Когда процесс запускается, оба страничных бита для всех его страниц операционной системой сброшены в 0. Периодически (например, при каждом прерывании от таймера) бит R очищается с целью отличить страницы, к которым давно не было обращений, от тех, к которым обращения были.