Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Итог / +Раздел VIII. Операционные системы.doc
Скачиваний:
99
Добавлен:
23.03.2015
Размер:
278.53 Кб
Скачать

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

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

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

Виртуальная память позволяет решать две задачи. Во-первых, снимается ограничение на размер адресуемого адресного пространства, расширяя его на весь возможный для заданной разрядности процессора диапазон виртуальных адресов.

Во-вторых, использование виртуальной памяти позволяет решать задачу обеспечение контроля доступа к отдельным сегментам памяти и, в частности, защиту пользовательских программ друг от друга и защиту ОС от пользовательских программ.

Средства поддержки виртуальной памяти можно разделить на аппаратно-зависимый и аппаратно-независимый компоненты. Аппаратно-зависимый компонент в первую очередь отвечает за организацию

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

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

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

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

Виртуальный адрес в страничной системе состоит из двух частей p и d, где p – номер страницы в виртуальной памяти, а d – смещение в рамках страницы p.

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

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

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

Зарезервировано

Блокирование кэширование

R

M

Защита RWX

Присутствие/ отсутствие

Номер кадра

Номер кадра - номер страничного кадра, соответствующего виртуальной странице.

Присутствие/отсутствие - если этот бит равен 1, то страница в памяти. Если 0, то страница отсутствует в памяти Защита. Используется для указания разрешенных видов доступа к странице. В

простейшей форме поле содержит один бит, равный 1 для чтения/записи или 0 только для

чтения. Иногда используются три бита для разрешения чтения, записи и выполнения

страницы.Изменение (M). Устанавливается аппаратно при модификации содержимого страницы.

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

В простейшем случае записи таблицы упорядочены по номерам виртуальных страниц.

Динамическое преобразование адресов выполняется следующим образом:

  1. Процесс обращается по виртуальному адресу v = (p,d).

  2. Механизм отображения ищет номер страницы p в таблице страниц и определяет, номер страничного кадра p'.

  3. Реальный адрес формируется p' и d.

Для экономии оперативной памяти можно использовать многоуровневую таблицу

страниц, исключая необходимость постоянного хранения в памяти всех таблиц страниц.

Например, рассмотрим организацию двухуровневой таблицы. В этом случае виртуальный адрес состоит из трех полей:

PT1

PT2

Смещение

Поля имеют следующее значение:

  1. РТ1 хранит адреса таблиц второго уровня в таблице первого уровня;

  2. РT2 хранит адреса страниц;

  3. поле смещения.

Поле РT1 используется как индекс таблицы верхнего уровня, а поле PT2 как индекс таблицы второго уровня для поиска номера страничного блока. Например, если виртуальный адрес состоит из 32 бит, можно использовать следующее распределение размеров полей: РТ1 - 10 бит, РТ2 - 10 бит и смещение 12 бит (размер страницы 2^12=4 Кбайт). Тогда таблица первого уровня содержит адреса 2^10=1024 таблиц второго уровня, каждая из которых содержит адреса 2^10=1024 страниц (адресует 4 Мбайта памяти). В многоуровневой таблице можно избегать постоянного содержания в памяти всех

таблиц страниц, оставляя таблицу первого уровня и таблицы второго уровня, которые требуются текущему процессу.

Для 64-разрядных компьютеров адресное пространство составляет 2^64 байт. С размером страницы 4 Кбайт, требуется таблица страниц с 2^52 записями. Если каждая запись равна 8 байтам, таблица займет больше 30 Тбайт!!!

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

Размер инвертированной таблицы зависит только от размера основной памяти. Для ускорения преобразования адресов используется буфера быстрого преобразования адреса (TLB – Translation Lookaside Buffer), который обычно находится внутри устройства управления памятью (MMU).

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

Принцип работы буфера можно кратко представить в виде следующей последовательности действий:

  1. Процессор выставляет виртуальный адрес на шину для отображения.

  2. MMU проверяет наличие номера виртуальной страницы в буфере TLB.

  3. Если номер есть, и обращение не нарушает биты защиты, то номер страничного блока берется из буфера TLB.

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

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

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

Логический адрес строится как упорядоченная пара v=(s,d), номер сегмента и смещение

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

  • Каждая подпрограмма может занимать отдельный сегмент и адресоваться относительно его начала.

  • Сегментация облегчает совместное использование процедур и данных несколькими процессами. Совместно используемые данные и код могут располагаться в отдельных сегментах и достаточно включить эти сегменты в адресное пространство нескольких процессов.

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

  • Упрощается перемещение сегмента в памяти. Если изменилось положение сегмента, то достаточно изменить базовый адрес в таблице сегментов.

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

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

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

  1. В сегментный регистр загружается селектор. Поле защиты селектора сравнивается с полем защиты процесса, которое хранится в PSW. При несовпадении возникает прерывание.

  2. Дескриптор, соответствующий селектору, извлекается из таблицы и записывается во внутренние регистры процессора.

  3. Если сегмент не существует или в данный момент выгружен, а также если смещение выходит за пределы сегмента, то возникает прерывание.

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

Контекст каждого процесса содержит набор сегментных регистров, содержащих

селекторы текущих сегментов кода, стека, данных и др. Это позволяет процессору на

аппаратном уровне определять допустимость обращений к памяти.

Сегментно-страничная организация памяти.

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

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

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