The design of the unix operating system by Maurice J

Вид материалаРеферат
6.3 Контекст процесса
6.4 Сохранение контекста процесса
Подобный материал:
1   ...   16   17   18   19   20   21   22   23   ...   55

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

вающим пространства двух процессов.

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

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

Поскольку ядро в каждый момент времени работает только с одним

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

пространство процесса частично описывает контекст процесса, вы-

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

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

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


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

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

адрес це

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

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

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

Регистр ядра 2 │ │ │ │

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

(Прост- Регистр ядра 3 │ ---┐ │ 2M │ 4 │

ранство L--------│--+------------+------------

процесса) │

L---------------------┐



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

v

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

│ 114K │ │ 843K │ │1879K │ │ 184K │

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

│ 708K │ │ 794K │ │ 290K │ │ 176K │

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

│ 143K │ │ 361K │ │ 450K │ │ 209K │

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

│ 565K │ │ 847K │ │ 770K │ │ 477K │

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

Процесс A Процесс B Процесс C Процесс D


Рисунок 6.7. Карта памяти пространства процесса в ядре


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

4 Кбайта и помещается по виртуальному адресу 2М. На Рисунке 6.7

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

ся к программам и данным ядра (адреса и указатели не показаны), а

третий регистр адресует к пространству процесса D. Если ядру нуж-

но обратиться к пространству процесса A, оно копирует связанную с

этим пространством информацию из соответствующей таблицы страниц

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

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

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

новым адресом. Информация в регистрах 1 и 2 для ядра неизменна,

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

ядра.


6.3 КОНТЕКСТ ПРОЦЕССА


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

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

щихся к процессу аппаратных регистров и структур данных ядра. С

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

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

текст (*). Пользовательский контекст состоит из команд и данных

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

пространства памяти в виртуальных адресах процесса. Те части вир-

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

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

ния страниц, также включаются в пользовательский контекст.

Регистровый контекст состоит из следующих компонент:

* Счетчика команд, указывающего адрес следующей команды, кото-

рую будет выполнять центральный процессор; этот адрес являет-

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

ранства задачи.

* Регистра состояния процессора (PS), который указывает аппа-

ратный статус машины по отношению к процессу. Регистр PS,

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

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

или отрицательным, переполнен ли регистр с установкой бита

переноса и т.д. Операции, влияющие на установку регистра PS,

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

и содержится аппаратный статус машины по отношению к процес-

су. В других имеющих важное значение подполях регистра PS

указывается текущий уровень прерывания процессора, а также

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

ра/задачи). По значению подполя текущего режима выполнения

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

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

ра.

* Указателя вершины стека, в котором содержится адрес следующе-

го элемента стека ядра или стека задачи, в соответствии с ре-

жимом выполнения процесса. В зависимости от архитектуры маши-

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

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

тектуры машины также зависит направление увеличения стека (к

старшим или младшим адресам), но для нас сейчас эти вопросы

несущественны.

* Регистров общего назначения, в которых содержится информация,

сгенерированная процессом во время его выполнения. Чтобы об-

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

ра - регистр 0 и регистр 1 - для дополнительного использова-

ния при передаче информации между процессами и ядром.

Системный контекст процесса имеет "статическую часть" (первые

три элемента в нижеследующем списке) и "динамическую часть" (пос-

ледние два элемента). На протяжении всего времени выполнения про-

цесс постоянно располагает одной статической частью системного

контекста, но может иметь переменное число динамических частей.

Динамическую часть системного контекста можно представить в виде


---------------------------------------

(*) Используемые в данном разделе термины "пользовательский кон-

текст" (user-level context), "регистровый контекст" (register

context), "системный контекст" (system-level context) и "кон-

текстные уровни" (context layers) введены автором.


стека, элементами которого являются контекстные уровни, которые

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

нии различных событий. Системный контекст включает в себя следую-

щие компоненты:

* Запись в таблице процессов, описывающая состояние процесса

(раздел 6.1) и содержащая различную управляющую информацию, к

которой ядро всегда может обратиться.

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

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

в контексте процесса. Общие управляющие параметры, такие как

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

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

процесса.

* Записи частной таблицы областей процесса, общие таблицы об-

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

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

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

