The design of the unix operating system by Maurice J

Вид материалаРеферат
6.2 Формат памяти системы
Подобный материал:
1   ...   15   16   17   18   19   20   21   22   ...   55
раздел посвящен описанию модели распределения памяти; в остальных

разделах состояния процесса и переходы между ними рассматриваются

на физическом уровне, особое внимание при этом уделяется состоя-

ниям "выполнения в режиме задачи", "выполнения в режиме ядра",

"резервирования" и "приостанова (в памяти)". В следующей главе

затрагиваются состояния "создания" и "прекращения существования",

а в главе 8 - состояние "готовности к запуску в памяти". В главе

9 обсуждаются два состояния выгруженного процесса и организация

подкачки по обращению.


6.2 ФОРМАТ ПАМЯТИ СИСТЕМЫ


Предположим, что физическая память машины имеет адреса, начи-

ная с 0 и кончая адресом, равным объему памяти в байтах. Как уже

отмечалось в главе 2, процесс в системе UNIX состоит из трех ло-

гических секций: команд, данных и стека. (Общую память, которая

рассматривается в главе 11, можно считать в данном контексте

частью секции данных). В секции команд хранится набор машинных

инструкций, исполняемых под управлением процесса; адресами в сек-

ции команд выступают адреса команд (для команд перехода и обраще-

ний к подпрограммам), адреса данных (для обращения к глобальным

переменным) и адреса стека (для обращения к структурам данных,

которые локализованы в подпрограммах). Если адреса в сгенериро-


ванном коде трактовать как адреса в физической памяти, два про-

цесса не смогут параллельно выполняться, если их адреса перекры-

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

разных программ, но на универсальных ЭВМ такой порядок не практи-

куется, поскольку объем памяти машины ограничен, а количество

транслируемых программы неограничено. Даже если для того, чтобы

избежать излишнего пересечения адресов в процессе их генерации,

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

подобная реализация не будет достаточно гибкой и не сможет удов-

летворять предъявляемым к ней требованиям.

Поэтому компилятор генерирует адреса для виртуального адрес-

ного пространства заданного диапазона, а устройство управления

памятью, называемое диспетчером памяти, транслирует виртуальные

адреса, сгенерированные компилятором, в адреса ячеек, расположен-

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

какое место в памяти ядро потом загрузит выполняемую программу.

На самом деле, в памяти одновременно могут существовать несколько

копий программы: все они могут выполняться, используя одни и те

же виртуальные адреса, фактически же ссылаясь на разные физичес-

кие ячейки. Те подсистемы ядра и аппаратные средства, которые

сотрудничают в трансляции виртуальных адресов в физические, обра-

зуют подсистему управления памятью.


6.2.1 Области


Ядро в версии V делит виртуальное адресное пространство про-

цесса на совокупность логических областей. Область - это непре-

рывная зона виртуального адресного пространства процесса,

рассматриваемая в качестве отдельного объекта для совместного ис-

пользования и защиты. Таким образом, команды, данные и стек обыч-

но образуют автономные области, принадлежащие процессу. Несколько

процессов могут использовать одну и ту же область. Например, если

несколько процессов выполняют одну и ту же программу, вполне ес-

тественно, что они используют одну и ту же область команд. Точно

так же, несколько процессов могут объединиться и использовать об-

щую область разделяемой памяти.

Ядро поддерживает таблицу областей и выделяет запись в табли-

це для каждой активной области в системе. В разделе 6.5 описыва-

ются поля таблицы областей и операции над областями более подроб-

но, но на данный момент предположим, что таблица областей

содержит информацию, позволяющую определить местоположение облас-

ти в физической памяти. Каждый процесс имеет частную таблицу об-

ластей процесса. Записи этой таблицы могут располагаться, в зави-

симости от конкретной реализации, в таблице процессов, в адресном

пространстве процесса или в отдельной области памяти; для просто-

ты предположим, что они являются частью таблицы процессов. Каждая

запись частной таблицы областей содержит указатель на соответс-

твующую запись общей таблицы областей и первый виртуальный адрес

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

виртуальные адреса в каждом процессе. Запись частной таблицы об-

ластей также содержит поле прав доступа, в котором указывается

тип доступа, разрешенный процессу: только чтение, только запись

или только исполнение. Частная таблица областей и структура об-

ласти аналогичны таблице файлов и структуре индекса в файловой

системе: несколько процессов могут совместно использовать адрес-

ное пространство через область, подобно тому, как они разделяют

доступ к файлу с помощью индекса; каждый процесс имеет доступ к

области благодаря использованию записи в частной таблице облас-

