Прерывания и цикл команды

Благодаря прерываниям во время выполнения операций ввода-вывода процес­сор может быть занят обработкой других команд. Рассмотрим ход процесса, пока­занный на рис. 1.5,б. Как и в предыдущем случае (без использования прерываний), вызвав процедуру WR1TK., программа обращается к системе. При этом активизирует­ся программа ввода-вывода, которая состоит из подготовительного кода и собственно команд ввода-вывода. После исполнения этих команд управление передается про­грамме пользователя. Тем временем внешнее устройство занято приемом данных из памяти компьютера и их обработкой (например, если этим устройством является принтер, то под обработкой подразумевается распечатка). Ввод-вывод происходит одновременно с выполнением команд программы пользователя.

В тот момент, когда внешнее устройство освобождается и готово для дальней­шей работы, т.е. оно готово принять от процессора новую порцию данных, контрол­лер ввода-вывода этого устройства посылает процессору сигнал запроса прерывания, В ответ процессор приостанавливает выполнение текущей программы, переключаясь на работу с программой, обслуживающей данное устройство ввода-вывода (эту про­грамму называют обработчиком прерываний). Обслужив внешнее устройство, про­цессор снова возобновляет прерванную работу. На рис. 1.5,б места программы, в ко­торых происходит прерывание, обозначены крестиком.

С точки зрения программы пользователя, прерывания — это не что иное, как нарушение обычной последовательности исполнения. После завершения об­работки прерывания работа возобновляется (рис. 1.6). Таким образом, програм­ма пользователя не должна включать в себя какой-нибудь специальный код, чтобы приспосабливаться к прерываниям. За приостановку программы пользова­теля и возобновление ее работы с того самого места, в котором она была прерва­на, отвечают процессор и операционная система.

 

Чтобы согласовать прерывание с программой, в цикл команды добавляется цикл прерывания (см. рис. 1.7, сравните с рис. 1.2). В цикле прерывания про­цессор проверяет наличие сигналов прерываний, свидетельствующих о проис­шедших прерываниях. При поступлении прерывания процессор приостанавлива­ет работу с текущей программой и выполняет обработчик прерываний. Обработ­чики прерываний обычно входят в состав операционной системы. Как правило, эти программы определяют природу прерывания и выполняют необходимые дей­ствия. Например, в используемом примере обработчик должен определить, ка­кой из контроллеров ввода-вывода сгенерировал прерывание; кроме того, он мо­жет передавать управление программе, которая должна вывести данные на уст­ройство ввода-вывода. Когда обработчик прерываний завершает свою работу, процессор возобновляет выполнение программы пользователя с того места, где она была прервана.

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

 

Чтобы оценить выигрыш в эффективности, рассмотрим временную диа­грамму (рис. 1.8), иллюстрирующую ход процессов, показанных на рис. 1.5,а и б. В ситуации, показанной на рис. 1.5,б и 1.8, предполагается, что для выполне­ния операций ввода-вывода требуется сравнительно короткое время, т.е. мень­шее, чем время обработки команд, которые расположены в программе пользователя между операциями записи. Более типичным, особенно для таких медлен­ных устройств, как принтер, является случай, когда операции ввода-вывода занимают намного больше времени, чем требуется для выполнения последова­тельности команд пользователя. Такая ситуация показана на рис. 1.5,в. В этом случае программа пользователя дойдет до следующего вызова WRITE еще до за­вершения операции ввода-вывода, порожденной предыдущим вызовом. В ре­зультате в этом месте программа пользователя будет приостановлена. После за­вершения обработки предыдущей операции ввода-вывода придет очередь обрабо­тать новое обращение к процедуре WRITE, и будут запущены новые операции ввода-вывода. На рис. 1.9 представлена диаграмма выполнения программы в среде без прерываний и с прерываниями для описанного случая. Как видно, в такой ситуации выигрыш в эффективности все равно существует, так как часть времени, в течение которого выполняются операции ввода-вывода, перекрывает­ся выполнением команд пользователя.

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

Прерывание вызывает ряд событий, которые происходят как в аппаратном, так и в программном обеспечении. На рис. 1.10 показана типичная последова­тельность этих событий. После завершения работы устройства ввода-вывода про­исходит следующее.

1. Устройство посылает процессору сигнал прерывания.

2. Перед тем как ответить на прерывание, процессор должен завершить ис­полнение текущей команды (см. рис. 1.7). '

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


 

4. Теперь процессору нужно подготовиться к передаче управления обработчику прерываний. Сначала необходимо сохранить всю важную информацию, что­бы в дальнейшем можно было вернуться к тому месту текущей программы, где она была приостановлена. Минимальная требуемая информация — это слово состояния программы и адрес очередной выполняемой команды, ко­торый находится в программном счетчике. Эти данные заносятся в систем­ный управляющий стек.


 

5. Далее в программный счетчик процессора загружается адрес входа про­граммы обработки прерываний, которая отвечает за обработку данного пре­рывания. В зависимости от архитектуры компьютера и устройства операционной системы может существовать как одна программа для обработки всех прерываний, так может быть и своя программа обработки для каждого уст­ройства и каждого типа прерываний. Если для обработки прерываний име­ется несколько программ, то процессор должен определить, к какой из них следует обратиться. Эта информация может содержаться в первоначальном сигнале прерывания; в противном случае для получения необходимой информации процессор должен по очереди опросить все устройства, чтобы оп­ределить, какое из них отправило прерывание.

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


6. Содержимое программного счетчика и слово состояния прерываемой про­граммы уже хранятся в системном стеке. Однако это еще не вся информа­ция, имеющая отношение к состоянию исполняемой программы. Например, нужно сохранить содержимое регистров процессора, так как эти регистры могут понадобиться обработчику прерываний- Поэтому необходимо сохра­нить всю информацию о состоянии программы. Обычно обработчик преры­ваний начинает свою работу с записи в стек содержимого всех регистров. Другая информация, которая должна быть сохранена, обсуждается в гла­ве 3, "Описание процессов и управление ими". На рис. 1-11, а показан про­стой пример, в котором программа пользователя прерывается после выпол­нения команды из ячейки N. Содержимое всех регистров, а также адрес следующей команды (7V+1), в сумме составляющие М слов, заносятся в стек. Указатель стека при этом обновляется, указывая на новую вершину стека. Обновляется и программный счетчик, указывая на начало програм­мы обработки прерывания.

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

8. После завершения обработки прерываний из стека извлекаются сохранен­ные ранее значения, которые вновь заносятся в регистры, возобновляя та­ким образом то состояние, в котором они пребывали до прерывания (см., например, рис. 1.11,6). ^ -

9. Последний этап — восстановление из стека слова состояния программы и содержимого программного счетчика. В результате следующей будет вы­полняться команда прерванной программы.

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