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

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

Например, у компилятора есть много таблиц, которые формируются по мере трансляции, включая в себя:

· Исходный текст, сохраненный для печати листинга.

· Символьную таблицу, содержащую имена и атрибуты переменных.

· Таблицу, содержащую константы.

· Дерево грамматического разбора, содержащее синтаксический анализ программы.

· Стек, используемый для процедурных вызовов внутри компилятора.

 

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

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

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

Каждый сегмент содержит линейную последовательность адресов от 0 до некоторо­го максимума. Различные сегменты могут быть различной длины. Более того, длины сегментов могут изменяться во время выполнения. Поскольку каждый сегмент состав­ляет отдельное адресное пространство, разные сегменты могут расти и сокращаться не­зависимо друг от друга.

Чтобы определить адрес в такой сегментированной или двумерной памяти, програм­ма должна указать адрес, состоящий из двух частей: номер сегмента и адрес внутри сег­мента. Максимальный размер сегмента определяется разрядностью виртуального адреса, например при 32-разрядном микропроцессоре он равен 23 2= 4 Гбайт. При этом максимально возможное виртуальное адресное пространство представляет набор из N виртуальных сегментов (заметим, что общего для сегментов линейного виртуального адреса не существует).

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

 

К ним относятся:

· простота компоновки отдельно скомпилированных процедур (обращение к начальной точке процедуры осуществляется адресом вида (п, 0), где п - номер сег­мента);

· легкость обеспечения дифференцируемого доступа к различным частям программы (например, запретить обращаться для записи в сегмент программы);

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

Сравнение страничной организации памяти и сегментации приведено ниже.

 

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

На этапе создания процесса во время загрузки его образа в оперативную память ОС создает таблицу сегментов процесса, аналогичную таблице страниц, в которой для каждого сегмента указывается:

· базовый физический адрес начала сегмента в оперативной памяти;

· размер сегмента;

· правила доступа к сегменту;

· признаки модификации, присутствия и обращения к данному сегменту, а также некоторая другая информация.

 

Если виртуальные адресные пространства нескольких процессов включают один и тот же сегмент, то в таблицах сегментов этих процессов делаются ссылки на один и тот

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

 

Сегментно-страничная виртуальная память

Данный метод организации виртуальной памяти направлен на сочетание достоинств страничного и сегментного методов управления памятью. В такой комбини­рованной системе адресное пространство пользователя разбивается на ряд сегментов по усмотрению программиста. Каждый сегмент в свою очередь разбивается на страницы

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

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

Сегментация удобна для реализации защиты и совместного использования сегментов

разными процессами.