The design of the unix operating system by Maurice J

Вид материалаРеферат
Введение в архитектуру ядра операционной системы
2.1 Архитектура операционной системы unix
2.2 Введение в основные понятия системы
Подобный материал:
1   2   3   4   5   6   7   8   9   ...   55
частью любого пользовательского процесса. Сделанный вывод будет

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

ру", производящему различные операции, и это будет означать, что

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

водит соответствующие операции. Например, командный процессор

shell считывает вводной поток с терминала с помощью запроса к

операционной системе. Ядро операционной системы, выступая от име-

ни процессора shell, управляет функционированием терминала и пе-

редает вводимые символы процессору shell. Shell переходит в режим

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

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

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


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


Система UNIX позволяет таким устройства, как внешние

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

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

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

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

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

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

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

приписываются приоритеты в соответствии с очередностью обработки

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

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

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

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

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

задание привилегированных команд, деление на ноль и т.д. Они от-

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

отношению к процессу. Особые ситуации возникают прямо "посреди-

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

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

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

прерывания продолжает выполнение процесса уже начиная со следую-

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

UNIX используется один и тот же механизм.


1.5.2 Уровни прерывания процессора


Ядро иногда обязано предупреждать возникновение прерываний во

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

информацию. Например, во время обработки списка с указателями

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

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

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

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

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

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

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

Рисунке 1.6 показана последовательность уровней прерывания. Если

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

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

сбоев.


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

│ Машинные сбои │ │

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

│ Системные часы │ Высокий приоритет

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

│ Диск │ │

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

│ Сетевое оборудование │ │

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

│ Терминалы │ Низкий приоритет

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

│ Программные прерывания │ │

L------------------------------- v


Рисунок 1.6. Стандартные уровни прерываний


1.5.3 Распределение памяти


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

выполняющимся в данный момент процессом (или частью его, по мень-

шей мере). В процессе компиляции программа-компилятор генерирует

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

формационных структур, а также адресами инструкций и функций.

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

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

руемой ни одна другая программа.

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

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

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

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

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

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

адреса. Такое отображение опирается на возможности аппаратных

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

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

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

ниц памяти. Главы 6 и 9 посвящены более подробному рассмотрению

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

соотношения с аппаратными средствами.


1.6 ВЫВОДЫ


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

ношения между процессами, выполняющимися в режиме задачи и в

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

рационной системы. Процессы выполняются в режиме задачи или в ре-

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

наличию набора обращений к операционной системе. Архитектура сис-

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

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

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

каналов и переназначение ввода-вывода.

Обращения к операционной системе позволяют процессам произво-

дить операции, которые иначе не выполняются. В дополнение к обра-

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

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

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

луживает прерывания, управляет файлами и устройствами и обрабаты-

вает особые ситуации, возникающие в системе. В функции ядра

системы UNIX намеренно не включены многие функции, являющиеся

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

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

пользовательском уровне. В следующей главе содержится более де-

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

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

функционирования.


ВВЕДЕНИЕ В АРХИТЕКТУРУ ЯДРА ОПЕРАЦИОННОЙ СИСТЕМЫ


В предыдущей главе был сделан только поверхностный обзор осо-

бенностей операционной среды UNIX. В этой главе основное внимание

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

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

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


2.1 АРХИТЕКТУРА ОПЕРАЦИОННОЙ СИСТЕМЫ UNIX


Как уже ранее было замечено (см. [Christian 83], стр.239), в

системе UNIX создается иллюзия того, что файловая система имеет

"места" и что у процессов есть "жизнь". Обе сущности, файлы и

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

системы UNIX. На Рисунке 2.1 представлена блок-схема ядра систе-

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

имосвязи друг с другом. В частности, на ней слева изображена фай-

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

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

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

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

воздействие со стороны других модулей.

Схема на Рисунке 2.1 имеет три уровня: уровень пользователя,

уровень ядра и уровень аппаратуры. Обращения к операционной сис-

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

программами и ядром, проведенную на Рисунке 1.1. Обращения к опе-

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

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

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

ми, о чем более подробно см. в главе 6. При этом программы на ас-

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

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

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

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

пользования системных услуг. Для этого во время компиляции библи-

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

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


программы пользователя



│ -----------------------┐

точка пере- │ │ библиотеки │

сечения │ L-----------------------



Уровень пользователя │ │

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

Уровень ядра v v

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

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

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

│ │

------------------+---------------┐ -----------------+---------┐

│ v │ │ v │

│ │ │ │

│ подсистема управле- │ │ ............│

│ ния файлами │ │ . взаимо- .│

│ <---+-┐ │ . действие .│

│ │ │ │ . процессов.│

│ │ │ │ подсистема ............│

│ │ │ │ │ │ ............│

L-------+--------------+----------- │ │ . планиров-.│

│ v L-+> управления . щик .│

│ ---------------┐ │ ............│

│ │ буфер сверх- │ │ ............│

│ │ оперативной │ │ процессами . распреде-.│

│ │ памяти (кеш) │ │ . ление .│

│ L--------------- │ . памяти .│

│ │ ............│

│ │ │ │ │

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

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

│ v . │ │

│ символ . блок │ │

│ . │ │

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

│ │ │

│ драйверы устройств │ │

│ │ │

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

│ │

---------------+------------------------------+------------------┐

