Сегментация со страничной организацией памяти: система MULГЮS

Сегментация со страничной организацией памяти: система MULГЮS

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

Операционная система MULTICS была одной из самых влиятельных из когда-либо созданных операционных систем, оказавших серьезное воздействие на такие довольно-таки несхожие темы, как UNIX, архитектура памяти x86, TLB-буферы и облачные вычисления. Ее создание началось с исследовательского проекта M.I.T., а в реальную жизнь она была запущена в 1969 году. Последняя MULTICS-система, проработавшая 31 год, была остановлена в 2000-м. Немногим операционным системам удалось прожить без существенных изменений столь долгую жизнь.

Более того, идеи, проработанные в MULTICS, не утратили своей актуальности и полезности и в том виде, в котором они были сформулированы в 1965 году, когда была опубликована первая статья (Corbato и Vyssotsky, 1965). Поэтому мы сейчас потратим немного времени на рассмотрение одного из наиболее инновационных аспектов MULTICS — архитектуры виртуальной памяти. Дополнительные сведения о MULTICS можно найти по адресу www.multicians.org.

Система MULTICS работала на машинах Honeywell 6000 и их потомках и обеспечивала каждую программу виртуальной памятью размером вплоть до 2 18 сегментов, каждый из которых был до 65 536 (36-разрядных) слов длиной.

Каждая программа в системе MULTICS использовала таблицу сегментов, в которой имелось по одному дескриптору на каждый сегмент. Поскольку потенциальное количество записей в таблице превышало четверть миллиона, сама таблица сегментов также являлась сегментом и была разбита на страницы. Дескриптор сегмента содержал индикатор того, находится ли сегмент в памяти или нет. Если какая-то часть сегмента присутствовала в памяти, считалось, что в памяти находится весь сегмент и его таблица страниц будет в памяти. Если сегмент находился в памяти, то его дескриптор (рис. 3.31, а) содержал 18-разрядный указатель на его таблицу страниц. Поскольку использовались 24-разрядные физические адреса, а страницы выстраивались по 64-байтным границам (предполагалось, что 6 бит низших разрядов адреса страницы — это 000000), для хранения в дескрипторе адреса таблицы страниц необходимо было только 18 бит. Дескриптор содержал также размер сегмента, биты защиты и несколько других полей. Дескриптор сегмента в системе MULTICS показан на рис. 3.31, б. Адрес сегмента во вспомогательной памяти находился не в дескрипторе сегмента, а в другой таблице, используемой обработчиком ошибки отсутствия сегмента.

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

0 = сегмент разбит

1 = сегмент не разбит

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

Адрес в системе MULTICS состоял из двух частей: сегмента и адреса внутри сегмента. Последний, в свою очередь, делился на номер страницы и слово внутри страницы (рис. 3.32).

Когда происходило обращение к памяти, выполнялся следующий алгоритм:

1. Номер сегмента использовался для нахождения дескриптора сегмента.

2. Проверялось, находится ли таблица страниц сегмента в памяти. Если таблица страниц присутствовала в памяти, определялось ее местоположение. Если таблица

в памяти отсутствовала, возникала ошибка отсутствия сегмента. При нарушении защиты возникала ошибка (происходило системное прерывание).

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

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

5. И наконец, осуществлялось чтение или сохранение данных.

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

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

📎📎📎📎📎📎📎📎📎📎