link0 link1 link2 link3 link4 link5 link6 link7 link8 link9 link10 link11 link12 link13 link14 link15 link16 link17 link18 link19 link20 link21 link22 link23 link24 link25 link26 link27 link28 link29 link30 link31 link32 link33 link34 link35 link36 link37 link38 link39 link40 link41 link42 link43 link44 link45 link46 link47 link48 link49 link50 link51 link52 link53 link54 link55 link56 link57 link58 link59 link60 link61 link62 link63 link64 link65 link66 link67 link68 link69 link70 link71 link72 link73 link74 link75 link76 link77 link78 link79 link80 link81 link82 link83 link84 link85 link86 link87 link88 link89 link90 link91 link92 link93 link94 link95 link96 link97 link98 link99 link100 link101 link102 link103 link104 link105 link106 link107 link108 link109 link110 link111 link112 link113 link114 link115 link116 link117 link118 link119 link120 link121 link122 link123 link124 link125 link126 link127 link128 link129 link130 link131 link132 link133 link134 link135 link136 link137 link138 link139

PersCom — Компьютерная Энциклопедия Компьютерная Энциклопедия

Память. Верхний уровень

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

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

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

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

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

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

При этом отметим, что, поскольку вновь загружаемые модули "ложатся" в память на место находившихся там ранее, то

  1. разные объекты программы, находящиеся в разных модулях, но попадающие в одно и то же место физической памяти получают одни и те же физические адреса;
  2. расходуется время на перезагрузку модулей;
  3. фрагментируется память, поскольку модули имеют разные размеры;
  4. для работы в другой конфигурации памяти требуется перекомпоновка программы.

Как альтернатива оверлейной структуре, возникла концепция виртуальной памяти (1961 г, Манчестер). Фактически используется та же идеология перезагрузки модулей — свопинг (swapping), однако замена осуществляется аппаратурой и операционной системой автоматически, без какого-либо участия программиста и незаметно для него (см. рисунок ниже).

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

Схема организации виртуальной памяти

Принципы организации виртуальной памяти

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

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

Рассмотрим организацию таблицы страниц и механизма замещения. Блоки памяти в рассматриваемом примере имеют одинаковую длину, но это не обязательно. Простейший вариант : размеры блоков (страниц) одинаковы, равны "2к"(2 в степени к) и выровнены по "2-к"(2 в степени к) границам адресов (см. рисунок ниже). Пусть физическая память имеет ограниченный размер "2к+3"(2 в степени к+3) и разбита на 8 страниц, а выполняемая программа содержит N страниц размером "=<2к"(меньше, либо равно 2 в степени к). Для установления соответствия операционная система формирует в системной области памяти таблицу страниц, которая содержит информацию о всех блоках выполняемой программы.

Схема виртуальной памяти на основе страниц

Запись для каждого блока содержит обычно следующие поля:

1) Место на внешнем носителе, где расположен блок. Туда ОС обращается, когда требуется загрузить данный блок в физическую память. При этой загрузке ОС должна выбрать свободную страницу физической памяти, загрузить туда страницу с диска, а затем заполнить в строке таблицы страниц два поля:

2) записать номер страницы физической памяти, куда записана страница, а также установить

3) "бит присутствия" БП, который говорит о том, что данная страница находится в ОЗУ , в соответствующей строке таблицы автоматически устанавливается

4) "бит изменения" БИ устанавливается, если при работе программы в данную страницу происходит запись, т.е. страница подвергается модификации. Этот бит будет использован, если данная страница удаляется из ОЗУ, поскольку на его место требуется поместить в память новую страницу. Старую страницу требуется сохранять на диске только в том случае, если бит изменения был установлен, (т.е. страница была изменена).

Обычно для записи информации о местоположении страницы на диске (номер блока/сектора) используется специальная таблица — карта диска. Рассмотрим более подробно, как работает виртуальная память. Линейный (виртуальный ) адрес состоит из двух частей: номера страницы и адреса внутри страницы. По номеру страницы выбирается строка таблицы страниц. Если бит присутствия установлен в "1", то страница в ОЗУ есть. Виртуальный номер страницы замещается реальным номером страницы в ОЗУ, взятым из строки таблицы. Происходит обращение к странице ОЗУ с учетом смещения. Если бит присутствия установлен в "0", то это значит данной страницы в ОЗУ нет. Происходит прерывание и загрузка нужной страницы с установкой бита присутствия в "1". Затем формируется реальный адрес и считывается/ записывается операнд. Загрузку страниц определяют три группы правил.

Правила выборки, размещения, замены страниц

Правила выборки страниц (fetch policy)

Методы выборки определяют правила выбора загружаемой в память страницы. Известны три правила:

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

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

3. Упреждающая подкачка. Страница в ОЗУ загружается еще до того момента, когда она потребуется, т.е. по предположению. Эта стратегия обеспечивает максимальное быстродействие в системе. Однако, трудно определить какая страница понадобиться в будущем и возможны случаи, когда загружается не нужная страница.

Правила размещения (placement policy)

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

Правила замены (replacement policy)

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

LRU ( Least Recently Used). Замещается та страница, к которой дольше всего не было обращения.

FIFO (First In First Out). Здесь заменяется страница, дольше всего находившаяся в памяти.

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

За счет виртуального механизма решаются следующие вопросы:

  1. Выполнение программы, объем которой превышает объем физической памяти.
  2. Независимость работоспособности программы от места ее расположения в физической памяти и от конфигурации этой памяти.
  3. Динамическое распределение памяти.
  4. Независимость (легкая сопрягаемость) разрядности компонентов логических адресов в программе (указателей), разрядности линейного адреса, разрядности физического адреса и реального объема памяти, установленной в системе.