Технология виртуализации касается разных сторон вычислительной системы. Это — разделение сервера на несколько виртуальных машин, каждая из которых способна выполнять собственную операционную систему и прикладную среду. Это — виртуализация внешних устройств. Наконец это — виртуализации памяти.
Виртуализация памяти (виртуальная память) — метод автоматического управления иерархической памятью, при котором программисту кажется, что он имеет дело с единой памятью большой емкости и высокого быстродействия. Нижний слой памяти может включать память на магнитных дисках, сеть и другие элементы.
Идея виртуальной памяти возникла из желания выполнять программы большего размера чем ОЗУ. Вначале стали использовать оверлейную структуру программ, когда большая программа разбивается на отдельные модули перекрытия — оверлеи (overlays). Первый модуль загружается в память и работает. Если ему нужен код или данные, содержащиеся в других модулях, то работающий модуль вызывает функции, загружающие другие модули. При этом программист сам должен отследить:
При этом отметим, что, поскольку вновь загружаемые модули "ложатся" в память на место находившихся там ранее, то
Как альтернатива оверлейной структуре, возникла концепция виртуальной памяти (1961 г, Манчестер). Фактически используется та же идеология перезагрузки модулей — свопинг (swapping), однако замена осуществляется аппаратурой и операционной системой автоматически, без какого-либо участия программиста и незаметно для него (см. рисунок ниже).
При этом программист оперирует адресами в (линейном) виртуальном адресном пространстве задачи, размер которого не меньше размера программы (включающей как исполняемый код так и данные). Каждый объект программы в пространстве виртуальных адресов имеет уникальный адрес. Программа пишется в виртуальных адресах.
Пространство линейных (виртуальных) адресов программы и диапазон физических адресов реально существующей памяти разбиваются на страницы (блоки, сегменты). Старшие адреса виртуального адреса определяют номер страницы, а младшие смещение на странице (см. рис.). Схема трансляции (проектор адресов), основанная на таблице страниц, обеспечивает загрузку новых и удаление старых страниц.
Термин линейный адрес подразумевает, что все адреса, используемые программой, расположены в едином одномерном (линейном) адресном пространстве, и каждый программный объект (элемент данных или команда программного кода) имеет свой уникальный адрес в этом пространстве. В противоположность этому, при использовании оверлейной структуры, один и тот же адрес может соответствовать нескольким объектам из разных модулей (оверлеев), загружаемых в одну область памяти в разные интервалы времени.
Рассмотрим организацию таблицы страниц и механизма замещения. Блоки памяти в рассматриваемом примере имеют одинаковую длину, но это не обязательно. Простейший вариант : размеры блоков (страниц) одинаковы, равны "2к"(2 в степени к) и выровнены по "2-к"(2 в степени к) границам адресов (см. рисунок ниже). Пусть физическая память имеет ограниченный размер "2к+3"(2 в степени к+3) и разбита на 8 страниц, а выполняемая программа содержит N страниц размером "=<2к"(меньше, либо равно 2 в степени к). Для установления соответствия операционная система формирует в системной области памяти таблицу страниц, которая содержит информацию о всех блоках выполняемой программы.
Запись для каждого блока содержит обычно следующие поля:
1) Место на внешнем носителе, где расположен блок. Туда ОС обращается, когда требуется загрузить данный блок в физическую память. При этой загрузке ОС должна выбрать свободную страницу физической памяти, загрузить туда страницу с диска, а затем заполнить в строке таблицы страниц два поля:
2) записать номер страницы физической памяти, куда записана страница, а также установить
3) "бит присутствия" БП, который говорит о том, что данная страница находится в ОЗУ , в соответствующей строке таблицы автоматически устанавливается
4) "бит изменения" БИ устанавливается, если при работе программы в данную страницу происходит запись, т.е. страница подвергается модификации. Этот бит будет использован, если данная страница удаляется из ОЗУ, поскольку на его место требуется поместить в память новую страницу. Старую страницу требуется сохранять на диске только в том случае, если бит изменения был установлен, (т.е. страница была изменена).
Обычно для записи информации о местоположении страницы на диске (номер блока/сектора) используется специальная таблица — карта диска. Рассмотрим более подробно, как работает виртуальная память. Линейный (виртуальный ) адрес состоит из двух частей: номера страницы и адреса внутри страницы. По номеру страницы выбирается строка таблицы страниц. Если бит присутствия установлен в "1", то страница в ОЗУ есть. Виртуальный номер страницы замещается реальным номером страницы в ОЗУ, взятым из строки таблицы. Происходит обращение к странице ОЗУ с учетом смещения. Если бит присутствия установлен в "0", то это значит данной страницы в ОЗУ нет. Происходит прерывание и загрузка нужной страницы с установкой бита присутствия в "1". Затем формируется реальный адрес и считывается/ записывается операнд. Загрузку страниц определяют три группы правил.
Методы выборки определяют правила выбора загружаемой в память страницы. Известны три правила:
1. Подкачка по требованию. Очередная страница в физическую память загружается только при страничной ошибке, а именно, только при отсутствии нужной страницы. При начальной загрузке программы или массива вызывается множество страничных ошибок, а затем интенсивность потока страничных ошибок снижается.
2. Подкачка по требованию с кластеризацией. При страничной ошибке загружается не только страница, вызвавшая ошибку, но и несколько последующих страниц. Эта стратегия обеспечивает минимизацию числа операций ввода-вывода, связанных с подкачкой. Размер кластера зависит от объема цизической памяти и составляет 2-8 страниц.
3. Упреждающая подкачка. Страница в ОЗУ загружается еще до того момента, когда она потребуется, т.е. по предположению. Эта стратегия обеспечивает максимальное быстродействие в системе. Однако, трудно определить какая страница понадобиться в будущем и возможны случаи, когда загружается не нужная страница.
Определяют местоположения подкачиваемой страницы в памяти с учетом размеров кэшей и стремления свести нагрузку на них к минимуму. В мультипроцессорных сиcтемах правила размещения страниц по узлам системы определяются программным обеспечением.
Политика замещения определяет какую страницу можно убрать из памяти при вызове новой страницы. Выбирать такую страницу наугад нельзя. Если, например, убрать из памяти страницу с командой, которая вызвала ошибку, то при повторном выполнении команды или при выполнении следующей команды произойдет еще одна ошибка из-за отсутствия страницы. Необходимо удалять из памяти те страницы, которые не будут нужны долгое время. Однако будущее использование страниц предсказать невозможно, поэтому используют алгоритмы основываясь на истории обращиний к страницам. Эти алгоритмы очень похожи на метода замещения кэш-строк.
LRU ( Least Recently Used). Замещается та страница, к которой дольше всего не было обращения.
FIFO (First In First Out). Здесь заменяется страница, дольше всего находившаяся в памяти.
Правила замены могут быть глобальными или локальными. При глобальной замене выгружается самая старая страница всех процессов, а при локальной — только текущего, при работе которого произошла страничная ошибка.
За счет виртуального механизма решаются следующие вопросы: