Предпосылки для организации виртуальной памяти
Поскольку процесс выполняется только в основной памяти, эта память называется также реальной. Однако программист или пользователь имеют дело с потенциально большей памятью – выделенной на диске. Эта память называется виртуальной. Предпосылками для организации виртуальной памяти являются следующие.
1. Все обращения к памяти в рамках процесса представляют собой логические адреса, которые динамически транслируются в физические адреса во время исполнения. Это означает, что процесс может быть выгружен на диск и вновь загружен в ОП, так что во время работы он может находиться в разных местах ОП,
2. Процесс может быть разбит на ряд частей (страниц или сегментов), которые не обязательно должны располагаться в ОП единым непрерывным блоком. Это обеспечивается за счет динамической трансляции адресов и использования таблиц страниц или сегментов.
При выполнении этих условий, наличие всех страниц или сегментов процесса в ОП одновременно не является необходимым условием. Рассмотрим, как это может осуществляться. Предположим, что наступило время загрузки нового процесса в память. ОС начинает ее с размещения в памяти только одного или нескольких блоков (здесь под блоком будем подразумевать страницу или сегмент), включая блок, содержащий начало программы. Часть процесса, располагающаяся в некоторый момент времени в ОП, называется резидентным множеством процесса. Во время выполнения процесса при помощи таблицы страниц или сегментов процессор всегда может определить, располагается ли блок, к которому требуется обращение, в ОП. Если нет, то процессор генерирует прерывание, свидетельствующее об отсутствии блока в памяти. ОС переводит прерванный процесс в заблокированное состояние и загружает в ОП блок, содержащий адрес, из-за которого произошло прерывание. После того как необходимый блок загружен в ОП, выполняется прерывание ввода-вывода, передающее управление операционной системе, которая, в свою очередь, переводит заблокированный процесс в состояние готовности, и процесс продолжает выполнение с прерванной команды.
Следствия применения виртуальной памяти:
1. в оперативной памяти может поддерживаться большее количество процессов;
2. процесс может быть больше, чем физическая память.
Страничная организация виртуальной памяти
Термин виртуальная память обычно ассоциируется с системами, использующими страничную организацию, хотя используется и виртуальная память на основе сегментации.
Структура таблицы страниц
При рассмотрении простой страничной организации мы указывали, что каждый процесс имеет свою таблицу страниц, создаваемую операционной системой. Каждая запись в таблице страниц содержит номер кадра соответствующей страницы в памяти. Для организации виртуальной памяти каждая запись таблицы страниц также должна содержать бит присутствия P, указывающий на присутствие соответствующей страницы в ОП. Если данная страница располагается в ОП, то в записи таблицы содержится номер ее кадра.
Другим управляющим битом в записи таблицы страниц является бит модификации M. Он указывает, было ли изменено содержимое данной страницы со времени последней загрузки в ОП. Если изменений не было, то когда наступит время замены страницы в занимаемом ею в данный момент кадре, записывать эту страницу на диск не следует, так как на диске уже имеется ее точная копия.
Базовый механизм чтения слова из памяти включает в себя трансляцию виртуального, или логического, адреса, состоящего из номера страницы и смещения, в физический адрес, который представляет собой номер кадра и смещение, с использованием таблицы страниц. Таблица страниц располагается в ОП.
В принципе каждый виртуальный адрес вызывает обращение к двум физическим адресам: одно для выборки соответствующей записи из таблицы страниц и еще одно – для обращения к адресуемым данным. Следовательно, простая схема виртуальной памяти, по сути, удваивает время обращения к памяти. Для преодоления этой проблемы большинство схем виртуальной памяти использует специальный высокоскоростной кэш для записей таблицы страниц, который обычно называется буфером быстрого преобразования адреса, или просто буфером поиска трансляции (TLB, Translation Lookaside Buffer). Этот кэш функционирует так же, как и обычный кэш памяти.
На рис. 16.1 показана схема трансляции адреса с использованием TLB.
Сегментация
Сегментация позволяет программисту рассматривать память как область, состоящую из множества адресных пространств, или сегментов. Сегменты могут иметь разные (фактически динамические) размеры. Обращения к памяти используют адреса, представляющие собой пары (номер сегмента, смещение).
Такая организация имеет ряд преимуществ по сравнению с несегментированным адресным пространством.
1. Упрощается обработка растущих структур данных.
2. Упрощается совместное использование кода и данных разными процессами.
3. Улучшается защита.
При рассмотрении простой сегментной организации мы отмечали, что каждый процесс имеет собственную таблицу сегментов. В каждой записи таблицы сегментов указан начальный адрес соответствующего сегмента в ОП и его длина. Та же таблица сегментов нужна и при схеме виртуальной памяти, основанной на сегментации. Записи таблицы сегментов в этом случае усложняются. Поскольку в ОП могут находиться не все сегменты процесса, в каждой записи требуется наличие бита присутствия, указывающего, располагается ли данный сегмент в ОП. Если сегмент расположен в ОП, то запись включает его начальный адрес и длину.
Еще один бит, необходимый в данной схеме, – бит модификации, указывающий, было ли изменено содержимое сегмента со времени его последней загрузки в ОП. Если изменений не было, то при выгрузке сегмента нет необходимости в его записи на диск.
Основной механизм чтения слова из памяти включает преобразование виртуального, или логического, адреса, состоящего из номера сегмента и смещения, в физический адрес с использованием таблицы сегментов. Для хранения таблицы сегментов используется ОП. Когда запускается определенный процесс, в одном из управляющих регистров хранится стартовый адрес его таблицы сегментов. Номер сегмента из виртуального адреса используется в качестве индекса таблицы, позволяющего определить начальный адрес сегмента. Для получения физического адреса к начальному адресу сегмента добавляется смещение из виртуального адреса.