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