Стек прерывания: куда девается прерванная работа
Сигнал, сохранение состояния, обработчик и возврат - шаг за шагом.
// отвлекись на секунду
Прерывание - это не только сигнал, но и обещание вернуться. Слева стопка сохранённых состояний: смотрите, как она растёт, когда прерывание приходит поверх прерывания, и почему возврат идёт строго в обратном порядке.
стек пуст
Вы нажали клавишу, пока процессор занят другой программой.
-
работа идёт В стеке 0
Процессор выполняет программу: считает, читает память, ничего не подозревает.
-
сигнал В стеке 0
Контроллер клавиатуры зафиксировал нажатие и поднял запрос на прерывание. Контроллер прерываний передаёт сигнал процессору.
-
работа идёт В стеке 0
Процессор дописывает текущую инструкцию: прервать его посередине инструкции нельзя.
-
в стек В стеке 1
В стек уходит состояние: содержимое регистров и адрес следующей инструкции, чтобы вернуться ровно туда, где остановились.
-
обработчик В стеке 1
По номеру прерывания процессор находит в таблице векторов адрес обработчика: тот читает код клавиши, кладёт его в буфер и сообщает программе, которая ждёт ввода.
-
из стека В стеке 0
Состояние восстанавливается из стека, и работа продолжается с того же места.
Всё заняло микросекунды, и прерванная программа ничего не заметила. В этом и смысл сохранения состояния: прерывание обязано вернуть процессор ровно в ту точку, где его забрали.
Пока работает один обработчик, приходит сигнал от другого устройства.
-
работа идёт В стеке 0
Процессор выполняет программу.
-
сигнал В стеке 0
Диск закончил запись и поднял своё прерывание.
-
в стек В стеке 1
Состояние программы уходит в стек.
-
обработчик В стеке 1
Работает обработчик диска.
-
сигнал В стеке 1
Приходит прерывание от системного таймера - то самое, которое отсчитывает кванты времени.
-
в стек В стеке 2
Теперь в стек уходит состояние самого обработчика: в стопке два кадра.
-
обработчик В стеке 2
Отрабатывает обработчик таймера, управление получает планировщик задач.
-
из стека В стеке 1
Возврат в обработчик диска: он продолжает с того места, где его прервали.
-
из стека В стеке 0
И только теперь возврат в прерванную программу.
Стопка растёт и убывает строго по порядку: кто сохранился последним, тот вернётся первым. Именно поэтому вложенные прерывания не путают состояния между собой.
Ядро занято тем, что нельзя прерывать посередине.
-
работа идёт В стеке 0
Ядро меняет таблицу страниц виртуальной памяти: переключиться посередине нельзя, иначе получится несогласованное состояние.
-
работа идёт В стеке 0
Специальной инструкцией процессор временно запрещает обработку прерываний.
-
сигнал ждёт В стеке 0
Приходит прерывание от мыши и ждёт: пока прерывания отключены, реакции не будет.
-
сигнал ждёт В стеке 0
Приходит прерывание от сетевой карты и тоже ждёт.
-
работа идёт В стеке 0
Ядро дописало своё дело и снова включает прерывания.
-
в стек В стеке 1
Накопившийся запрос наконец доходит до процессора, состояние уходит в стек.
-
обработчик В стеке 1
Обработчик отрабатывает и уступает место следующему.
-
из стека В стеке 0
Возврат к прерванной работе.
Пока прерывания отключены, мышь не реагирует, сеть не принимает пакеты, таймер не тикает. Поэтому ядро глушит их на доли микросекунды и сразу включает обратно.
Модель условная: шаги укрупнены, в жизни обработчик стараются сделать как можно короче и часть работы откладывают на потом, а очерёдностью сигналов от разных устройств управляет контроллер прерываний. Время в статье приведено как типичное: системный таймер обычно тикает раз в 1-10 миллисекунд.
Интерактив разработан ANY.BY - ремонт компьютеров и ноутбуков в Барановичах. © 2008-2026. Источник: any.by/demo/stek-preryvaniya