Опубликован: 02.11.2010 | Уровень: для всех | Доступ: платный
Лекция 6:

Управление памятью. Методы, алгоритмы и средства

< Лекция 5 || Лекция 6: 123456 || Лекция 7 >

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

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

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

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

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

Сложности размещения в одном виртуальном адресном пространстве

Рис. 6.18. Сложности размещения в одном виртуальном адресном пространстве

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

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

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

Стоит подчеркнуть, что сегмент – это логический объект, о чем программист знает и поэтому использует его как логический объект.

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

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

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

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

Вопрос Страничная Сегментация
Нужно ли программисту знать о том, что используется эта техника? Нет Да
Сколько в системе линейных адресных пространств? Одно Много
Может ли суммарное адресное пространство превышать размеры физической памяти? Да Да
Возможно ли разделение процедур и данных, а также раздельная защита для них? Нет Да
Легко ли размещаются таблицы с непостоянными размерами? Нет Да
Облегчен ли совместный доступ пользователей к процедурам? Нет Да
Зачем была придумана эта техника? Чтобы получить большое линейное адресное пространство без затрат на физическую память Для разбиения программ и данных на независимые адресные пространства, облегчения защиты и совместного доступа

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

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

  • базовый физический адрес начала сегмента в оперативной памяти;
  • размер сегмента;
  • правила доступа к сегменту;
  • признаки модификации, присутствия и обращения к данному сегменту, а также некоторая другая информация.

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

Механизм преобразования виртуального адреса при сегментной организации очень схож с преобразованием виртуального адреса при страничной организации. Однако факт произвольного размера сегментов приводит к тому, что нельзя обойтись конкатенацией номера сегмента и смещения. В данном случае физический адрес получается сложением базового адреса сегмента, который определяется по номеру сегмента n из таблицы сегментов, и смещения S. Схема преобразования виртуального адреса при сегментной организации памяти приведена на рис. 6.19.

 Преобразование виртуального адреса

Рис. 6.19. Преобразование виртуального адреса

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

< Лекция 5 || Лекция 6: 123456 || Лекция 7 >
Даниил Баёв
Даниил Баёв

Как узнать оценку за курс?

 

Анастасия Якимова
Анастасия Якимова
Тофик Мамедов
Тофик Мамедов
Россия, Воронеж, ВГУ
Ярослав Щербань
Ярослав Щербань
Украина