Выполнение пользовательских
процессов в системе UNIX
осуществляется на двух уровнях:
уровне пользователя и уровне ядра.
Когда процесс производит обращение
к операционной системе, режим
выполнения процесса переключается
с режима задачи (пользовательского)
на режим ядра: операционная система
пытается обслужить запрос
пользователя, возвращая код ошибки
в случае неудачного завершения
операции. Даже если пользователь не
нуждается в каких-либо
определенных услугах операционной
системы и не обращается к ней с
запросами, система еще выполняет
учетные операции, связанные с
пользовательским процессом,
обрабатывает прерывания, планирует
процессы, управляет распределением
памяти и т.д. Большинство
вычислительных систем
разнообразной архитектуры (и
соответствующие им операционные
системы) поддерживают большее
число уровней, чем указано здесь,
однако уже двух режимов, режима
задачи и режима ядра, вполне
достаточно для системы UNIX. Основные различия между этими
двумя режимами: Рисунок 1.5. Процессы и
режимы их выполнения Проще говоря, любое
взаимодействие с аппаратурой
описывается в терминах режима ядра
и режима задачи и протекает
одинаково для всех
пользовательских программ,
выполняющихся в этих режимах.
Операционная система хранит
внутренние записи о каждом
процессе, выполняющемся в системе.
На Рисунке 1.5 показано
это разделение: ядро делит процессы
A, B, C и D, расположенные вдоль
горизонтальной оси, аппаратные
средства вводят различия между
режимами выполнения,
расположенными по вертикали. Несмотря на то, что система
функционирует в одном из двух
режимов, ядро действует от имени
пользовательского процесса. Ядро
не является какой-то особой
совокупностью процессов,
выполняющихся параллельно с
пользовательскими, оно само
выступает составной частью любого
пользовательского процесса.
Сделанный вывод будет скорее
относиться к "ядру",
распределяющему ресурсы, или к
"ядру", производящему
различные операции, и это будет
означать, что процесс, выполняемый
в режиме ядра, распределяет ресурсы
и производит соответствующие
операции. Например, командный
процессор shell считывает вводной
поток с терминала с помощью запроса
к операционной системе. Ядро
операционной системы, выступая от
имени процессора shell, управляет
функционированием терминала и
передает вводимые символы
процессору shell. Shell переходит в
режим задачи, анализирует поток
символов, введенных пользователем
и выполняет заданную
последовательность действий,
которые могут потребовать
выполнения и других системных
операций. Система UNIX позволяет таким
устройства, как внешние устройства
ввода-вывода и системные часы,
асинхронно прерывать работу
центрального процессора. По
получении сигнала прерывания ядро
операционной системы сохраняет
свой текущий контекст (застывший
образ выполняемого процесса),
устанавливает причину прерывания и
обрабатывает прерывание. После
того, как прерывание будет
обработано ядром, прерванный
контекст восстановится и работа
продолжится так, как будто ничего
не случилось. Устройствам обычно
приписываются приоритеты в
соответствии с очередностью
обработки прерываний. В процессе
обработки прерываний ядро
учитывает их приоритеты и
блокирует обслуживание прерывания
с низким приоритетом на время
обработки прерывания с более
высоким приоритетом. Особые ситуации связаны с
возникновением незапланированных
событий, вызванных процессом, таких
как недопустимая адресация,
задание привилегированных команд,
деление на ноль и т.д. Они
отличаются от прерываний, которые
вызываются событиями, внешними по
отношению к процессу. Особые
ситуации возникают прямо
"посредине" выполнения
команды, и система, обработав
особую ситуацию, пытается
перезапустить команду; считается,
что прерывания возникают между
выполнением двух команд, при этом
система после обработки прерывания
продолжает выполнение процесса уже
начиная со следующей команды. Для
обработки прерываний и особых
ситуаций в системе UNIX используется
один и тот же механизм. Ядро иногда обязано
предупреждать возникновение
прерываний во время критических
действий, могущих в случае
прерывания запортить информацию.
Например, во время обработки списка
с указателями возникновение
прерывания от диска для ядра
нежелательно, т.к. при обработке
прерывания можно запортить
указатели, что можно увидеть на
примере в следующей главе. Обычно
имеется ряд привилегированных
команд, устанавливающих уровень
прерывания процессора в слове
состояния процессора. Установка
уровня прерывания на определенное
значение отсекает прерывания этого
и более низких уровней, разрешая
обработку только прерываний с
более высоким приоритетом. На
Рисунке 1.6
показана последовательность
уровней прерывания. Если ядро
игнорирует прерывания от диска, в
этом случае игнорируются и все
остальные прерывания, кроме
прерываний от часов и машинных
сбоев. Ядро постоянно располагается в
оперативной памяти, наряду с
выполняющимся в данный момент
процессом (или частью его, по
меньшей мере). В процессе
компиляции программа-компилятор
генерирует последовательность
адресов, являющихся адресами
переменных и информационных
структур, а также адресами
инструкций и функций. Компилятор
генерирует адреса для виртуальной
машины так, словно на физической
машине не будет выполняться
параллельно с транслируемой ни
одна другая программа. Когда программа запускается на
выполнение, ядро выделяет для нее
место в оперативной памяти, при
этом совпадение виртуальных
адресов, сгенерированных
компилятором, с физическими
адресами совсем необязательно.
Ядро, взаимодействуя с аппаратными
средствами, транслирует
виртуальные адреса в физические,
т.е. отображает адреса,
сгенерированные компилятором, в
физические, машинные адреса. Такое
отображение опирается на
возможности аппаратных средств,
поэтому компоненты системы UNIX,
занимающиеся им, являются
машинно-зависимыми. Например,
отдельные вычислительные машины
имеют специальное оборудование для
подкачки выгруженных страниц
памяти. Главы 6 и 9 посвящены более
подробному рассмотрению вопросов,
связанных с распределением памяти,
и исследованию их соотношения с
аппаратными средствами. Предыдущая
глава || Оглавление
|| Следующая глава
1.5 ПРЕДПОЛАГАЕМАЯ
АППАРАТНАЯ СРЕДА
Процессы
A
B
C
D
Режим ядра
Я
.
.
Я
Режим задачи
.
З
З
.
1.5.1 Прерывания и особые
ситуации
1.5.2 Уровни прерывания
процессора
Рисунок 1.6. Стандартные уровни
прерываний 1.5.3 Распределение
памяти