Добавлен: 29.10.2018
Просмотров: 48088
Скачиваний: 190
3.7. Сегментация
281
Вопрос
Страничная
организация
Сегментация
Зачем была изобретена эта техноло-
гия?
Для получения большо-
го линейного адрес-
ного пространства без
приобретения допол-
нительной физической
памяти
Чтобы дать возможность
разбить программы и дан-
ные на логически независи-
мые адресные пространства
и облегчить их совместное
использование и защиту
3.7.1. Реализация чистой сегментации
Реализация сегментации существенным образом отличается от реализации страничной
организации памяти: страницы имеют фиксированный размер, а сегменты его не имеют.
На рис. 3.30, а показан пример физической памяти, изначально имеющей пять сегментов.
Теперь рассмотрим, что получится, если сегмент 1 удаляется, а на его место помещается
меньший по размеру сегмент 7. У нас получится конфигурация памяти, показанная на
рис. 3.30, б. Между сегментами 7 и 2 будет неиспользуемая область, то есть дыра. Затем
сегмент 4 заменяется сегментом 5 (рис. 3.30, в), а сегмент 3 — сегментом 6 (рис. 3.30, г).
Рис. 3.30. Физическая память: а — г — нарастание внешней фрагментации;
д — избавление от внешней фрагментации за счет уплотнения
После того как система какое-то время поработает, память разделится на несколько
участков, часть из которых будут содержать сегменты, а часть — дыры. Это явление,
названное явлением шахматной доски, или внешней фрагментацией, приводит к пу-
стой трате памяти на дыры. С ним можно справиться за счет уплотнения (рис. 3.30, д).
3.7.2. Сегментация со страничной организацией памяти:
система MULTICS
При большом размере сегментов может стать неудобно или даже невозможно хранить
их целиком в оперативной памяти. Это наталкивает на идею применения к ним стра-
282
Глава 3. Управление памятью
ничной организации, чтобы иметь дело только с теми страницами сегмента, которые
нужны в данный момент. Поддержка страничных сегментов реализована в нескольких
важных для нас системах. В этом разделе мы рассмотрим первую из таких систем,
MULTICS. В следующем разделе обратимся к более современной системе Intel x86 —
вплоть до x86-64.
Операционная система MULTICS была одной из самых влиятельных из когда-либо
созданных операционных систем, оказавших серьезное воздействие на такие доволь-
но-таки несхожие темы, как UNIX, архитектура памяти x86, TLB-буферы и облачные
вычисления. Ее создание началось с исследовательского проекта M.I.T., а в реальную
жизнь она была запущена в 1969 году. Последняя MULTICS-система, проработавшая
31 год, была остановлена в 2000-м. Немногим операционным системам удалось про-
жить без существенных изменений столь долгую жизнь. Несмотря на весьма продол-
жительное существование операционных систем под названием Windows, Windows 8
не имеет ничего общего с Windows 1.0, за исключением названия и того факта, что она
была написана компанией Microsoft.
Более того, идеи, проработанные в MULTICS, не утратили своей актуальности и по-
лезности и в том виде, в котором они были сформулированы в 1965 году, когда была
опубликована первая статья (Corbató и Vyssotsky, 1965). Поэтому мы сейчас потра-
тим немного времени на рассмотрение одного из наиболее инновационных аспектов
MULTICS — архитектуры виртуальной памяти. Дополнительные сведения о MULTICS
можно найти по адресу
www.multicians.org
.
Система MULTICS работала на машинах Honeywell 6000 и их потомках и обеспечивала
каждую программу виртуальной памятью размером вплоть до 2
18
сегментов, каждый
из которых был до 65 536 (36-разрядных) слов длиной. Чтобы осуществить это, раз-
работчики системы MULTICS решили трактовать каждый сегмент как виртуальную
память и разбить его на страницы, комбинируя преимущества страничной организации
памяти (постоянный размер страницы и отсутствие необходимости хранения целого
сегмента в памяти, если используется только его часть) с преимуществом сегментации
(облегчение программирования, модульности, защиты и совместного доступа).
Каждая программа в системе MULTICS использовала таблицу сегментов, в которой
имелось по одному дескриптору на каждый сегмент. Поскольку потенциальное ко-
личество записей в таблице превышало четверть миллиона, сама таблица сегментов
также являлась сегментом и была разбита на страницы. Дескриптор сегмента содержал
индикатор того, находится ли сегмент в памяти или нет. Если какая-то часть сегмента
присутствовала в памяти, считалось, что в памяти находится весь сегмент и его та-
блица страниц будет в памяти. Если сегмент находился в памяти, то его дескриптор
(рис. 3.31, а) содержал 18-разрядный указатель на его таблицу страниц. Поскольку
использовались 24-разрядные физические адреса, а страницы выстраивались по
64-байтным границам (предполагалось, что 6 бит низших разрядов адреса страницы —
это 000000), для хранения в дескрипторе адреса таблицы страниц необходимо было
только 18 бит. Дескриптор содержал также размер сегмента, биты защиты и несколько
других полей. Дескриптор сегмента в системе MULTICS показан на рис. 3.31, б. Адрес
сегмента во вспомогательной памяти находился не в дескрипторе сегмента, а в другой
таблице, используемой обработчиком ошибки отсутствия сегмента.
Каждый сегмент представлял собой обыкновенное виртуальное адресное пространство
и был разбит на страницы точно так же, как и несегментированная страничная память,
рассмотренная ранее в этой главе. Обычный размер страницы был равен 1024 словам
3.7. Сегментация
283
Рис. 3.31. Виртуальная память в системе MULTICS: а — сегмент дескрипторов указывает
на таблицы страниц; б — дескриптор сегмента. Числа означают длину полей
(хотя ряд несколько меньших по размеру сегментов, используемых самой системой
MULTICS, не были разбиты на страницы или все же для экономии физической памяти
были разбиты на страницы по 64 слова).
Адрес в системе MULTICS состоял из двух частей: сегмента и адреса внутри сегмен-
та. Последний, в свою очередь, делился на номер страницы и слово внутри страницы
(рис. 3.32).
Когда происходило обращение к памяти, выполнялся следующий алгоритм:
1. Номер сегмента использовался для нахождения дескриптора сегмента.
2. Проверялось, находится ли таблица страниц сегмента в памяти. Если таблица
страниц присутствовала в памяти, определялось ее местоположение. Если таблица
284
Глава 3. Управление памятью
в памяти отсутствовала, возникала ошибка отсутствия сегмента. При нарушении
защиты возникала ошибка (происходило системное прерывание).
3. Изучалась запись в таблице страниц для запрашиваемой виртуальной страницы.
Если страница не находилась в памяти, возникала ошибка отсутствия страницы.
Если она была в памяти, из записи таблицы страниц извлекался адрес начала
страницы в оперативной памяти.
4. К адресу начала страницы прибавлялось смещение, что давало в результате адрес
в оперативной памяти, по которому располагалось нужное слово.
5. И наконец, осуществлялось чтение или сохранение данных.
Рис. 3.32. 34-разрядный виртуальный адрес в системе MULTICS
Этот процесс показан на рис. 3.33. Чтобы его упростить, был опущен тот факт, что
сегмент дескрипторов сам по себе имел страничную организацию. На самом деле про-
исходило следующее: сначала использовался регистр (основной регистр дескриптора),
чтобы определить расположение таблицы страниц сегмента дескрипторов, которая
в свою очередь указывала на страницы сегмента дескрипторов. Как только дескриптор
для требуемого сегмента находился, происходила адресация (рис. 3.33).
Рис. 3.33. Преобразование состоящего из двух частей адреса в системе MULTICS в адрес
в оперативной памяти
3.7. Сегментация
285
Как вы теперь уже, безо всякого сомнения, догадались, если бы на практике предыдущий
алгоритм выполнялся операционной системой для каждой команды процессора, работа
программ не отличалась бы особой быстротой. В действительности аппаратура системы
MULTICS содержала высокоскоростной буфер быстрого преобразования адреса (TLB)
размером 16 слов, который был способен производить поиск параллельно по всем сво-
им записям для заданного ключа. Этот процесс показан на рис. 3.34. Когда компьютер
получал адрес, аппаратура адресации сначала проверяла наличие виртуального адреса
в TLB. Если этот адрес присутствовал в буфере, она получала номер страничного блока
прямиком из TLB и формировала фактический адрес слова, к которому происходило
обращение, не выполняя поиск в сегменте дескрипторов или в таблице страниц.
Рис. 3.34. Простейший вариант TLB в системе MULTICS. На самом деле наличие страниц
двух размеров делает строение TLB более сложным
В буфере быстрого преобразования адреса хранились адреса 16 страниц, к которым
происходили самые последние обращения. Программы, у которых рабочий набор был
меньше размера TLB, хранили адреса всего рабочего набора в TLB, и следовательно, эти
программы работали эффективно, в противном случае происходила ошибка TLB.
3.7.3. Сегментация со страничной организацией памяти:
система Intel x86
До появления x86-64 виртуальная память в системе x86 во многих отношениях напо-
минала память в системе MULTICS, включая наличие как сегментации, так и странич-
ной организации. Но система MULTICS имела 256 K независимых сегментов, каждый
до 64 К 36-разрядных слов, а система x86 поддерживает 16 K независимых сегментов,
каждый до 1 млрд 32-разрядных слов. Хотя в последней системе меньше сегментов,
их больший размер куда важнее, поскольку программы, которым требуется более чем
1000 сегментов, встречаются довольно редко, в то время как многим программам необ-
ходимы большие по размеру сегменты. Что же касается x86-64, то сегментация считается
устаревшей и больше не поддерживается, исключая работу в унаследованном режиме.
Хотя некоторые остатки старых механизмов сегментации в исходном режиме работы
систем x86-64 все еще доступны, главным образом для обеспечения совместимости, они