Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основы построения операционных систем.doc
Скачиваний:
50
Добавлен:
07.11.2018
Размер:
5.07 Mб
Скачать

4.1.5. Обработка прерываний

Для правильного функционирования системы необходимо взаимодействие между диспетчером, выполняющимся процессом и подсистемой ввода-вывода. Обычно истечение кванта времени или завершение ввода-вывода выявляется в результате прерывания.

Прерывание (interrupt) представляет собой перестановку контекста процесса, вызванную внешней по отношению к выполняемой инструкции причиной. Физически прерывание представляется сигналом, заставляющим процессор менять обычный порядок исполнения потока команд.

Рис.4.5 дает представление о последовательности событий, происходящих в ответ на прерывание.

Рис. 4.5. Основная концепция обработки прерываний

Предположим, что в момент поступления от некоторого источника сигнала прерывания программа А находится в состоянии исполнения. В результате управление автоматически передается на блок обработки прерываний, который обычно является частью операционной системы. Этот блок предназначен для выполнения некоторых действий в ответ на условие, вызвавшее прерывание. После завершения обработки управление снова передается в ту точку программы А, где ее выполнение было прервано.

В описанной последовательности событий возникновение и обработка прерывания могут быть совершенно не связаны с программой А. Например, оно может быть вызвано завершением операции ввода-вывода, выданной другой программой. В общем случае невозможно предсказать, когда и по какой причине программа А будет прервана. Другими словами, по отношению к ней прерывания возникают асинхронно. За сохранение текущего состояния компьютера в момент прерывания программы А, а также за его восстановление, когда программа А будет продолжена, отвечает операционная система. Благодаря этому в случае прерывания ничто, за исключением времени, не влияет на выполнение программы А.

Прерывания распадаются на два основных класса. Внешние прерывания вызываются асинхронными событиями, которые происходят вне прерываемого процесса. Примерами являются прерывания от таймера и от подсистемы ввода-вывода. Внутренние прерывания вызываются событиями, которые связаны с работой процессора и являются синхронными с его операциями. В качестве примеров можно привести попытку деления на нуль, операции с плавающей запятой, вызывающие переполнение или исчезновение порядка. Кроме того, внутренние прерывания происходят при обращении к защищенным или несуществующим ячейкам памяти, а также к отсутствующему сегменту или странице.

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

1. SVC-прерывание возникает при выполнении ЦП команды вызова супервизора (SVC - SuperVisor Call), используемой для вызова функций операционной системы. Механизм SVC помогает защитить операционную систему от пользователей. Пользователю не разрешается самому произвольно входить в операционную систему - он должен запросить требуемую ему услугу при помощи команды SVC. Благодаря этому операционная система всегда знает обо всех запросах пользователя и может не выполнять некоторые из них, если данный пользователь не имеет соответствующих полномочий.

2. Программное прерывание возникает при появлении в процессе работы программы некоторой ситуации, такой как деление на нуль, попытка выполнить неправильную машинную команду, арифметическое переполнение, отсутствие сегмента или страницы, выход за границу сегмента.

3. Прерывание по таймеру вызывается интервальным таймером ЦП. Этот таймер содержит регистр, которому может быть присвоено определенное начальное значение, которое автоматически уменьшается на 1 после использования каждой миллисекунды времени ЦП. Когда это значение становится равным нулю, происходит прерывание по таймеру. Как отмечалось ранее, подобный интервальный таймер используется операционной системой для определения времени, в течение которого процесс может оставаться в состоянии исполнения в ЦП.

4. Прерывание по вводу-выводу вызывается каналами или устройствами ввода-вывода. Причиной многих таких прерываний является нормальное завершение некоторой операции ввода (вывода), однако они могут также оповещать о возникновении различных ошибочных ситуаций.

Для обработки каждого из этих различных типов прерываний в составе операционной системы предусмотрены программы, называемые обработчиками прерываний (IH - Interrupt Handler). Кроме того, как показано на рис.4.6, в оперативной памяти для каждого типа прерываний имеется соответствующая ему рабочая область прерываний. Когда происходит прерывание (например, по таймеру), операционная система запоминает состояние прерванного процесса в соответствующей рабочей области. Затем из двух первых слов области заранее занесенные туда значения загружаются в слово состояния SW и счетчик команд PC. Загрузка счетчика команд новым значением адреса автоматически вызывает передачу управления на соответствующую команду. Этот адрес, заранее сохраненный в рабочей области прерывания, представляет собой начальный адрес стандартной программы обработки прерываний по таймеру. Загрузка слова состояния SW также вызывает определенные изменения в состоянии ЦП (что будет рассмотрено ниже).

После выполнения в ответ на запрос на прерывание требуемого действия стандартная программа обработки прерываний выполняет команду загрузки состояния процессора (LPS - Load Processor Status), в результате чего управление передается прерванной программе (рис.4.7). Команда LPS вызывает загрузку сохраненного содержимого SW, PC и других регистров из соответствующих слов рабочей области, начиная с адреса, указанного в команде. Это приводит к восстановлению содержимого регистров и состояния ЦП, которые были в момент прерывания. Управление затем передается на команду, перед выполнением которой произошло прерывание. Сохранение и восстановление состояний ЦП и содержимого регистров представляют собой операцию контекстного переключения, рассмотренную ранее.

.

Рис. 4.6. Операция контекстного переключения,

вызванная прерыванием по таймеру

Рис. 4.7. Операция контекстного переключения,