тей, точно так же он обращается к индексу, используя соответству-

ющие записи в таблице пользовательских дескрипторов файла и в

таблице файлов, принадлежащей ядру.

На Рисунке 6.2 изображены два процесса, A и B, показаны их

области, частные таблицы областей и виртуальные адреса, в которых

эти области соединяются. Процессы разделяют область команд 'a' с

виртуальными адресами 8К и 4К соответственно. Если процесс A чи-

тает ячейку памяти с адресом 8К, а процесс B читает ячейку с ад-

ресом 4К, то они читают одну и ту же ячейку в области 'a'.

Область данных и область стека у каждого процесса свои.

Область является понятием, не зависящим от способа реализации

управления памятью в операционной системе. Управление памятью

представляет собой совокупность действий, выполняемых ядром с

целью повышения эффективности совместного использования оператив-

ной памяти процессами. Примерами способов управления памятью мо-

гут служить рассматриваемые в главе 9 замещение страниц памяти и

подкачка по обращению. Понятие области также не зависит и от соб-

ственно распределения памяти: например, от того, делится ли па-

мять на страницы или на сегменты. С тем, чтобы заложить фундамент

для перехода к описанию алгоритмов подкачки по обращению (глава

9), все приводимые здесь рассуждения относятся, в первую очередь,

к организации памяти, базирующейся на страницах, однако это не

предполагает, что система управления памятью основывается на ука-

занных алгоритмах.


Частные таблицы областей Области

процесса

(Виртуальные адреса) ---------┐

Коман----------------┐ │ │

ды │ 8К +-----┐ --->│ b │

Процесс Дан-+--------------+ │ │ │ │

A ные │ 16К +-----│---- L--------- ---------┐

+--------------+ │ │ │

Стек │ 32К +-----│-------------------->│ c │

L--------------- │ ---------┐ │ │

L------>│ │ L---------

│ a │

Коман----------------┐ ------->│ │

ды │ 4К +------ L--------- ---------┐

Процесс Дан-+--------------+ │ │

B ные │ 8К +-------------------------->│ e │

+--------------+ ---------┐ │ │

Стек │ 32К +-----┐ │ │ L---------

L--------------- L------>│ d │

│ │

L---------


Рисунок 6.2. Процессы и области


6.2.2 Страницы и таблицы страниц


В этом разделе описывается модель организации памяти, которой

мы будем пользоваться на протяжении всей книги, но которая не яв-

ляется особенностью системы UNIX. В организации памяти, базирую-

щейся на страницах, физическая память разделяется на блоки одина-

кового размера, называемые страницами. Обычный размер страниц

составляет от 512 байт до 4 Кбайт и определяется конфигурацией

технических средств. Каждая адресуемая ячейка памяти содержится в

некоторой странице и, следовательно, каждая ячейка памяти может

адресоваться парой (номер страницы, смещение внутри страницы в

байтах). Например, если объем машинной памяти составляет 2 в

32-й степени байт, а размер страницы 1 Кбайт, общее число страниц

- 2 в 22-й степени; можно считать, что каждый 32-разрядный адрес

состоит из 22-разрядного номера страницы и 10-разрядного смещения

внутри страницы (Рисунок 6.3).

Когда ядро назначает области физические страницы памяти, не-

обходимости в назначении смежных страниц и вообще в соблюдении

какой-либо очередности при назначении не возникает. Целью стра-

ничной организации памяти является повышение гибкости назначения

физической памяти, которое строится по аналогии с назначением

дисковых блоков файлам в файловой системе. Как и при назначении

блоков файлу, так и при назначении области страниц памяти, прес-

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

(вследствие фрагментации) пространства памяти.


-------------------------------------------------------------┐

│ Шестнадцатиричный адрес 58432 │

│ │

│ Двоичный 0101 1000 0100 0011 0010 │

│ │

│ Номер страницы, смещение │

│ внутри страницы 01 0110 0001 00 0011 0010 │

│ │

│ В шестнадцатиричной системе 161 32 │

L-------------------------------------------------------------


Рисунок 6.3. Адресация физической памяти по страницам


-------------------------------------------------------┐

│ Логический номер страницы Физический номер страницы │

│ │

│ 0 177 │

│ 1 54 │

│ 2 209 │

│ 3 17 │

L-------------------------------------------------------


Рисунок 6.4. Отображение логических номеров страниц на физи-

ческие


Ядро устанавливает соотношение между виртуальными адресами

области и машинными физическими адресами посредством отображения

логических номеров страниц в области на физические номера страниц

в машине, как это показано на Рисунке 6.4. Поскольку область это

