Перейти к содержимому
Приложение A. Прерывания: как устройства зовут процессор

Стек прерывания: куда девается прерванная работа

Сигнал, сохранение состояния, обработчик и возврат - шаг за шагом.

// отвлекись на секунду

Прерывание - это не только сигнал, но и обещание вернуться. Слева стопка сохранённых состояний: смотрите, как она растёт, когда прерывание приходит поверх прерывания, и почему возврат идёт строго в обратном порядке.

В стеке

стек пуст

Вы нажали клавишу, пока процессор занят другой программой.

  1. работа идёт В стеке 0

    Процессор выполняет программу: считает, читает память, ничего не подозревает.

  2. сигнал В стеке 0

    Контроллер клавиатуры зафиксировал нажатие и поднял запрос на прерывание. Контроллер прерываний передаёт сигнал процессору.

  3. работа идёт В стеке 0

    Процессор дописывает текущую инструкцию: прервать его посередине инструкции нельзя.

  4. в стек В стеке 1

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

  5. обработчик В стеке 1

    По номеру прерывания процессор находит в таблице векторов адрес обработчика: тот читает код клавиши, кладёт его в буфер и сообщает программе, которая ждёт ввода.

  6. из стека В стеке 0

    Состояние восстанавливается из стека, и работа продолжается с того же места.

Всё заняло микросекунды, и прерванная программа ничего не заметила. В этом и смысл сохранения состояния: прерывание обязано вернуть процессор ровно в ту точку, где его забрали.

Пока работает один обработчик, приходит сигнал от другого устройства.

  1. работа идёт В стеке 0

    Процессор выполняет программу.

  2. сигнал В стеке 0

    Диск закончил запись и поднял своё прерывание.

  3. в стек В стеке 1

    Состояние программы уходит в стек.

  4. обработчик В стеке 1

    Работает обработчик диска.

  5. сигнал В стеке 1

    Приходит прерывание от системного таймера - то самое, которое отсчитывает кванты времени.

  6. в стек В стеке 2

    Теперь в стек уходит состояние самого обработчика: в стопке два кадра.

  7. обработчик В стеке 2

    Отрабатывает обработчик таймера, управление получает планировщик задач.

  8. из стека В стеке 1

    Возврат в обработчик диска: он продолжает с того места, где его прервали.

  9. из стека В стеке 0

    И только теперь возврат в прерванную программу.

Стопка растёт и убывает строго по порядку: кто сохранился последним, тот вернётся первым. Именно поэтому вложенные прерывания не путают состояния между собой.

Ядро занято тем, что нельзя прерывать посередине.

  1. работа идёт В стеке 0

    Ядро меняет таблицу страниц виртуальной памяти: переключиться посередине нельзя, иначе получится несогласованное состояние.

  2. работа идёт В стеке 0

    Специальной инструкцией процессор временно запрещает обработку прерываний.

  3. сигнал ждёт В стеке 0

    Приходит прерывание от мыши и ждёт: пока прерывания отключены, реакции не будет.

  4. сигнал ждёт В стеке 0

    Приходит прерывание от сетевой карты и тоже ждёт.

  5. работа идёт В стеке 0

    Ядро дописало своё дело и снова включает прерывания.

  6. в стек В стеке 1

    Накопившийся запрос наконец доходит до процессора, состояние уходит в стек.

  7. обработчик В стеке 1

    Обработчик отрабатывает и уступает место следующему.

  8. из стека В стеке 0

    Возврат к прерванной работе.

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

Модель условная: шаги укрупнены, в жизни обработчик стараются сделать как можно короче и часть работы откладывают на потом, а очерёдностью сигналов от разных устройств управляет контроллер прерываний. Время в статье приведено как типичное: системный таймер обычно тикает раз в 1-10 миллисекунд.

Интерактив разработан - ремонт компьютеров и ноутбуков в Барановичах. © 2008-2026. Источник: any.by/demo/stek-preryvaniya