Оптимизация функционирования страничной виртуальной памяти. Сегментная организация виртуальной памяти. Сегментно-страничная виртуальная память.
Выбери формат для чтения
Загружаем конспект в формате pdf
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
Лекция 8
8.1. Оптимизация функционирования страничной
виртуальной памяти
В настоящее время известно несколько методов повышения эффективности
функционирования страничной виртуальной памяти. К ним относятся [17]:
1. более сложная структуризация виртуального адресного пространства, например,
двухуровневая (типичная для 32-битовой адресации);
2. использование специального высокоскоростного кэша для хранения части
записей таблицы страниц, который обычно называют буфером быстрого
преобразования адреса, или буфером поиска трансляции (translation lookaside
buffer – TLB);
3. выбор оптимального размера страницы виртуальной памяти;
4. эффективное управление страничным обменом.
Остановимся на возможностях реализации этих методов.
Рассмотрим вариант двухуровневой страничной организации. При такой схеме имеется
каталог таблиц страниц, в котором каждая запись указывает на таблицу страниц. Таким
образом, если размер каталога – X, а максимальный размер таблицы страниц – Y, то
процесс может состоять максимум из X и Y страниц. Обычно максимальный размер
таблицы страниц определяется условием ее размещения на одной странице (такой
подход используется в процессоре Pentium).
На рис. 8.1 приведен пример двухуровневой схемы, типичной для 32-битовой
адресации. Подобная схема позволяет существенно сохранить размер пользовательской
таблицы страниц, размещаемой в основной памяти (с 4 Мбайт до 4 Кбайт). В данном
случае виртуальное адресное пространство пользовательского процесса может
составлять 232 = 4 Гбайт. При объеме страницы 212 = 4 Кбайт в этом пространстве
размещается 232 / 212 = 220 страниц. Таким образом, пользовательская таблица
страниц будет иметь 220 4-байтных записей общим объемом 4 Мбайт. Разместить такие
таблицы для нескольких процессов в ОП нереально. В двухуровневой схеме это и не
требуется. В основной памяти постоянно находится корневая таблица, содержащая
1024 записей, указывающих на начальный адрес пользовательской таблицы страниц
(ее объем, как указано выше, 4 Мбайт). Указание на начальный адрес корневой
таблицы (активного процесса) заносится в регистр процессора. Первые 10 бит
виртуального адреса используются для индексации в корневой таблице для поиска
записей о странице пользовательской таблицы.
Рис. 8.1. Двухзвенная схема таблиц страниц
Если страница находится в ОП, то следующие 12 бит виртуального адреса
используются для задания смещения в физической странице ОП. В противном случае
генерируется страничное прерывание, но уже из-за отсутствия нужной страницы
процесса в ОП.
Таким образом, двухуровневая схема, сокращая объем памяти для хранения таблицы
страниц, в общем случае замедляет преобразование виртуального адреса за счет
большего числа возможных страничных прерываний (даже если нет страничного
прерывания, требуется три цикла ОП вместо двух при одноуровневой страничной
организации).
Как уже отмечалось, простая схема страничной виртуальной памяти, по сути, удваивает
время обращения к памяти. Для преодоления этой проблемы большинство реально
применяющихся схем виртуальной памяти используют специальный высокоскоростной
кэш для записей таблицы страниц, который обычно называют буфером быстрой
трансляции адресов – TLB. Этот кэш функционирует так же как и обычный кэш памяти
и содержит те записи таблицы страниц, которые использовались последними.
Организация аппаратной поддержки использования TLB показана на рис. 8.2.
Получив виртуальный адрес, процессор просматривает TLB. Если требуемая запись
найдена, процессор получает адрес физической страницы и формирует реальный
адрес. Если запись в TLB не найдена, то процессор берет номер виртуальной
страницы в качестве индекса для таблицы страниц процесса и просматривает
соответствующую запись. Если бит присутствия в ней установлен, значит, искомая
страница находится в основной памяти, и процессор получает номер физической
страницы из записи таблицы страниц, а затем формирует реальный физический адрес.
Одновременно вносится использованная запись таблицы страниц в TLB.
Рис. 8.2. Буфер быстрой переадресации
Если бит присутствия данной виртуальной страницы не установлен, это означает, что
искомой страницы в оперативной памяти нет. В этом случае процессор генерирует
сигнал страничного прерывания, активизирующий операционную систему, которая
загружает требуемую страницу в оперативную память и обновляет таблицу страниц.
Практика использования виртуальной памяти показала, что для нее справедлив закон
локализации большинства обращений в небольшое количество недавно
использованных страниц. При этом соответствующие записи будут находиться в кэше,
так что с помощью TLB существенно повышается эффективность работы виртуальной
памяти.
В организации TLB имеется ряд особенностей. Поскольку TLB содержит только
некоторые из записей таблицы страниц (32 в процессоре Pentium), индексация записей
в TLB на основе номера страницы не представляется возможной. Вместо этого каждая
запись TLB должна наряду с полной информацией из записи таблицы страниц включать
также номер виртуальной страницы. Процессор аппаратно способен одновременно
опрашивать все записи TLB для определения того, какая из них соответствует
заданному номеру страницы. Такой подход известен как ассоциативное отображение
(associative mapping), в отличие от прямого отображения, или индексирования,
применяемого для поиска в таблице страниц, как показано на рис. 8.3.
Рис. 8.3. Ассоциативная память
Конструкция TLB должна также предусматривать способы организации записей в кэш и
принятия решения о том, какая из старых записей должна быть удалена при внесении в
кэш новой записи.
Следует подчеркнуть, что механизм виртуальной памяти должен взаимодействовать с
кэшем оперативной памяти (кроме TLB). Это взаимодействие показано на рис. 8.4.
Сначала происходит обращение к TLB для выяснения наличия в нем соответствующей
записи таблицы страниц. При положительном результате путем объединения номера
физической страницы, получаемого из TLB, и смещения генерируется физический
адрес. Если требуемой записи в TLB нет, она выбирается из таблицы страниц. После
получения физического адреса в обеих ситуациях выполняется обращение к кэшу для
выяснения наличия в нем блока с требуемым физическим адресом. Если ответ
положительный, то требуемое значение (код или данные) передается процессору. В
противном случае производится выборка слова из основной памяти и обновляется
содержимое кэша основной памяти.
Рис. 8.4. Использование кэша оперативной памяти
При выборе размера страницы нужно учитывать несколько факторов. Один из них –
внутренняя фрагментация, которая напрямую зависит от размера страницы.
Внутренняя фрагментация уменьшается с уменьшением размера страницы. Однако, чем
меньше страницы, тем больше их требуется для процесса, что означает увеличение
размера таблицы страниц. При этом для больших программ в загруженной
многозадачной среде это приведет к тому, что часть страничных таблиц активных
процессов будет находиться в виртуальной памяти, и при отсутствии страницы будет
возникать двойное прерывание: первое – для получения требуемой записи из таблицы
страниц, второе – для получения доступа к требуемой странице процесса.
Такое двойное прерывание существенно снизит производительность виртуальной
памяти. Кроме того, следует учитывать и факт повышения скорости работы диска при
передаче больших блоков данных. Таким образом, страницы небольшого размера
нецелесообразны, поскольку уменьшение внутренней фрагментации в этом случае не
столь значительно по сравнению со снижением производительности виртуальной
памяти.
Проблема выбора размера страницы усложняется еще и тем, что размер страницы
влияет и на частоту возникновения прерывания из-за отсутствия страницы в основной
памяти. На рис. 8.5 а) показан примерный график изменения частоты страничных
прерываний из-за отсутствия страницы с учетом принципа локализации. Если размер
страницы очень мал, в памяти размещается относительно большое число страниц
процесса. Через некоторое время страницы в памяти будут содержать части процесса,
сосредоточенные вблизи последних обращений, и частота прерываний из-за отсутствия
страницы должна быть невелика.
Рис. 8.5. Изменение частоты страничных прерываний
По мере увеличения размера страницы каждая отдельная страница будет содержать
данные, которые располагаются все дальше и дальше от последних выполненных
обращений к памяти. Действие принципа локализации ослабевает, и наблюдается рост
количества прерываний из-за отсутствия страницы. С дальнейшим ростом размера
страницы он (размер) становится сравнимым с размером процесса (точка Р на графике)
и прерывания становятся реже, а достижения размера этого процесса прекращаются.
Следует учитывать также влияние количества физических страниц, распределенных
процессу. На рис. 8.5 б) показано, что для фиксированного размера страницы частота
прерываний из-за отсутствия страницы уменьшается с ростом числа страниц,
находящихся в основной памяти.
Реально размеры страниц различных компьютеров составляют следующие значения:
512 байт (семейство VAX, IBM AS/400), 4 Кбайт (IBM 370, MIPS), 8 Кбайт (DEC Alpha),
от 4 Кбайт до 4 Мбайт (Pentium).
Решение об используемом размере страниц связано также с размером физической
памяти и размером программы. Нужно также учитывать тот факт, что современные
технологии программирования приводят к снижению локализации ссылок процесса.
Например, объектно-ориентированные технологии стимулируют применение множества
мелких модулей кода и данных с обращениями к большому количеству объектов за
относительно короткое время (если программа на языке С для небольших задач
занимает 3 – 4 Кбайт, то та же программа на Visual С++ займет сотни Кбайт).
Многопоточные приложения приводят к внезапным изменениям в потоке команд и
обращениям к памяти, разбросанным по сильно отличающимся адресам.
Новые тенденции в программировании приводят к тому, что снижается
результативность поиска в TLB с ростом размеров процесса и уменьшением
локализации обращений в программе. Таким образом, TLB может стать узким местом,
ограничивающим производительность виртуальной памяти. Чтобы повысить
производительность TLB, нужно увеличить его емкость. Однако увеличение размера
TLB связано с другими аспектами аппаратного решения вопросов обращения к памяти –
такими как размер кэша основной памяти и количество обращений к памяти при
выполнении одной команды. Это приводит к выводу о невозможности роста размера
TLB такими же темпами, как увеличение размеров памяти. Альтернативой может быть
использование больших размеров страниц (в этом случае размер TLB может быть
меньше, а TLB ссылается на большой блок данных). Однако в этом случае кэш ОП
должен тоже быть большим. Кроме того, большие размеры страниц приведут к
значительной внутренней фрагментации.
Учитывая все эти обстоятельства, в рядах компьютеров применяются множественные
размеры страниц (что, однако, весьма сложно как в аппаратном аспекте, так и в
программном в части операционной системы). Множественные размеры страниц
обеспечивают гибкость, необходимую для использования TLB. Большие непрерывные
области адресного пространства процесса, например программный код, могут
отображаться с использованием небольшого количества страниц, в то время как стеки
потоков могут использоваться для отображения страницы малого размера.
Одна из основных задач ОС – управление виртуальной памятью. При выборе стратегии
решения этой задачи ключевым вопросом становится производительность: требуется
сократить количество прерываний из-за отсутствия страницы в основной памяти,
поскольку их обработка приводит к существенным накладным расходам. Кроме того,
ОС должна активизировать готовый к работе процесс на время выполнения медленных
операций ввода-вывода.
Для управления страничным обменом нужно решить следующие задачи [10, 17]:
•
•
•
•
•
•
когда передавать страницу в основную память;
где размещать страницу в физической памяти;
какую страницу основной памяти выбрать для замедления, если в основной
памяти нет свободной физической страницы;
сколько страниц процесса следует загрузить в основную память;
когда измененная страница, должна быть записана во вторичную память;
сколько процессов размещать в основной памяти.
В соответствии с этими задачами ниже перечислены стратегии ОС для управления
виртуальной памятью.
Наименование
Возможные алгоритмы (решения)
Стратегия
выборки (когда?)
По требованию, предварительная выборка
Стратегия
размещения (где?)
Первый подходящий раздел (для сегментной виртуальной
памяти). Любая страница физической памяти (для
сегментно-страничной и страничной организации
виртуальной памяти)
Стратегия замещения
(какие?)
Оптимальный выбор, дольше всех неиспользовавшиеся.
Первым вошел – первым вышел (FIFO), часовой,
буферизация страниц
Управление резидентным Фиксированный размер, переменный размер, локальная и
множеством (сколько?)
глобальная области видимости
Стратегия очистки
(когда?)
По требованию, предварительная очистка
Управление загрузкой
Рабочее множество, критерии L=S и 50%
(сколько?)
Стратегия выборки определяется, когда страница должна быть передана в основную
память. Два основных варианта – по требованию и предварительно. В первом случае
страница передается в основную память только тогда, когда выполняется обращение к
ячейке памяти, расположенной на этой странице. Если все прочие элементы системы
управления памятью работают хорошо, то происходит следующее. Когда процесс
только запускается, возникает поток прерываний обращений к страницам, но далее
срабатывает принцип локализации, все большее количество обращений выполняется к
недавно загруженным страницам, и количество прерываний существенно снижается.
В случае предварительной выборки загружается несколько страниц. Такая выборка
использует особенности работы дисковых устройств, заключающиеся в том, что
несколько последовательно расположенных страниц загрузятся значительно быстрее,
чем загрузка этих же страниц по одной в течение некоторого промежутка времени.
Предварительная выборка планируется программистом при разработке программы. Тем
не менее, выгодность предварительной выборки не доказана.
Стратегия размещения определяет, где именно в физической памяти будут
располагаться части процесса. Для систем, использующих сегментно-страничную или
чисто страничную организацию виртуальной памяти, стратегия размещения не
актуальна, поскольку применение TLB и аппаратное обеспечение к памяти одинаково
результативно при любых сочетаниях адресов виртуальных и физических страниц.
В многопроцессорных системах с неоднородным доступом к памяти (различные
расстояния между процессорами и модулями памяти) стратегия размещениястановится
очень важной и требует всестороннего исследования.
Стратегия замещения определяет выбор страниц в основной памяти для замещения их
загружаемыми из вторичной памяти страницами. Эта стратегия связана с решением
следующих вопросов:
•
•
•
какое количество страниц в основной памяти должно быть выделено каждому
активному процессу;
должны ли замещаемые страницы относиться к одному процессу или в качестве
кандидатов на замещение должны рассматриваться все страницы оперативной
памяти;
какие именно страницы из рассматриваемого множества следует выбрать для
замещения.
Первые два вопроса относятся к стратегии управления резидентным множеством, их
рассмотрим далее. Третий вопрос напрямую связан со стратегией замещения. Все
используемые стратегии замещения направлены на то, чтобы выгрузить страницу,
обращений к которой в ближайшем будущем не последует. Большинство стратегий
замещения пытаются определить будущее поведение программы на основе ее прошлого
поведения. Независимо от стратегий управления резидентным множеством имеется ряд
основных алгоритмов, применяемых для выбора замещаемой страницы:
•
•
•
•
оптимальный алгоритм;
алгоритм дольше всех не использующейся страницы;
алгоритм "первым вошел – первым вышел" (FIFO);
часовой алгоритм и др.
Оптимальный алгоритм состоит в выборе замещения той страницы, обращение к
которой будет через наибольший промежуток времени по сравнению со всеми
остальными страницами. Понятно, что реализовать такой алгоритм невозможно,
поскольку для этого системе требуется знать все будущие события. Однако он является
стандартом, с которым сравниваются все алгоритмы.
Алгоритм FIFO рассматривает физические страницы процесса как циклический буфер, с
циклическим удалением страниц из него. Это один из простейших в реализации
алгоритмов. Логика его работы заключается в том, что замещается страница,
находящаяся в памяти дольше других. Однако далеко не всегда эта страница редко
используется.
Хотя алгоритм дольше всех не использующейся страницы близок к оптимальному, он
труден в реализации и приводит к значительным накладным расходам. Разработано
достаточно много алгоритмов, основанных на данной стратегии, многие из них
представляют собой варианты схемы, известной как часовая стратегия (clock policy).
В простейшей схеме часовой стратегии с каждой физической страницей связан один
бит, который называется битом использования (рис. 8.6). Когда виртуальная
страница загружается впервые в физическую страницу, бит использования переводится
в 1. При последующих обращениях к странице, вызвавших прерывание из отсутствия
страницы, этот бит устанавливается равным 1. При работе алгоритма замещения
множество страниц, являющихся кандидатами на замещение (текущий процесс,
локальная область видимости или глобальная область видимости1) )), рассматривается
как циклический буфер, с которым связан указатель.
Рис. 8.6. Часовая стратегия замещения
При замещении страницы указатель перемещается к следующему кадру в буфере.
Когда наступает время замещения страницы, ОС сканирует буфер для поиска кадра,
бит использования которого равен 0. При этом когда в процессе поиска встречается
кадр с битом использования, равным 1, он сбрасывается в 0. Первый же встречный
кадр с нулевым битом использования выбирается для замещения. Если все кадры
имеют бит использования, равный 1, указатель совершает полный круг и возвращается
к начальному положению, заменяя страницу в этом кадре. Буфер кадров страниц
представлен в виде круга, напоминающего часы, откуда и произошло название
стратегии.
На рис. 8.6 приведен простейший пример использования часовой стратегии. Для
замещения доступны n-1 кадров основной памяти, представленных в виде
циклического буфера. Непосредственно перед тем как заместить страницу в буфере
загружаемой из вторичной памяти страницей 11, указатель буфера указывает на кадр
1, содержащий страницу 1. Приступаем к выполнению часового алгоритма. Поскольку
бит использования страницы 17 в кадре 2 равен 1, эта страница не замещается. Бит ее
использования сбрасывается, а указатель перемещается к следующему кадру 3. Здесь
находится страница 19, бит использования которой равен 0. Эта страница выбирается
для замещения. На ее место загружается страница 11, бит использования которой
переводится в 1. Указатель переводится на следующий кадр 4, и на этом выполнение
алгоритма завершается. Повысить эффективность часового алгоритма можно путем
увеличения количества используемых при его работе битов [17].
8.3. Сегментная организация виртуальной памяти
При страничной организации виртуальное адресное пространство делится на равные
части механически без учета смыслового значения данных. Для многих задач наличие
двух и более отдельных виртуальных адресных пространств может оказаться намного
лучше, чем одно.
Например, у компилятора есть много таблиц, которые формируются по мере
трансляции, включая в себя [10]:
1.
2.
3.
4.
исходный текст, сохраненный для печати листинга;
символьную таблицу, содержащую имена и атрибуты переменных;
таблицу, содержащую константы;
дерево грамматического разбора, содержащее синтаксический анализ
программы;
5. стек, используемый для процедурных вызовов внутри компилятора.
Во время компиляции каждая из первых четырех таблиц непрерывно растет. Последняя
таблица при компиляции непредсказуемо увеличивается или уменьшается. В
одномерной памяти эти пять таблиц должны размещаться в смежных частях
виртуального адресного пространства, как показано на рис. 8.7. В одномерном
адресном пространстве при росте таблиц одна может "упереться" в другую. Можно
было бы программным путем забирать памяти у одних таблиц и передавать другим. Но
такая работа аналогична управлению собственными оверлеями, что представляет собой
неудобство и большую скучную (возможно, неоплачиваемую) работу.
Рис. 8.7. Сложности размещения в одном виртуальном адресном пространстве
Необходим метод, освобождающий программиста от управления расширяющимися и
сокращающимися таблицами тем же самым способом, которым виртуальная память
устраняет беспокойство организации оверлейных программ. Простое и предельно
общее решение заключается в том, чтобы обеспечить машину множеством полностью
независимых адресных пространств, называемых сегментами.
Каждый сегмент содержит линейную последовательность адресов от 0 до некоторого
максимума. Различные сегменты могут быть различной длины. Более того, длины
сегментов могут изменяться во время выполнения. Поскольку каждый сегмент
составляет отдельное адресное пространство, разные сегменты могут расти и
сокращаться независимо друг от друга.
Чтобы определить адрес в такой сегментированной или двумерной памяти, программа
должна указать адрес, состоящий из двух частей: номер сегмента и адрес внутри
сегмента. Максимальный размер сегмента определяется разрядностью виртуального
адреса, например, при 32-разрядном микропроцессоре он равен 232 = 4 Гбайт. При этом
максимально возможное виртуальное адресное пространство представляет набор из N
виртуальных сегментов (заметим, что общего для сегментов линейного виртуального
адреса не существует).
Стоит подчеркнуть, что сегмент – это логический объект, о чем программист знает и
поэтому использует его как логический объект.
Помимо простоты управления увеличивающимися или сокращающимися структурами
данных, сегментированная память обладает и другими преимуществами.
К ним относятся:
•
•
•
простота компоновки отдельно скомпилированных процедур (обращение к
начальной точке процедуры осуществляется адресом вида (n,0), где n – номер
сегмента);
легкость обеспечения дифференцируемого доступа к различным частям
программы (например, запретить обращаться для записи в сегмент программы);
простота организации совместного использования фрагментов программ
различными процессами, например, библиотеки совместного доступа могут быть
оформлены в виде отдельного сегмента, который может быть включен в
виртуальное адресное пространство нескольких процессов.
Сравнение страничной организации памяти и сегментации приведено ниже.
Вопрос
Страничная
Сегментация
Нужно ли программисту
Нет
знать о том, что
используется эта техника?
Да
Сколько в системе
линейных адресных
пространств?
Одно
Много
Может ли суммарное
адресное пространство
превышать размеры
физической памяти?
Да
Да
Возможно ли разделение
процедур и данных, а
также раздельная защита
для них?
Нет
Да
Легко ли размещаются
таблицы с непостоянными
размерами?
Нет
Да
Облегчен ли совместный
доступ пользователей к
процедурам?
Нет
Да
Зачем была придумана эта Чтобы получить большое
техника?
линейное адресное
пространство без затрат
на физическую память
Для разбиения программ и
данных на независимые
адресные пространства,
облегчения защиты и
совместного доступа
При загрузке процесса в оперативную память помещается только часть его сегментов,
полная копия виртуального адресного пространства находится в дисковой памяти. Для
каждого загружаемого сегмента ОС подыскивает непрерывный участок свободной
памяти достаточного размера. Смежные в виртуальной памяти сегменты могут занимать
несмежные участки оперативной памяти. Если во время выполнения процесса
происходит обращение к отсутствующем в основной памяти сегменту, происходит
прерывание. Операционная система в данном случае работает аналогично подобному
процессу в страничной виртуальной памяти.
На этапе создания процесса во время загрузки его образа в оперативную память ОС
создает таблицу сегментов процесса, аналогичную таблице страниц, в которой для
каждого сегмента указывается:
•
•
•
•
базовый физический адрес начала сегмента в оперативной памяти;
размер сегмента;
правила доступа к сегменту;
признаки модификации, присутствия и обращения к данному сегменту, а также
некоторая другая информация.
Если виртуальные адресные пространства нескольких процессов включают один и тот
же сегмент, то в таблицах сегментов этих процессов делаются ссылки на один и тот же
участок оперативной памяти, в который данный сегмент загружается в единственном
экземпляре. Обычно программы в этих сегментах являются рентабельными (reentrant
able), т.е. обладают свойством повторной входимости кода. Код таких программ не
изменяется процессом.
Механизм преобразования виртуального адреса при сегментной организации очень
схож с преобразованием виртуального адреса при страничной организации. Однако
факт произвольного размера сегментов приводит к тому, что нельзя обойтись
конкатенацией номера сегмента и смещения. В данном случае физический адрес
получается сложением базового адреса сегмента, который определяется по номеру
сегмента n из таблицы сегментов, и смещения S. Схема преобразования виртуального
адреса при сегментной организации памяти приведена на рис. 8.8.
Рис. 8.8. Преобразование виртуального адреса
Использование операции сложения вместо конкатенации замедляет процедуру
преобразования виртуального адреса в физический. Другим недостатком сегментной
организации виртуальной памяти является большая избыточность перемещения данных
между диском и оперативной памятью, поскольку перемещаются целиком большие
сегменты. Во многих случаях было бы достаточно загружать и выгружать не весь
сегмент, а одну или несколько страниц. Однако наиболее существенный недостаток
сегментной организации виртуальной памяти – внешняя фрагментация, которая
возникает из-за произвольных размеров сегментов. Заметим, что внутренняя
фрагментация, характерная для страничной организации виртуальной памяти, в данном
случае отсутствует.
8.4. Сегментно-страничная виртуальная память
Данный метод организации виртуальной памяти направлен на сочетание достоинств
страничного и сегментного методов управления памятью. В такой комбинированной
системе адресное пространство пользователя разбивается на ряд сегментов по
усмотрению программиста. Каждый сегмент в свою очередь разбивается на страницы
фиксированного размера, равные странице физической памяти. С точки зрения
программиста, логический адрес в этом случае состоит из номера сегмента и смещения
в нем. С позиции операционной системы смещение в сегменте следует рассматривать
как номер страницы определенного сегмента и смещение в ней (рис. 8.9).
Рис. 8.9. Сегментно-страничная организация памяти
С каждым процессом связана одна таблица сегментов и несколько (по одной на
сегмент) таблиц страниц. При работе определенного процесса в регистре процессора
хранится начальный адрес соответствующей таблицы сегментов. Получив виртуальный
адрес, процессор использует его часть, представляющую номер сегмента, в качестве
индекса в таблице сегментов для поиска таблицы страниц данного сегмента. После
этого часть адреса, представляющая собой номер страницы, используется для поиска
номера физической страницы в таблице страниц. Затем часть адреса, представляющая
смещения, используется для получения искомого физического адреса путем
добавления к начальному адресу физической страницы.
Сегментация удобна для реализации защиты и совместного использования сегментов
разными процессами. Поскольку каждая запись таблицы сегментов включает
начальный адрес и значение длины, программа не в состоянии непреднамеренно
обратиться к основной памяти за границами сегмента. Для того чтобы отличить
разделяемые сегменты от индивидуальных, записи таблицы сегментов содержат 1битовое поле, имеющее два значения: shared (разделяемый) или private
(индивидуальный). Для осуществления совместного использования сегмента он
помещается в виртуальное адресное пространство нескольких процессов, при этом
параметры отображения этого сегмента настраиваются так, чтобы они соответствовали
одной и той же области оперативной памяти (делается это указанием одного и того же
базового физического адреса сегмента).
Возможен и более экономичный для ОС метод создания разделяемого виртуального
сегмента – помещение его в общую часть виртуального адресного пространства, т.е. в
ту часть, которая обычно задействуется для модулей ОС. В этом случае настройка
соответствующей записи для разделяемого сегмента выполняется только один раз, а
все процессы пользуются такой настройкой и совместно используют часть оперативной
памяти.
Оба рассмотренных подхода к разделению сегмента можно иллюстрировать схемами,
показанными ниже на рис. 8.10.
По второй схеме организована виртуальная память систем, работающих на процессоре
Pentium. В Windows поддерживается 16 К независимых сегментов. У каждого процесса
4 Гбайт виртуального адресного пространства (из них 2 Гбайт отводится под ОС и 2
Гбайт – пользовательским программам). Основа виртуальной памяти Windows
представляется двумя таблицами: локальной таблицей дескрипторов LDT (Local
Descriptor Table) и глобальной таблицей дескрипторов GDT (Global Descriptor Table). У
каждого процесса есть своя собственная таблица LDT, но глобальная таблица
дескрипторов одна, ее совместно используют все процессы. Таблица LDT описывает
сегменты, локальные для каждой программы, включая ее код, данные, стек и т.д.;
таблица GDT несет информацию о системных сегментах, включая саму операционную
систему.
Рис. 8.10. Разделяемые сегменты
В каждый момент времени в специальных регистрах GDTR и LDTR хранится информация
о местоположении и размерах глобальной таблицы GDT и активной таблице LDT.
Регистр LDTR указывает на расположение сегмента LDT в оперативной памяти косвенно
– он содержит индекс дескриптора в таблице GTD, в котором содержится адрес
таблицы LDT и ее размер.
Процесс обращается к физической памяти по виртуальному адресу, представляющему
собой пару – селектор и смещение. Селектор определяет номер сегмента, а смещение –
положение искомого адреса относительно начала сегмента. Селектор состоит из трех
полей (рис. 8.11). Индекс задает пользовательский номер дескриптора в таблице GDT
или LDT (всего 213 = 8 К сегментов). Таким образом, виртуальное адресное
пространство процесса состоит из 8 К локальных и 8 К глобальных сегментов, всего из
16 К сегментов. Учитывая, что каждый сегмент имеет максимальный размер 4 Гбайт при
чисто сегментной частосегментной? организации виртуальной памяти (без включения
страничного механизма), процесс может работать в виртуальном адресном
пространстве в 64 Тбайт.
Рис. 8.11. Сегментно-страничная организация памяти в Windows
Поле из двух битов селектора задает требуемый уровень привилегий, и используется
механизм защиты. В системах на базе микропроцесса Pentium поддерживается 4 уровня
защиты, где уровень 0 является наиболее привилегированным, а уровень 3 – наименее
привилегированным. Эти уровни образуют так называемые кольца защиты (рис. 8.12).
Рис. 8.12. Кольца защиты в Windows
Система защиты манипулирует несколькими переменными, характеризующими уровень
привилегий:
•
•
•
•
DPL (Descriptor Privilege Level) – задается полем DPL в дескрипторе сегмента;
RPL (Requested Privilege Level) – запрашиваемый уровень привилегий, задается
полем RPL селектора сегмента;
CPL (Current Privilege Level) – текущий уровень привилегий выполняемого кода,
задается полем RPL селектора кодового сегмента;
EPL (Effective Privilege Level) – эффективный уровень привилегий запроса.
Под запросом понимается любое обращение к памяти. Уровни привилегий DPL и RPL
назначаются операционной системой при создании новых процессов и во время их
загрузки в память. Уровень привилегий определяет не только возможности доступа к
сегментам и дескрипторам, но и разрешенный набор инструкций. В каждый момент
времени работающая программа находится на определенном уровне, что отмечается 2битовым полем в регистре слова состояние программы (PSW). Уровень привилегий
кодового сегмента DPL определяет текущий уровень привилегий CPL, фиксируемый в
PSW.
Контроль доступа процесса к сегментным данным осуществляется на основе
сопоставления эффективного уровня привилегий EPL запроса и уровня привилегий DPL
дескриптора сегмента данных. Доступ может быть разрешен, если:
EPL <= DPL,
где EPL = max {CPL, RPL}.
Значение RPL – уровня запрашиваемых привилегий – определяется полем RPL селектора, указывающего на запрашиваемый сегмент.