Множественные прерывания

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


 

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


 

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

При втором подходе учитывается приоритет прерывания, что позволяет приостановить обработку прерывания с более низким приоритетом в пользу прерывания с более высоким приоритетом (рис. 1.12,б). Как пример применения этого подхода рассмотрим систему с тремя устройствами ввода-вывода: принтером, диском и ком­муникационной линией, которым присвоены приоритеты в возрастающей последова­тельности — 2, 4 и 5, соответственно. На рис. 1.13 показана очередность обработки прерываний, поступивших от этих устройств. Программа пользователя запускается в момент времени t = 0. В момент t = 10 происходит прерывание принтера. Информа­ция о программе пользователя заносится в системный стек, и в действие вступает стандартная программа обслуживания прерывания (interrupt service routine — ISR). Во время ее работы в момент t = 15 происходит коммуникационное прерывание. Из-за того, что его приоритет выше, чем приоритет прерывания принтера, процессор приступает к его обработке. ISR принтера прерывается, информация о ее состоянии заносится в стек, а управление передается коммуникационной ISR. Далее, пока эта программа выполняется, происходит прерывание диска (в момент времени t = 20). Так как его приоритет ниже, коммуникационная ISR продолжает свою работу, пока не закончит ее.

 

После выполнения ISR коммуникационной линии (t = 25) восстанавливается предыдущее состояние процессора, т.е. работа с ISR принтера. Однако прежде чем успеет выполниться хоть одна команда этой программы, процессор приступает к обработке прерывания диска, которое обладает более высоким приоритетом, и управ­ление передается ISR диска. Только после завершения этой программы (t = 35) во­зобновляет работу ISR принтера. И, наконец, после завершения обработки этого пре­рывания управление передается программе пользователя.