Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Тема 7 Память (арх комn).doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
388.1 Кб
Скачать
    1. Виртуальная память

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

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

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

Системы виртуальной памяти можно разделить на два класса: системы с фиксированным размером блоков, называемых страницами, и системы с переменным размером блоков, называемых сегментами. Ниже рассмотрены оба типа организации виртуальной памяти.

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

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

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

Для увеличения эффективности такого типа схем в процессорах используется специальная полностью ассоциативная кэш-память, которая также называется буфером преобразования адресов (TLB traнсlation-lookaside buffer). Хотя наличие TLB не меняет принципа построения схемы страничной организации, с точки зрения защиты памяти, необходимо предусмотреть возможность очистки его при переключении с одной программы на другую.

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

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

Следствием такого использования является значительный рост таблиц страниц каждого пользователя. Одно из решений проблемы сокращения длины таблиц основано на введении многоуровневой организации таблиц. Частным случаем многоуровневой организации таблиц является сегментация при страничной организации памяти. Необходимость увеличения адресного пространства пользователя объясняется желанием избежать необходимости перемещения частей программ и данных в пределах адресного пространства, которые обычно приводят к проблемам переименования и серьезным затруднениям в разделении общей информации между многими задачами.

Рассмотрим подробнее, что представляет собой страничная организация виртуальной памяти.

Идею о разделении понятий адресного пространства и адресов памяти выдвинула группа ученых из Манчестера. Рассмотрим в качестве примера типичный компьютер того времени с 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 и т. д. Другими словами, мы отображаем адресное пространство на действительные адреса памяти (рис. 7.2).

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

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

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

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

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

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

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

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

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

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

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

Реализация страничной организации памяти

Виртуальной памяти требуется диск для хранения всей программы и всех данных. Копию программы, сохраненную на диске, удобнее рассматривать как оригинал, а фрагменты, регулярно записываемые в основную память, - как копии. Естественно, оригинал в таком случае должен оперативно обновляться. Когда изменения вносятся в копию программы в основной памяти, они в конечном итоге должны быть отражены в оригинале.

Виртуальное адресное пространство разбивается на ряд страниц равного размера, обычно от 512 байт до 64 Кбайт, хотя иногда встречаются страницы по 4 Мбайт. Размер страницы всегда должен быть степенью двойки. Физическое адресное пространство тоже разбивается на части равного размера таким образом, чтобы каждая такая часть основной памяти вмещала ровно одну страницу. Эти части основной памяти называются страничными кадрами. На рис. 7.2 основная память содержит только один страничный кадр. На практике обычно имеются несколько тысяч страничных кадров.

На рис. 7.3, а показан один из возможных вариантов разделения первых 64 Кбайт виртуального адресного пространства на страницы по 4 Кбайт. Адрес может быть байтом, а может быть словом, например, в компьютере, в котором последовательно расположенные слова имеют последовательные адреса. Виртуальную память, изображенную на рис. 7.3, можно реализовать посредством таблицы страниц, в которой количество элементов равно количеству страниц в виртуальном адресном пространстве. Здесь для простоты мы показали только первые 16 элементов. Когда программа пытается обратиться к слову из первых 64 Кбайт виртуальной памяти, чтобы вызвать команду или данные или чтобы сохранить данные, сначала она генерирует виртуальный адрес от 0 до 65 532 (предполагается, что адреса слов должны делиться на 4). Для этого могут использоваться любые стандартные механизмы адресации, в том числе индексирование и косвенная адресация.

На рисунке 7.3, б изображена физическая память, состоящая из восьми страничных кадров по 4 Кбайт. Эту память можно ограничить до 32 К, поскольку: 1) это вся память машины (для процессора, встроенного в стиральную машину или микроволновую печь, этого достаточно) или 2) оставшаяся часть памяти занята другими программами.

Рис. 7.3. Первые 64 Кбайт виртуального адресного пространства разделены на 16 страниц по 4 Кбайт каждая (а); 32 Кбайт основной памяти разделены на 8 страничных кадров по 4 Кбайт каждый (б)

А теперь посмотрим, как 32-разрядный виртуальный адрес можно отобразить на физический адрес основной памяти. В конце концов, память воспринимает только реальные, а не виртуальные адреса, поэтому такое отображение должно быть сделано. Каждый компьютер с виртуальной памятью содержит устройство для отображения виртуальных адресов на физические. Это устройство называется диспетчером памяти (Memory Management Unit, MMU). Он может находиться на микросхеме процессора или на отдельной микросхеме рядом с процессором. В нашем примере диспетчер памяти отображает 32-разрядный виртуальный адрес на 15-разрядный физический адрес, поэтому ему требуется 32-разрядный входной регистр и 15-разрядный выходной.

Чтобы понять, как работает диспетчер памяти, рассмотрим пример на рис. 6.4. Когда в диспетчер памяти поступает 32-разрядный виртуальный адрес, он разделяет этот адрес на 20-разрядный номер виртуальной страницы и 12-разрядное смещение внутри этой страницы (поскольку страницы в нашем примере имеют размер 4 Кбайт). Номер виртуальной страницы используется в качестве индекса в таблице страниц для нахождения нужной страницы. На рис. 7.4 номер виртуальной страницы равен 3, поэтому в таблице выбирается элемент 3.

Сначала диспетчер памяти проверяет, находится ли нужная страница в текущий момент в памяти. Поскольку у нас есть 220 виртуальных страниц и всего 8 страничных кадров, не все виртуальные страницы могут находиться в памяти одновременно. Диспетчер памяти проверяет бит присутствия в данном элементе таблицы страниц. В нашем примере этот бит равен 1. Это значит, что страница в данный момент находится в памяти.

Рис. 7.4. Формирование адреса основной памяти из адреса виртуальной памяти

Далее из выбранного элемента таблицы нужно взять значение страничного кадра (в нашем примере - 6) и скопировать его в старшие 3 бита 15-разрядного выходного регистра. Нужно именно 3 бита, потому что в физической памяти находится 8 страничных кадров. Параллельно с этой операцией младшие 12 бит виртуального адреса (поле смещения страницы) копируются в младшие 12 бит выходного регистра. Затем полученный 15-разрядный адрес отправляется в кэш-память или основную память для поиска.

На рис. 7.5 показан возможный вариант отображения виртуальных страниц на физические страничные кадры. Виртуальная страница 0 находится в страничном кадре 1. Виртуальная страница 1 находится в страничном кадре 0. Виртуальной страницы 2 нет в основной памяти. Виртуальная страница 3 находится в страничном кадре 2. Виртуальной страницы 4 нет в основной памяти. Виртуальная страница 5 находится в страничном кадре 6 и т. д.

Рис. 7.5. Возможное отображение первых 16 виртуальных страниц в основную память, содержащую 8 страничных кадров