непрерывное пространство виртуальных адресов программы, логичес-

кий номер страницы служит указателем на элемент массива физичес-

ких номеров страниц. Запись таблицы областей содержит указатель

на таблицу физических номеров страниц, именуемую таблицей стра-

ниц. Записи таблицы страниц содержат машинно-зависимую информа-

цию, такую как права доступа на чтение или запись страницы. Ядро

поддерживает таблицы страниц в памяти и обращается к ним так же,

как и ко всем остальным структурам данных ядра.

На Рисунке 6.5 приведен пример отображения процесса в физи-

ческие адреса памяти. Пусть размер страницы составляет 1 Кбайт и

пусть процессу нужно обратиться к объекту в памяти, имеющему вир-

туальный адрес 68432. Из таблицы областей видно, что виртуальный

адрес начала области стека - 65536 (64К), если предположить, что

стек растет в направлении увеличения адресов. После вычитания

этого адреса из адреса 68432 получаем смещение в байтах внутри

области, равное 2896. Так как каждая страница имеет размер 1

Кбайт, адрес указывает со смещением 848 на 2-ю (начиная с 0)

страницу области, расположенной по физическому адресу 986К. В

разделе 6.5.5 (где идет речь о загрузке области) рассматривается

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

В современных машинах используются разнообразные аппаратные

регистры и кеши, которые повышают скорость выполнения вышеописан-

ной процедуры трансляции адресов и без которых пересылки в памяти

и адресные вычисления чересчур бы замедлились. Возобновляя выпол-

нение процесса, ядро посредством загрузки соответствующих регист-

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


Частная таблица областей Таблицы страниц

процесса (Физические адреса)

---------------┐

Команды │ 8К +--------------┐

+--------------+ L-------->---------------┐

Данные │ 32К +-------┐ │ пусто │

+--------------+ │ +--------------+

Стек │ 64К +---┐ │ │ 137К │

L--------------- │ v +--------------+

Виртуальные адреса │ ---------------┐ │ 852К │

│ │ 87К │ +--------------+

-------------- +--------------+ │ 764К │

v │ 552К │ +--------------+

---------------┐ +--------------+ │ 433К │

│ 541К │ │ 727К │ +--------------+

+--------------+ +--------------+ │ 333К │

│ 783К │ │ 941К │ +--------------+

+--------------+ +--------------+ │ │

│ 986К │ │ 1096К │ │ │

+--------------+ +--------------+ │ │

│ 897К │ │ 2001К │ │ │

+--------------+ +--------------+ L---------------

│ │ │ │

│ │ │ │

│ │ │ │

│ │ │ │

L--------------- L---------------


Рисунок 6.5. Преобразование виртуальных адресов в физические


каких физических адресах выполняется процесс и где располагаются

таблицы страниц. Поскольку такие операции являются машинно-зави-

симыми и в разных версиях реализуются по-разному, здесь мы их

рассматривать не будем. Часть вопросов, связанных с архитектурой

вычислительных систем, затрагивается в упражнениях.

Организацию управления памятью попробуем пояснить на следую-

щем простом примере. Пусть память разбита на страницы размером 1

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

ранее таблицы страниц. Регистры управления памятью в системе

группируются по три; первый регистр в тройке содержит адрес таб-

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

виртуальный адрес, отображаемый с помощью тройки регистров, тре-

тий регистр содержит управляющую информацию, такую как номера

страниц в таблице страниц и права доступа к страницам (только

чтение, чтение и запись). Такая модель соответствует вышеописан-

ной модели области. Когда ядро готовит процесс к выполнению, оно

загружает тройки регистров соответствующей информацией из записей

частной таблицы областей процесса.

Если процесс обращается к ячейкам памяти, расположенным за

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

исключительная ситуация. Например, если область команд имеет раз-

мер 16 Кбайт (Рисунок 6.5), а процесс обращается к виртуальному

адресу 26К, создается исключительная ситуация, обрабатываемая

операционной системой. То же самое происходит, если процесс пыта-

ется обратиться к памяти, не имея соответствующих прав доступа,

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

команд. И в том, и в другом примере процесс обычно завершается

(более подробно об этом в следующей главе).


6.2.3 Размещение ядра


Несмотря на то, что ядро работает в контексте процесса,

отображение виртуальных адресов, связанных с ядром, осуществляет-

ся независимо от всех процессов. Программы и структуры данных яд-

ра резидентны в системе и совместно используются всеми процесса-

ми. При запуске системы происходит загрузка программ ядра в

память с установкой соответствующих таблиц и регистров для отоб-