жащие процессу. Если несколько процессов совместно используют

общие области, эти области входят составной частью в контекст

каждого процесса, поскольку каждый процесс работает с этими

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

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

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

* Стек ядра, в котором хранятся записи процедур ядра, если про-

цесс выполняется в режиме ядра. Несмотря на то, что все про-

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

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

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

процесс вызывает функцию creat и приостанавливается в ожида-

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

функцию read и приостанавливается в ожидании завершения пере-

дачи данных с диска в память. Оба процесса обращаются к функ-

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

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

щений. Ядро должно иметь возможность восстанавливать содержи-

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

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

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

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

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

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

твующий ему стек ядра пуст.

* Динамическая часть системного контекста процесса, состоящая

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

ется от элементов в порядке, обратном порядку их поступления.

На каждом уровне системного контекста содержится информация,

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

щая в себя регистровый контекст предыдущего уровня.

Ядро помещает контекстный уровень в стек при возникновении

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

нии контекста процесса. Контекстный уровень выталкивается из сте-

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

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

чении контекста. Таким образом, переключение контекста влечет за

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

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

процесса, а извлекает из стека контекстный уровень нового процес-

са. Информация, необходимая для восстановления текущего контекс-

тного уровня, хранится в записи таблицы процессов.

На Рисунке 6.8 изображены компоненты контекста процесса. Сле-

ва на рисунке изображена статическая часть контекста. В нее

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


Статическая часть контекста Динамическая часть контекста

--------------------------┐ логичес- │ │

│Пользовательский контекст│ кий ука- │ │

│ ----------------------┐ │ затель на│ │

│ │ Программы процесса │ │ текущий │ │

│ │ Данные │ │--------->+----------------+

│ │ Стек │ ││ контек- │ Стек ядра для │

│ │ Разделяемые данные │ ││ стный │ уровня 3 │

│ L---------------------- ││ уровень │ │

│ ││ │ Сохраненный ре-│

│ Статическая часть ││Уровень 3│ гистровый кон- │

│ системного контекста ││ │ текст уровня 2 │

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

│ │ Запись таблицы про- │ ││ │ Стек ядра для │

│ │ цессов +-+- │ уровня 2 │

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

│ │ Частная таблица об- │ │ │ Сохраненный ре-│

│ │ ластей процесса │ │ Уровень 2│ гистровый кон- │

│ L---------------------- │ │ текст уровня 1 │

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

│ Стек ядра для │

│ уровня 1 │

│ │

│ Сохраненный ре-│

Уровень 1│ гистровый кон- │

│ текст уровня 0 │

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

Контекстный│ │

уровень│ (Пользователь- │

ядра 0│ ский уровень) │

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


Рисунок 6.8. Компоненты контекста процесса


(машинных инструкций), данных, стека и разделяемой памяти (если

она имеется), а также статическая часть системного контекста,

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

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

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

Справа на рисунке изображена динамическая часть контекста. Она

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

регистровый контекст предыдущего уровня и стек ядра для текущего

уровня. Нулевой контекстный уровень представляет собой пустой

уровень, относящийся к пользовательскому контексту; увеличение

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

действителен. Стрелка, соединяющая между собой статическую часть

системного контекста и верхний уровень динамической части кон-

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

позволяющая ядру восстанавливать текущий контекстный уровень про-

цесса.

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

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

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

мых в машине уровней прерывания. Например, если в машине поддер-

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

ков, всех остальных периферийных устройств и таймера, то есть 5

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

более 7 контекстных уровней: по одному на каждый уровень прерыва-

ния, 1 для системных функций и 1 для пользовательского контекста.

7 уровней будет достаточно, даже если прерывания будут поступать

в "наихудшем" из возможных порядков, поскольку прерывание данного

уровня блокируется (то есть его обработка откладывается централь-

ным процессором) до тех пор, пока ядро не обработает все прерыва-

ния этого и более высоких уровней.

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

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

каждый момент, не всегда имеет отношение к данному процессу. Нап-

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

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

и ядро обрабатывает прерывание на новом контекстном уровне этого

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

мы обработки прерываний обычно не обращаются к статическим сос-

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