вызванная командой LPS

Слово состояния SW содержит часть информации, необходимой для обработки прерываний. Большинство ЭВМ имеет аналогичный регистр, называемый словом состояния программы (PSW - Program Status Word) или словом состояния процессора, разряды которого соответствуют характеристикам состояния устройства или процесса. В компьютерах разного класса этот регистр имеет разное содержимое. Один из возможных вариантов назначений разрядов слова состояния приведен на рис.4.8.

Разряды

Имя поля

Использование

0

1

2 - 5

6 - 7

8 - 11

12 - 15

16 - 23

MODE

IDLE

ID

CC

MASK

ICODE

0 = режим пользователя

1 = режим супервизора

0 = активен

1 = пассивен

Идентификатор процесса

Код условия

Маска прерывания

Не используется

Код прерываний

Рис. 4.8. Содержимое слова состояния

Первым битом (MODE) задается режим, в котором находится ЦП - пользовательский или супервизора. Обычные программы выполняются в пользовательском режиме (MODE=0). Когда происходит прерывание, новое загружаемое содержимое SW­ имеет МODЕ = 1, что автоматически переводит ЦП в режим супервизора. Тем самым становится возможным использование привилегированных команд.

Перед тем, как значение SW­ будет сохранено, в поле ICODE автоматически устанавливается значение, указывающее на причину прерывания. В случае SVC-прерываний ICODE присва­ивается значение, заданное пользователем командой SVC. Он определяет тип сервисного запроса. При программном прерывании в ICODE отражен тип вызвавшего его условия, например деление на нуль. При прерывании по вводу-выводу в ICODE дан номер канала, породивший прерывание.

В ID содержится 4-битовое значение, идентифицирующее текущую выполняемую программу.

Поле IDLE определяет, выпол­няет ли ЦП команды или простаивает.

В SW­ содержится также код состояния процесса СС (Condition Code). Сохранение SW автоматически спасает значение кода состояния прерванного процесса.

Оставшееся поле слова состояния (МАSK) используется для контроля за разрешением прерываний. Это требуется для того, чтобы избежать потери сохраненной ранее информации о состоянии процесса. Предположим, например, что произошло прерывание по вводу-выводу. Значения SW­, РС и других регистров будут сохранены в рабочей области прерывания вводавывода, а ЦП начнет выполнение обработчика прерываний по вводу-выводу. Если до конца обработки первого прерывания произойдет еще одно, снова будет иметь место контекстное переключение. Однако на этот раз в качестве содержимого регистров, сохраняемого в рабочей области, окажутся значения, используемые обработчиком прерываний. Значения же, сохраненные при первом прерывании, будут утрачены, поэтому вернуть управление программе пользователя, которая в тот момент выполнялась, будет нельзя.

Чтобы избежать этого, нужно не допустить наступления прерываний определенного типа, пока первое из них не будет обработано. Это достигается использованием поля МАSК слова состояния. В МАSК каждый бит соответствует некоторому типу прерываний. Если какой-то бит установлен в 1, то прерывания соответствующего типа разрешены, если в 0, то запрещены. В последнем случае говорят, что они маскированы (­часто их также называют запрещенными или закрытыми). Однако маскированные прерывания не теряются, потому что сигнал, вызвавший прерывание, сохраняется аппаратурой. Временно задержанное таким способом прерывание называется отложенным. Когда, вследствие того, что МАSК сброшена, прерывания соответствующего типа вновь разрешаются, сигнал опознается и происходит прерывание.

Каждому типу прерываний присвоен определенный приоритет прерываний. Наивысший приоритет имеют SVC-прерывания (тип 1), затем идут программные (тип 2) и т.д. Поле МАSK в слове состояния устанавливается в соответствии с классом прерывания так, чтобы все прерывания с равным или более низким приоритетом были запрещены, а с более высоким - разрешены. Например, слово состояния, загруженное в результате программного прерывания, будет иметь биты МАSK, соответствующие прерываниям - программным, по таймеру и по вводу-выводу, установленными в 0; эти типы прерываний будут запрещены. Бит в МАSK для SVC-прерываний будет установлен в 1, поэтому они будут разрешены. Когда прерывания по завершении работы обработчика прерываний открываются, среди ожидающих может оказаться более одного типа прерываний (например, по таймеру и по вводу-выводу). В этом случае первым опознается то, что имеет более высокий приоритет.

­ Если используется такая система приоритетов, то программа обработки прерываний сама может быть прервана. Каким образом происходит вложенное прерывание, показано на рис.4.9.

Рис. 4.9. Пример вложенного прерывания

По прерыванию по вводу-выводу состояние программы А, выполняющейся в этот момент на ЦП, сохраняется, а управление передается обработчику прерываний по вводу-выводу. Во время его работы происходит новое прерывание - уже по таймеру, в результате чего управление передается обработчику прерываний по таймеру. По завершении обработки этого прерывания при помощи команды ­LPS из рабочей области прерывания по таймеру восстанавливается состояние ЦП. В результате управление снова передается обработчику прерываний по вводу-выводу. Так как опять загружено старое значение MASK, прерывания по таймеру, которые были запрещены, снова открываются. Однако прерывания по вводу-выводу по-прежнему остаются закрытыми. После завершения обработки прерывания при помощи уже другой LPS восстанавливается состояние ЦП, которое было в момент первого прерывания. Теперь все прерывания открыты, потому что в слове состояния, используемом программой А, все биты MASK установлены в 1.­