The design of the unix operating system by Maurice J
Вид материала | Реферат |
Введение в архитектуру ядра операционной системы 2.1 Архитектура операционной системы unix 2.2 Введение в основные понятия системы |
- Лекция 10. Файловые системы Unix, 116.79kb.
- Уровни рассмотрения, 314.07kb.
- Курс по операционным системам (на примере ос windows) Основан на учебном курсе Windows, 29.21kb.
- Выполнил ученик 11 «А» класса, 443.51kb.
- Ос лекция 1 (2-й семестр – временно), 101.4kb.
- Operating System, 7686.97kb.
- Unix-подобные операционные системы, характеристики, особенности, разновидности, 40.63kb.
- 1. ms sql server. Общие сведения, 66.03kb.
- Shanti ananda maurice, 89.84kb.
- Методические материалы, 3002.45kb.
скорее относиться к "ядру", распределяющему ресурсы, или к "яд-
ру", производящему различные операции, и это будет означать, что
процесс, выполняемый в режиме ядра, распределяет ресурсы и произ-
водит соответствующие операции. Например, командный процессор
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. Таблицы файлов, дескрипторов файла и индексов