части не связаны с прерываниями.


6.4 СОХРАНЕНИЕ КОНТЕКСТА ПРОЦЕССА


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

помещая в стек новый контекстный уровень. В частности, это имеет

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

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

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

ле.


6.4.1 Прерывания и особые ситуации


Система отвечает за обработку всех прерываний, поступили ли

они от аппаратуры (например, от таймера или от периферийных уст-

ройств), от программ (в связи с выполнением инструкций, вызываю-

щих возникновение "программных прерываний") или явились результа-

том особых ситуаций (таких как обращение к отсутствующей

странице). Если центральный процессор ведет обработку на более

низком уровне по сравнению с уровнем поступившего прерывания, то

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

уровень прерывания процессора повышается, чтобы другие прерывания

с тем же (или более низким) уровнем не могли иметь места до тех

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

обеспечивается сохранение целостности структур данных ядра. В

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

тельность действий:

1. Сохраняет текущий регистровый контекст выполняющегося процес-

са и создает в стеке (помещает в стек) новый контекстный уро-

вень.

2. Устанавливает "источник" прерывания, идентифицируя тип преры-

вания (например, прерывание по таймеру или от диска) и номер

устройства, вызвавшего прерывание (например, если прерывание

вызвано дисковым запоминающим устройством). При возникновении

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

зует в качестве смещения в таблице векторов прерывания. Со-

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

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

вания, соответствующей источнику прерывания, и указывается

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

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

6.9. Если источником прерывания явился терминал, ядро получа-

ет от аппаратуры номер прерывания, равный 2, и вызывает прог-


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

│ Номер прерывания Программа обработки │

│ прерывания │

│ │

│ 0 clockintr │

│ 1 diskintr │

│ 2 ttyintr │

│ 3 devintr │

│ 4 softintr │

│ 5 otherintr │

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


Рисунок 6.9. Пример векторов прерывания


рамму обработки прерываний от терминала, именуемую ttyintr.

3. Вызов программы обработки прерывания. Стек ядра для нового

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

чаться от стека ядра предыдущего контекстного уровня. В неко-

торых разработках стек ядра текущего процесса используется

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

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

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

рат из программы без переключения контекста.

4. Программа завершает свою работу и возвращает управление ядру.

Ядро исполняет набор машинных команд по сохранению регистро-

вого контекста и стека ядра предыдущего контекстного уровня в

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

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

Программа обработки прерываний может повлиять на поведение

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

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

ных процессов. Однако, обычно процесс продолжает выполняться

так, как если бы прерывание никогда не происходило.


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

│ алгоритм inthand /* обработка прерываний */ │

│ входная информация: отсутствует │

│ выходная информация: отсутствует │

│ { │

│ сохранить (поместить в стек) текущий контекстный │

│ уровень; │

│ установить источник прерывания; │

│ найти вектор прерывания; │

│ вызвать программу обработки прерывания; │

│ восстановить (извлечь из стека) предыдущий кон- │

│ текстный уровень; │

│ } │

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


Рисунок 6.10. Алгоритм обработки прерываний


На Рисунке 6.10 кратко изложено, каким образом ядро обрабаты-

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

ледовательности машинных операций или микрокоманд на некоторых

машинах достигается больший эффект по сравнению с тем, когда все

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

кие места, связанные с числом сохраняемых контекстных уровней и

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

текста. По этой причине определенные операции, выполнения которых

требует реализация системы UNIX, являются машинно-зависимыми.


Последовательность прерываний

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

│ Контекстный уровень ядра 3 │

│ Исполнить программу обра- │

│ ботки прерывания по таймеру │

│ │

│ Сохранить регистровый кон- │

│ текст программы обработки │

│ прерывания от диска │

Прерывание по таймеру +-------------------------------+

│ Контекстный уровень ядра 2 │

│ │ Исполнить программу обра- │

│ │ ботки прерывания от диска │

│ │ │

│ │ Сохранить регистровый кон- │

│ │ текст обращения к системной │

│ │ функции │

Прерывание от диска +-------------------------------+

│ Контекстный уровень ядра 1 │

│ │ Исполнить обращение к сис- │

│ │ темной функции │