7. Страничная организация памяти
Адреса могут формироваться с использованием
индексации, базовых регистров, сегментных регистров и другими путями.
Эти программно формируемые адреса, называемые виртуальными
адресами, формируют виртуальное
адресное пространство. На компьютерах без виртуальной памяти
виртуальные адреса подаются непосредственно на шину памяти и вызывают для
чтения или записи слово в физической памяти с тем же самым адресом. Когда
используется виртуальная память, виртуальные адреса не передаются напрямую
шиной памяти. Вместо этого они передаются диспетчеру памяти (MMU — Memory
Management Unit), который
отображает виртуальные адреса на физические адреса памяти.
Пространство виртуальных
адресов разделено на единицы, называемые страницами. Соответствующие
единицы в физической памяти называются страничными блоками (page frame).
Страницы и их блоки имеют всегда одинаковый размер. размеры страниц от 512
байт до 64 Кбайт. Имея 64 Кбайт виртуального адресного пространства и 32 Кбайт
физической памяти, мы получаем 16 виртуальных страниц и 8 страничных блоков.
Передача данных между ОЗУ и диском всегда происходит в страницах.
размер виртуального адресного
пространства больше физической памяти.
Что происходит, если
программа пытается воспользоваться неотображаемой страницей, например, с
помощью инструкции
Диспетчер памяти замечает, что страница не
отображается, и инициирует прерывание центрального процессора. Такое прерывание
называется ошибкой из-за отсутствия страницы или страничным прерыванием (page fault).
Операционная система выбирает малоиспользуемый страничный блок и записывает
его содержимое на диск. Затем она считывает с диска страницу, на которую
произошла ссылка, в только что освободившийся блок, изменяет карту отображения
и запускает заново прерванную команду.
Номер страницы используется в
качестве индекса в таблице страниц, выдающей номер страничного блока,
соответствующего виртуальной странице. Если бит Присутствия/отсутствия равен
0, управление переходит к операционной системе. Если этот бит равен 1, то
номер страничного блока, найденный в таблице страниц, записывается в три
старших бита выходного регистра, а 12 битов смещения копируются без изменения
из входящего виртуального адреса. Все вместе они составляют 15-разрядный
физический адрес. Затем выходной регистр помещается на шину памяти как адрес
физической памяти.
Таблицы страниц
отображение виртуальных адресов на физические происходит
так. Виртуальный адрес делится на номер виртуальной страницы (старшие биты) и
сдвиг (младшие биты).
Номер
виртуальной страницы используется как индекс в таблице страниц для поиска
записи этой страницы. По записи в таблице страниц находится номер физического
блока страницы. Данный номер присоединяется к старшим разрядам числа смещения,
замещая номер виртуальной страницы и тем самым формируя физический адрес,
который может быть послан в память.
Назначение
таблицы страниц заключается в отображении виртуальных страниц на страничные
блоки. Говоря математически, таблица страниц — это функция, имеющая в качестве
аргумента номер виртуальной страницы и получающая в результате номер
физического блока. Используя результат действия этой функции, поле виртуальной
страницы в виртуальном адресе может быть заменено полем страничного блока,
таким образом, формируется физический адрес.
Несмотря на столь простое описание, нам
придется столкнуться с двумя важными проблемами:
1.
Таблица страниц
может быть слишком большой.
2.
Отображение должно
быть быстрым.
Первый пункт следует из
того факта, что современные компьютеры используют по крайней мере 32-разрядные
виртуальные адреса. При размере страницы, скажем, 4 Кбайт, 32-разрядное
адресное пространство будет состоять из одного миллиона страниц, а 64-разрядное
адресное пространство будет включать в себя намного больше страниц, чем то
количество, с которым вы захотите иметь дело. При одном миллионе страниц в
виртуальном адресном пространстве таблица страниц должна состоять из одного
миллиона записей. И помните, что каждый процесс нуждается в своей собственной
таблице страниц (потому что у него есть свое собственное виртуальное адресное
пространство).
Второй пункт — это вывод из того
факта, что преобразование виртуальных адресов в физические должно быть
выполнено для каждого обращения к ячейке памяти. Типичная команда процессора
включает в себя слово-команду и часто также операнд памяти. В результате
необходимо сделать 1,2 или иногда больше обращений к таблице страниц за
команду. Если выполнение команды занимает, скажем, 4 не, то поиск в таблице
страниц должен быть сделан меньше, чем за 1 не, чтобы преобразование
виртуальных адресов не стало главным узким местом системы.
Многоуровневые таблицы страниц
Чтобы обойти проблему необходимости постоянного
хранения в памяти огромных таблиц страниц, многие компьютеры используют
многоуровневую таблицу страниц. Чтобы избегать постоянного содержания в памяти
всех таблиц страниц. В частности, те части, которые не нужны в данный момент,
не должны храниться в памяти.
Запись, место которой определяется но индексу в таблице
страниц верхнего уровня, выдает адрес или номер страничного блока таблицы
страниц второго уровня.
Если данная страница не находится в памяти, бит Присутствия/отсутствия
в записи таблицы страниц будет равен нулю, что приведет к страничному
прерыванию. Если страница в памяти, то номер страничного блока, взятый из таблицы
страниц второго уровня, присоединяется к смещению (4), создавая физический
адрес. Этот адрес выставляется на шину и передается памяти.
Если операционная система
заметит, что процесс пытается обратиться к области памяти, не предполагающей
ссылок на нее, и предпримет соответствующее действие, например пошлет ему
сигнал или уничтожит его.
Система двухуровневой таблицы может быть расширена для трех,
четырех и больше уровней. Дополнительные уровни дадут большую гибкость, но сомнительно,
что следует усложнять систему больше, чем до трех уровней.
Структура элемента
таблицы страниц
Ее длина изменяется от компьютера к компьютеру, но 32
бита — это наиболее распространенный размер. Наиболее важным полем является Номер
страничного блока. Прежде всего, задачей отображения страниц является
определение этой величины. За этим полем следует бит Присутствия/отсутствия.
Если этот бит равен 1, запись имеет силу и может использоваться. Если он
равен 0, виртуальная страница, которой соответствует эта запись, в данный
момент отсутствует в памяти. Обращение к записи в таблице страниц, у которой
этому биту присвоено нулевое значение, приводит к страничному прерыванию.
Биты Защиты говорят о том, какие разрешены виды
доступа к этой странице. В простейшей форме это поле содержит один бит, равный
1 для чтения/записи и равный 0 только для чтения. Более сложные схемы имеют три
бита, по одному для допуска каждой из операций чтения, записи и выполнения
страницы.
Биты Изменения и Обращения отслеживают использование
страницы. Когда страница записывается, аппаратура автоматически устанавливает
бит Изменение.. Этот бит учитывается, когда операционная система решает
освободить страничный блок. Если страница в нем была изменена (то есть она
«грязная»), то ее новая версия должна быть переписана на диск. Если она не
была модифицирована (то есть страница «чистая»), ее можно просто удалить из
памяти, так как все еще действительна копия на диске. Этот бит иногда называют грязным
битом, так как он отражает состояние страницы.
Бит Обращения устанавливается всякий раз, когда происходит
обращение к странице для чтения или записи. Его значение помогает операционной
системе при выборе страницы для удаления из памяти, когда случается ошибка
из-за отсутствия страницы. Страницы, не использующиеся в данный момент, являются
лучшими кандидатами, чем находящиеся в работе. Этот бит играет важную роль в
нескольких алгоритмах перемещения страниц, которые мы изучим позже в этой
главе.
Наконец, последний бит
позволяет запретить кэширование страницы. Это свойство важно для страниц,
отображающихся не на память, а на регистры устройств. Если операционная система
находится в цикле ожидания ответа от некоторого устройства ввода-вывода,
которому была только что дана команда, существенно, чтобы аппаратура продолжала
получать слово из устройства, а не использовало старую копию, находящуюся в
кэш-памяти. При помощи этого бита кэширование можно отключить. Машины, имеющие
отдельное пространство адресов ввода-вывода и не использующие отображения регистров
ввода-вывода на память, не нуждаются в этом бите. Адрес места на диске, в
котором хранится страница тогда, когда она не находится в памяти, не является
частью таблицы страниц.
|