Реклама:

Идею о разделении понятий адресного пространства и адресов памяти выдвинула группа ученых из Манчестера. Рассмотрим в качестве примера типичный компьютер того времени с 16-разрядным полем адреса в командах и 4096 словами памяти. Программа, работающая на таком компьютере, могла обращаться к 65 536 словам памяти (поскольку адреса были 16-разрядными, а 216 = 65 536). Обратите внимание, что число адресуемых слов зависит только от числа битов адреса и никак не связано с числом реально доступных слов в памяти. Адресное пространство такого компьютера состоит из чисел 0, 1,2,65 535, так как это - набор всех возможных адресов. Однако в действительности компьютер мог иметь гораздо меньше слов в памяти.

До изобретения виртуальной памяти приходилось проводить жесткое различие между адресами, меньшими 4096, и адресами, равными или большими 4096. Эти две части рассматривались как полезное адресное пространство и бесполезное адресное пространство соответственно (адреса выше 4095 были бесполезными, поскольку они не соответствовали реальным адресам памяти). Никакого различия между адресным пространством и адресами памяти не проводилось, поскольку между ними подразумевалось взаимно-однозначное соответствие.

Идея разделения понятий адресного пространства и адресов памяти состоит в следующем. В любой момент времени можно получить прямой доступ к 4096 словам памяти, но это не значит, что они непременно должны соответствовать адресам памяти от 0 до 4095. Например, мы могли бы сообщить компьютеру, что при обращении к адресу 4096 нужно использовать слово из памяти с адресом 0, при обращении к адресу 4097 - слово из памяти с адресом 1, при обращении к адресу 8191 - слово из памяти с адресом 4095 и т. д. Другими словами, мы отображаем адресное пространство на действительные адреса памяти (рис. 6.2).

Согласно этой схеме отображения адресов адресного пространства на фактические ячейки памяти, в машине с объемом памяти 4 Кбайт (без виртуальной памяти) между адресами от 0 до 4095 и словами памяти числом 4096 существует прямое соответствие. Возникает интересный вопрос: а что произойдет, если программа совершит переход к одному из адресов в диапазоне от 8192 по 12 287? В машине без виртуальной памяти произойдет ошибка, на экран будет выведено сообщение о несуществующем адресе памяти, и выполнение программы прервется.

1 Строго говоря, сверхбольшие интегральные микросхемы, на которых сейчас располагаются микропроцессоры, в том числе и упоминаемый автором процессор Pentium 4, не являются компьютерами. Компьютер должен содержать, помимо процессора, память и контроллер для управления ею, устройства ввода-вывода и соответствующие контроллеры для управления ими. - Примеч. научн. ред.

Рис. 6.2. Виртуальные адреса памяти с 4096 по 8191 отображаются на адреса основной памяти с 0 по 4095

В машине с виртуальной памятью произойдет следующее:

1. Содержимое основной памяти будет сохранено на диске.

2. Слова с 8192 по 12 287 будут сохранены на диске.

3. Слова с 8192 до 12 287 будут загружены в основную память.

4. Отображение адресов изменится: адреса с 8192 по 12 287 будут соответствовать ячейкам памяти с 0 по 4095.

5. Выполнение программы продолжится, как будто ничего необычного не случилось.

Такая технология автоматического наложения называется страничной организацией памяти, а фрагменты программы, которые считываются с диска, - страницами.

Есть и другой, более сложный способ отображения адресов адресного пространства программы на реальные адреса памяти. Адреса, к которым программа может обращаться, мы будем называть виртуальным адресным пространством, а реальные адреса памяти, реализованные аппаратно, - физическим адресным пространством. В карте памяти, или таблице страниц, виртуальные адреса соотносятся с физическими. Предполагается, что на диске достаточно места для хранения полного виртуального адресного пространства (или, по крайней мере, той его части, которая используется в данный момент).

Программы пишутся так, как будто в основной памяти хватает места для размещения всего виртуального адресного пространства, даже если это не соответствует действительности. Программы могут загружать слова из виртуального адресного пространства или записывать слова в виртуальное адресное пространство, несмотря на то, что на самом деле физической памяти для этого не хватает. Программист может писать программы, даже не осознавая, что существует виртуальная память. Просто создается такое впечатление, что объем памяти данного компьютера достаточно велик.

Позднее мы сопоставим страничную организацию памяти с процессом сегментации, при котором программисту требуется знать о существовании сегментов. Еще раз подчеркнем, что страничная организация памяти создает иллюзию линейной основной памяти такого же размера, как адресное пространство программы. В действительности основная память может быть меньше (или больше), чем виртуальное адресное пространство. То, что память большого размера про-

Страничная организация памяти

сто моделируется путем страничной организации памяти, нельзя определить по программе (только за счет тестирования). При обращении к любому адресу всегда появляются требуемые данные или нужная команда. Поскольку программист может писать программы, ничего не зная о страничной организации памяти, этот механизм называют прозрачным.

Ситуация, когда программист использует какой-либо виртуальный механизм и даже не знает, как он работает, не нова. В архитектуры команд, например, часто включается команда MUL (умножение), даже если аппаратно умножение не поддерживается. Иллюзия того, что машина может перемножать числа, создается микропрограммой. Точно так же операционная система может создавать иллюзию, что все виртуальные адреса поддерживаются реальной памятью, даже если это неправда. Только разработчикам и исследователям операционных систем нужно знать, как строится такая иллюзия.

Виртуальная память || Оглавление || Реализация страничной организации памяти