ражения виртуальных адресов ядра в физические. Таблицы страниц

для ядра имеют структуру, аналогичную структуре таблицы страниц,

связанной с процессом, а механизмы отображения виртуальных адре-

сов ядра похожи на механизмы, используемые для отображения поль-

зовательских адресов. На многих машинах виртуальное адресное

пространство процесса разбивается на несколько классов, в том

числе системный и пользовательский, и каждый класс имеет свои

собственные таблицы страниц. При работе в режиме ядра система


разрешает доступ к адресам ядра, при работе же в режиме задачи

такого рода доступ запрещен. Поэтому, когда в результате прерыва-

ния или выполнения системной функции происходит переход из режима

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

техническими средствами разрешает ссылки на адреса ядра, а при

возврате в режим ядра эти ссылки уже запрещены. В других машинах

можно менять преобразование виртуальных адресов, загружая специ-

альные регистры во время работы в режиме ядра.

На Рисунке 6.6 приведен пример, в котором виртуальные адреса

от 0 до 4М-1 принадлежат ядру, а начиная с 4М - процессу. Имеются

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

одна для адресов процесса, причем каждой группе соответствует

таблица страниц, хранящая номера физических страниц со ссылкой на

адреса виртуальных страниц. Адресные ссылки с использованием

группы регистров ядра допускаются системой только в режиме ядра;

следовательно, для перехода между режимом ядра и режимом задачи

требуется только, чтобы система разрешила или запретила адресные

ссылки с использованием группы регистров ядра.

В некоторых системах ядро загружается в память таким образом,

что большая часть виртуальных адресов ядра совпадает с физически-

ми адресами и функция преобразования виртуальных адресов в физи-

ческие превращается в функцию тождественности. Работа с прост-

ранством процесса, тем не менее, требует, чтобы преобразование

виртуальных адресов в физические производилось ядром.


Адрес таблицы Вирту- Номера стра-

страниц альный ниц в табли-

адрес це

------------T------------T-----------┐

Регистр ядра 1 │ --------┐ 0 │ │

+-----------+-│----------+-----------+

Регистр ядра 2 │ ---┐ │ │ 1М │ │

+--------│--+-│----------+-----------+

Регистр ядра 3 │ --┐│ │ │ 2М │ │

+-------││--+-│----------+-----------+

Регистр процесса 1 │ ---- ││ │ │ 4М │ │

+-│-----││--+-│----------+-----------+

Регистр процесса 2 │ │--- ││ │ │ │ │

+-││----││--+-│----------+-----------+

Регистр процесса 3 │ ││-- ││ │ │ │ │

L-│││---││--+-│----------+------------

--------------------------││ ││ │

│ ----------------│ │L----│-------┐

│ │ ------ L-----│-------│----------┐

│ │ │ ---- │ │

v v v v v v

-------┐ -------┐ -------┐ -------┐ -------┐ -------┐

│ 856K │ │ 747K │ │ 556K │ │ 0K │ │ 128K │ │ 256K │

+------+ +------+ +------+ +------+ +------+ +------+

│ 917K │ │ 950K │ │ 997K │ │ 4K │ │ 97K │ │ 292K │

+------+ +------+ +------+ +------+ +------+ +------+

│ 564K │ │ 333K │ │ 458K │ │ 3K │ │ 135K │ │ 304K │

+------+ +------+ +------+ +------+ +------+ +------+

│ 444K │ │ │ │ 632K │ │ 17K │ │ 139K │ │ 279K │

+------+ │ │ +------+ +------+ +------+ +------+

│ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ │ │ │ │ │ │ │ │

L------- L------- L------- L------- L------- L-------


Таблицы страниц процесса Таблицы страниц ядра

(области)


Рисунок 6.6. Переключение режима работы с непривилегированно-

го (режима задачи) на привилегированный (режим

ядра)


6.2.4 Пространство процесса


Каждый процесс имеет свое собственное пространство, однако

ядро обращается к пространству выполняющегося процесса так, как

если бы в системе оно было единственным. Ядро подбирает для теку-

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

для работы с пространством процесса. При компиляции загрузчик

назначает переменной 'u' (имени пространства процесса) фиксиро-

ванный виртуальный адрес. Этот адрес известен остальным компонен-

там ядра, в частности модулю, выполняющему переключение контекста

(раздел 6.4.3). Ядру также известно, какие таблицы управления па-

мятью используются при трансляции виртуальных адресов, принадле-

жащих пространству процесса, и благодаря этому ядро может быстро

перетранслировать виртуальный адрес пространства процесса в дру-

гой физический адрес. По одному и тому же виртуальному адресу яд-