│ v аппаратный контроль v │

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

Уровень ядра

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

Уровень аппаратуры

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

│ технические средства (аппаратура) │

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


Рисунок 2.1. Блок-схема ядра операционной системы


На рисунке совокупность обращений к операционной системе раз-

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

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

равления процессами. Файловая подсистема управляет файлами,

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

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

модействуют с подсистемой управления файлами, используя при этом

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

как open ( для того, чтобы открыть файл на чтение или запись),

close, read, write, stat (запросить атрибуты файла), chown (изме-

нить запись с информацией о владельце файла) и chmod (изменить

права доступа к файлу). Эти и другие операции рассматриваются в

главе 5.

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

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

ком данных между ядром и устройствами внешней памяти. Буферный

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

ками, инициирует передачу данных к ядру и обратно. Драйверы уст-

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

работой периферийных устройств. Устройства ввода-вывода блоками

относятся к типу запоминающих устройств с произвольной выборкой;

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

системы воспринимают эти устройства как запоминающие устройства с

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

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

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

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

с драйверами устройств "неструктурированного" ввода-вывода, без

вмешательства буферного механизма. К устройствам неструктуриро-

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

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

ройств ввода-вывода блоками.

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

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

нирование выполнения процессов. Подсистема управления файлами и

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

когда файл загружается в память на выполнение (см. главу 7): под-

система управления процессами читает в память исполняемые файлы

перед тем, как их выполнить.

Примерами обращений к операционной системе, используемых при

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

цесса), exec (наложение образа программы на выполняемый процесс),

exit (завершение выполнения процесса), wait (синхронизация про-

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

рожденного процесса), brk (управление размером памяти, выделенной

процессу) и signal (управление реакцией процесса на возникновение

экстраординарных событий). Глава 7 посвящена рассмотрению этих и

других системных вызовов.

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

процессам. Если в какой-то момент система испытывает недостаток в

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

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

цессы имели возможность выполняться. В главе 9 описываются два

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

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

ком, т.к. она "планирует" выделение памяти процессам и оказывает

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

дальнейшем мы будем стараться ссылаться на нее как на "программу

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

процессора.

Модуль "планировщик" распределяет между процессами время

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

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

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

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

нения превысит заранее определенный квант времени. Планировщик

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

оритетом; выполнение предыдущего процесса (приостановленного) бу-

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

приоритетов всех готовых к запуску процессов. Существует несколь-

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

мена сигналами о событиях до синхронного обмена сообщениями.

Наконец, аппаратный контроль отвечает за обработку прерываний

и за связь с машиной. Такие устройства, как диски и терминалы,

могут прерывать работу центрального процессора во время выполне-

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

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

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

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


2.2 ВВЕДЕНИЕ В ОСНОВНЫЕ ПОНЯТИЯ СИСТЕМЫ


В это разделе дается обзор некоторых основных информационных

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

ся функционирование модулей ядра, показанных на Рисунке 2.1.


2.2.1 Обзор особенностей подсистемы управления файлами


Внутреннее представление файла описывается в индексе, который

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

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

время доступа. Термин "индекс" (inode) широко используется в ли-

тературе по системе UNIX. Каждый файл имеет один индекс, но может

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

дексе. Каждое имя является указателем. Когда процесс обращается к

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

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

путь поиска каталогов, и в конце концов возвращает индекс файла.

Например, если процесс обращается к системе:

open("/fs2/mjb/rje/sourcefile", 1);

ядро системы возвращает индекс для файла

"/fs2/mjb/rje/sourcefile". Если процесс создает новый файл, ядро

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

файловой системе (и это мы еще увидим), однако при обработке фай-

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

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

файлов и пользовательскую таблицу дескрипторов файла. Таблица

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

таблица дескрипторов файла выделяется под процесс. Если процесс

открывает или создает файл, ядро выделяет в каждой таблице эле-

мент, корреспондирующий с индексом файла. Элементы в этих трех

структурах - в пользовательской таблице дескрипторов файла, в

таблице файлов и в таблице индексов - хранят информацию о состоя-

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

нится смещение в байтах от начала файла до того места, откуда

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

а также информация о правах доступа к открываемому процессу. Таб-

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

файлы. На Рисунке 2.2 показаны эти таблицы и связи между ними.

В системных операциях open (открыть) и creat (создать) ядро возв-

ращает дескриптор файла, которому соответствует указатель в таб-

лице дескрипторов файла. При выполнении операций read (читать) и

write (писать) ядро использует дескриптор файла для входа в таб-

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

таблицу индексов, находит информацию в файле. Более подробно эти

информационные структуры рассматриваются в главах 4 и 5. Сейчас

достаточно сказать, что использование этих таблиц обеспечивает

различную степень разделения доступа к файлу.


Пользовательская

таблица дескрип- Таблица Таблица

торов файла файлов индексов

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

│ - + - ┐ │ │ │ │

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

│ - + ┐ │ │ │ │ │

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

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

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

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

│ │L - ┐ │ │ │ │

│ │ │ │ +-----+

│ │ │ +-----+ - - - - ->│ │

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

│ │ +-----+ │ │

│ │ │ │ │ │

│ │ │ │ │ │

│ │ │ │ │ │

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


Рисунок 2.2. Таблицы файлов, дескрипторов файла и индексов