Поскольку сами программы обработки прерываний могут прерываться, единственно возможный способ точно управлять ситуацией — сделать так, чтобы все
прерывания были прозрачными. Рассмотрим простой пример с несколькими прерываниями. Пусть компьютер имеет три устройства ввода-вывода: принтер, диск и линию 118232 с приоритетами 2, 4 и 5 соответственно. Изначально (£ = О, где Ь — время) работает пользовательская программа. При £ = 10 принтер неожиданно инициирует прерывание. Запускается программа обработки прерывания (1811) от принтера, как показано на рис. 5.28.
Рис. 5.28. Пример с несколькими прерываниями. Последовательность действий
При £ = 15 прерывания требует линия 118232. Так как линия 118232 имеет более высокий приоритет (5), чем принтер (2), инициируется обработка этого прерывания. Состояние машины, при котором работает 1811 принтера, сохраняется в стеке, и начинается выполнение программы обработки прерывания линии 118232.
Немного позже, при £ = 20, диск завершает свою работу и сигнализирует об этом прерыванием. Однако его приоритет (4) ниже, чем приоритет работающей в данный момент программы обработки прерываний (5), поэтому центральный процессор не подтверждает прием сигнала прерывания, и диск вынужден ждать. При £ = 25 заканчивает работать 1811 линии 118232, и машина возвращается в то состояние, в котором она находилась до прерывания от линии 118232, то есть в состояние, соответствующее работе 1811 принтера с приоритетом 2. Как только центральный процессор переключается на приоритет 2, еще до выполнения первой команды, диск с приоритетом 4 совершает прерывание, и запускается 1811 диска. После ее завершения снова продолжается программа обработки прерываний от принтера. Наконец, при £ = 40 все программы обработки прерываний завершаются, и выполнение пользовательской программы начинается с того места, на котором она прервалась.
Со времен процессора 8088 все процессоры Intel имеют два уровня (приоритета) прерываний: маскируемые и немаскируемые прерывания. Немаскируемые прерывания обычно используются только для сообщения об очень серьезных ситуациях, например об ошибках четности в памяти. Для всех устройств ввода-вывода имеется единственное маскируемое прерывание.
Когда устройство ввода-вывода требует прерывания, центральный процессор использует вектор прерывания при индексировании таблицы из 256 элементов, чтобы найти адрес программы обработки прерываний. Элементы таблицы представляют собой 8-байтные дескрипторы сегмента. Таблица может начинаться в любом месте памяти. Глобальный регистр указывает на ее начало.
При наличии только одного уровня прерываний у центрального процессора нет возможности сделать так, чтобы высокоприоритетное устройство прерывало работу среднеприоритетной программы обработки прерываний, пока этому мешает низкоприоритетное устройство. Для решения проблемы центральные процессоры Intel обычно используют внешний контроллер прерываний (например, 8259А). При первом прерывании (например, с приоритетом п) работа процессора приостанавливается. Если после этого происходит еще одно прерывание с более высоким приоритетом, контроллер прерывания инициирует прерывание во второй раз. Если же второе прерывание обладает более низким приоритетом, оно не инициируется до окончания первого. Чтобы эта система работала, контроллер прерываний должен каким-либо образом узнавать о завершении текущей программы обработки прерываний. Поэтому когда полностью завершается обработка текущего прерывания, центральный процессор должен посылать контроллеру прерываний специальную команду.