Добавлен: 29.10.2018
Просмотров: 48068
Скачиваний: 190
3.3. Виртуальная память
231
Рис. 3.9. Связь между виртуальными адресами и адресами физической памяти, получаемая
с помощью таблицы страниц. Каждая страница начинается с адресов, кратных 4096,
и завершается на 4095 адресов выше, поэтому 4K–8K на самом деле означает
4096–8191, а 8K–12K означает 8192–12 287
Сама по себе возможность отображения 16 виртуальных страниц на 8 страничных
блоков за счет соответствующей настройки таблиц диспетчера памяти не решает про-
блемы превышения объема виртуальной памяти над объемом физической памяти.
Поскольку в нашем распоряжении только 8 физических страничных блоков, то на
физическую память могут отображаться только 8 виртуальных страниц (рис. 3.9).
Остальные, отмеченные на рисунке крестиками, в число отображаемых не попадают.
Реальное оборудование отслеживает присутствие конкретных страниц в физической
памяти за счет бита присутствия-отсутствия.
А что происходит, если, к примеру, программа ссылается на неотображаемые адреса
с помощью команды
MOV REG,32780
которая обращается к байту 12 внутри виртуальной страницы 8 (которая начинается
с адреса 32 768)? Диспетчер памяти замечает, что страница не отображена (поскольку
она на рисунке помечена крестиком), и заставляет центральный процессор передать
управление операционной системе. Это системное прерывание называется ошибкой
отсутствия страницы
(page fault). Операционная система выбирает редко использу-
емый страничный блок и сбрасывает его содержимое на диск (если оно еще не там).
Затем она извлекает (также с диска) страницу, на которую была ссылка, и помещает ее
в только что освободившийся страничный блок, вносит изменения в таблицы и заново
запускает прерванную команду.
232
Глава 3. Управление памятью
К примеру, если операционная система решит выселить содержимое страничного бло-
ка 1, она загрузит виртуальную страницу 8 начиная с физического адреса 4096 и внесет
два изменения в карту диспетчера памяти. Сначала в запись о виртуальной странице 1
будет внесена пометка о том, что эта страница не отображена, чтобы при любом будущем
обращении к виртуальным адресам в диапазоне от 4096 до 8191 вызывалось системное
прерывание. Затем крестик в записи, относящейся к виртуальной странице 8, будет из-
менен на цифру 1, поэтому при повторном выполнении прерванной команды произойдет
отображение виртуального адреса 32 780 на физический адрес 4108 (4096 + 12).
Теперь рассмотрим внутреннее устройство диспетчера памяти, чтобы понять, как он
работает и почему мы выбрали размер страницы, кратный степени числа 2. На рис. 3.10
показан пример виртуального адреса 8196 (0010000000000100 в двоичной записи),
отображенного с использованием карты диспетчера памяти с рис. 3.9. Входящий
16-разрядный виртуальный адрес делится на 4-битный номер страницы и 12-битное
смещение. Выделяя 4 бита под номер страницы, мы можем иметь 16 страниц, а с 12 би-
тами под смещение можем адресовать все 4096 байт внутри страницы.
Номер страницы используется в качестве индекса внутри таблицы страниц для полу-
чения номера страничного блока, соответствующего виртуальной странице. Если бит
Рис. 3.10. Преобразование диспетчером памяти виртуального адреса в физический
для 16 страниц по 4 Кбайт
3.3. Виртуальная память
233
присутствия-отсутствия установлен в 0, то вызывается системное прерывание. Если
бит установлен в 1, из таблицы страниц берется номер страничного блока, который
копируется в старшие 3 бита выходного регистра вместе с 12-битным смещением,
которое копируется в неизменном виде из входящего виртуального адреса. Вместе
они формируют 15-разрядный физический адрес. Затем значение выходного регистра
выставляется на шине памяти в качестве физического адреса.
3.3.2. Таблицы страниц
При простой реализации отображение виртуальных адресов на физические может быть
сведено к следующему: виртуальный адрес делится на номер виртуальной страницы
(старшие биты) и смещение (младшие биты). К примеру, при 16-разрядной адресации
и размере страниц 4 Кбайт старшие 4 бита могут определять одну из 16 виртуальных
страниц, а младшие 12 бит — смещение в байтах (от 0 до 4095) внутри выбранной
страницы. Но для страницы также можно выделить 3, или 5, или какое-нибудь другое
количество битов. Различные варианты выделения подразумевают различные размеры
страниц.
Номер виртуальной страницы используется в качестве индекса внутри таблицы стра-
ниц, который нужен для поиска записи для этой виртуальной страницы. Из записи
в таблице страниц берется номер страничного блока (если таковой имеется). Номер
страничного блока присоединяется к старшим битам смещения, заменяя собой номер
виртуальной страницы, чтобы сформировать физический адрес, который может быть
послан к памяти.
Таким образом, предназначение таблицы страниц заключается в отображении виртуаль-
ных страниц на страничные блоки. С математической точки зрения таблица страниц —
это функция, в которой в качестве аргумента выступает номер виртуальной страницы,
а результатом является номер физического блока. При использовании результата этой
функции поле виртуальной страницы в виртуальном адресе можно заменить полем
страничного блока, формируя таким образом адрес физической памяти.
В данной главе нас интересует только виртуальная память, а не полная виртуализация.
Иными словами, нам пока не до виртуальных машин. В главе 7 будет показано, что
каждая виртуальная машина требует собственной виртуальной памяти, а в результате
организация таблицы страниц становится гораздо сложнее, при этом привлекаются
теневые или вложенные таблицы страниц, и не только это. Но как мы увидим далее,
даже без таких загадочных конфигураций подкачка и виртуальная память остаются
довольно сложными технологиями.
Структура записи в таблице страниц
Давайте перейдем от общего рассмотрения структуры таблицы страниц к подробностям
отдельной записи в этой таблице. Точный формат записи сильно зависит от конструк-
ции машины, но вид присутствующей в ней информации примерно одинаков для всех
машин. На рис. 3.11 показан пример записи в таблице страниц. Размер варьируется от
компьютера к компьютеру, но обычно он составляет 32 бита. Наиболее важным является
поле номера страничного блока (Page frame number). В конечном счете цель страничного
отображения и состоит в выдаче этого значения. Следующим по значимости является
бит присутствия-отсутствия. Если он установлен в 1, запись имеет смысл и может быть
использована. А если он установлен в 0, то виртуальная страница, которой принадлежит
234
Глава 3. Управление памятью
эта запись, в данный момент в памяти отсутствует. Обращение к записи таблицы страниц,
у которой этот бит установлен в 0, вызывает ошибку отсутствия страницы.
Биты защиты сообщают о том, какого рода доступ разрешен. В простейшей форме это
поле состоит из 1 бита со значением 0 для чтения-записи и значением 1 только для
чтения. При более сложном устройстве имеется 3 бита, по одному для разрешения
чтения, записи и исполнения страницы.
Биты модификации и ссылки отслеживают режим использования страницы. Когда
в страницу осуществляется запись, аппаратура автоматически устанавливает бит моди-
фикации. Этот бит имеет значение, когда операционная система решает регенерировать
страничный блок. Если содержащаяся в нем страница подвергалась модификации (то
есть является измененной), ее нужно сбросить обратно на диск. Если же она не под-
вергалась модификации (то есть является неизмененной), от нее можно отказаться,
поскольку ее дисковая копия не утратила актуальности. Этот бит иногда называется
битом изменения
, поскольку он отражает состояние страницы.
Рис. 3.11. Типичная запись таблицы страниц
Бит ссылки устанавливается при обращении к странице как для чтения, так и для запи-
си. Он призван помочь операционной системе выбрать выселяемую страницу при воз-
никновении ошибки отсутствия страницы. Страницы, к которым не было обращений,
являются более предпочтительными кандидатами, чем востребуемые, и этот бит играет
важную роль в ряде алгоритмов замещения страниц, которые будут рассмотрены далее
в этой главе.
И наконец, оставшийся бит позволяет блокировать кэширование страницы. Эта воз-
можность актуальна для тех страниц, которые отображаются на регистры устройств,
а не на память. Если операционная система вошла в цикл ожидания отклика какого-
нибудь устройства ввода-вывода на только что выданную ею команду, очень важно,
чтобы аппаратура продолжала извлечение слова из устройства, а не использовала старую
копию, попавшую в кэш. Благодаря этому биту кэширование может быть отключено. Те
машины, у которых есть отдельное пространство ввода-вывода и которые не используют
ввод-вывод с отображением данного пространства в память, в этом бите не нуждаются.
Заметьте, что адрес на диске, который используется для хранения страницы, в табли-
це страниц не фигурирует. Причина проста. В таблице страниц содержится только
та информация, которая нужна оборудованию, чтобы перевести виртуальный адрес
в физический. Информация, необходимая операционной системе для обработки ошиб-
ки отсутствия страницы, содержится в таблицах программного обеспечения внутри
операционной системы. Оборудование в них не нуждается.
Перед более глубоким погружением в вопросы реализации стоит еще раз отметить, что
в принципе виртуальная память создает новую абстракцию — адресное пространство,
3.3. Виртуальная память
235
которое является абстракцией физической памяти точно так же, как процесс является
абстракцией физического процессора (ЦПУ). Виртуальная память может быть реа-
лизована за счет разбиения виртуального адресного пространства на страницы и ото-
бражения каждой страницы на какой-нибудь страничный блок физической памяти
или содержания ее (временно) в неотображенном состоянии. Поэтому в этой главе
речь идет в основном об абстракции, созданной операционной системой, и о том, как
эта абстракция управляется.
3.3.3. Ускорение работы страничной организации памяти
После того как мы рассмотрели основы виртуальной памяти и страничной органи-
зации, настало время углубиться в подробности возможных вариантов реализации.
В любой системе со страничной организацией памяти необходимо рассмотреть два
основных вопроса.
1. Отображение виртуального адреса на физический должно быть быстрым.
2. Если пространство виртуальных адресов слишком обширное, таблица страниц
будет иметь весьма солидный размер.
Первый пункт является следствием того, что отображение виртуальной памяти на фи-
зическую должно осуществляться при каждом обращении к памяти. Все команды в ко-
нечном счете должны поступать из памяти, и многие из них ссылаются на операнды,
которые также находятся в памяти. Следовательно, при выполнении каждой команды
необходимо обращаться к таблице страниц один, два или более раз. Если выполнение
команды занимает, скажем, 1 нс, то поиск в таблице страниц, чтобы не стать главным
узким местом, должен быть произведен не более чем за 0,2 нс.
Второй пункт следует из факта, что все современные компьютеры используют как
минимум 32-разрядные виртуальные адреса, но все более обычными для настольных
компьютеров и ноутбуков становятся 64-разрядные адреса. При размере страницы, ска-
жем, 4 Кбайт 32-разрядное адресное пространство имеет 1 млн страниц, а 64-разрядное
адресное пространство имеет намного больше страниц, чем вам может понадобиться.
При 1 млн страниц в виртуальном адресном пространстве таблица страниц должна
содержать 1 млн записей. Также следует помнить, что каждому процессу требуется
собственная таблица страниц (поскольку у него собственное виртуальное адресное
пространство).
Потребность в обширном и быстром отображении страниц является весьма суще-
ственным ограничением на пути создания компьютеров. Простейшая конструкция
(по крайней мере, концептуально) состоит в использовании одной таблицы страниц,
состоящей из массива быстродействующих аппаратных регистров, имеющей по одной
записи для каждой виртуальной страницы, проиндексированной по номеру виртуаль-
ной страницы (см. рис. 3.10). При запуске процесса операционная система загружает
регистры таблицей страниц этого процесса, которая берется из копии, хранящейся
в оперативной памяти. Во время выполнения процесса таблице страниц не нужны
никакие дополнительные ссылки на память. Преимуществами этого метода являются
простота и отсутствие каких-либо обращений к памяти во время отображения. Его
недостаток — в чрезмерных затратах при большом размере таблицы страниц, что
зачастую просто непрактично. Еще один недостаток заключается в необходимости
загрузки всей таблицы страниц при каждом переключении контекста, что полностью
убьет производительность.