Виртуальная память

Теория

Лабораторная работа 6 Виртуальная память

Дескрипторы виртуальных адресов

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

Диспетчер памяти использует этот же механизм и при формировании таблиц страниц. Например, когда поток передает с помощью VirtualAlloc, диспетчер памяти мог бы немедленно создать таблицы страниц, необходимые для доступа ко всему объему выделенной памяти. Вместо этого диспетчер виртуальной памяти откладывает формирование таблицы страниц до тех пор, пока поток не вызовет ошибку страницы. Как же тогда диспетчер виртуальной памяти определяет, какие адреса свободны? Чтобы решить эту проблему диспетчер поддерживает набор структур данных, которые позволяют вести учет зарезервированных и свободных виртуальных адресов в адресном пространстве процесса. Эти структуры данных называются дискрипторами виртуальных адресов (virtual address descriptors, VAD). Для каждого процесса диспетчер памяти поддерживает свой набор VAD, описывающий состояние адресного пространства этого процесса.

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

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

В современном компьютере процесс может выполнять инструкции или загружать данные, которые расположены в первичной памяти (RAM). Первичная память маленькая и быстрая по сравнению со вторичной памятью. Она также значительно дороже. В большинстве компьютеров не хватит первичной памяти, даже для хранения виртуального адресного пространства одного процесса. Но в то же время во вторичной памяти имеется достаточно места для хранения виртуальных адресных пространств нескольких процессов. Однако следует учитывать разницу в скорости – запись/чтение байта в первичной памяти требует пару циклов процессора, а во вторичной – тысячи циклов процессора.

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

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

Вторичная память – блочная. Если необходимо слово, то для его получения необходимо прочитать целый блок (т.е. в первичную память перемещается целый блок). Загружать целые блоки, а не отдельные слова выгоднее. Когда поток обращается (ссылается) на i существует большая вероятность, что он дальше будет ссылаться на i+1. Страничная виртуальная память загружает и выгружает блоки фиксированного размера, называемые страницами, между первичной и вторичной памятью. Границы страниц прозрачны для программиста.

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

 

Рис. 9. Страничная система

Когда поток обращается по виртуальному адресу k (шаг 1) , система виртуальной памяти сначала определяет номер страницы, содержащий виртуальный адресk(шаг 2). Если эта страница уже загружена в первичную память (шаг 3), то система виртуальной памяти транслирует виртуальный адрес в физический (тот страничный фрейм, где размещена эта страница).

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

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

Windows NT использует страничную систему виртуальной памяти. Существует несколько уникальных особенностей виртуальной памяти NT, поэтому далее мы рассмотрим именно реализацию NT.