Прерывание в вычислительной технике¶
Прерывание (англ. interrupt) — механизм в вычислительной технике, позволяющий процессору приостановить выполнение текущей последовательности команд для обработки события, требующего немедленного внимания, с последующим возвратом к прерванной задаче. Прерывания обеспечивают асинхронную реакцию аппаратного и программного обеспечения на внешние и внутренние сигналы, что лежит в основе многозадачности, работы с периферийными устройствами и обработки исключительных ситуаций.
¶История
Идея прерываний возникла в первых универсальных компьютерах 1950-х годов. В машинах с пакетной обработкой данных необходимость опрашивать состояние устройств ввода-вывода вручную приводила к простою процессора. Одним из первых компьютеров с аппаратной поддержкой прерываний стал UNIVAC 1103A (1956), где использовался механизм «передачи управления по событию». В 1961 году в компьютере PDP-1 появилась концепция векторов прерываний — адресов, по которым процессор переходит при обработке конкретного сигнала. Развитие мини- и микрокомпьютеров в 1970-х годах, в частности архитектуры Intel 8080 и Motorola 6800, закрепило стандартные схемы: линии запроса, маскирование и приоритеты. Современные архитектуры (x86, ARM, RISC-V) реализуют сложные контроллеры прерываний, поддерживающие сотни источников и программную настройку.
¶Классификация
Прерывания делят по источнику возникновения, способу маскирования и механизму передачи управления.
¶По источнику
- Аппаратные (внешние) — генерируются физическими устройствами (таймеры, контроллеры дисков, сетевые карты, клавиатура) через линии запроса. Пример: сигнал от сетевой карты о прибытии пакета данных.
- Внутренние (исключения, traps) — возникают в самом процессоре при выполнении команд: деление на ноль, обращение к недопустимой памяти, неверный код операции. В архитектуре x86 такие события называются исключениями (fault, trap, abort).
- Программные — инициируются специальной командой (например,
INTв x86,syscallв MIPS). Используются для вызова системных функций операционной системы (системных вызовов) и отладки.
¶По возможности маскирования
- Маскируемые — могут быть временно запрещены (замаскированы) установкой флага в регистре процессора или через контроллер прерываний.
- Немаскируемые (NMI, Non-Maskable Interrupt) — не могут быть запрещены программно; применяются для критических событий: сбой питания, ошибки памяти, аппаратные отказы.
¶По вектору
- Векторные — каждое прерывание имеет свой номер, по которому процессор находит адрес обработчика в таблице векторов (IDT в x86).
- Невекторные — используют единую точку входа, обработчик самостоятельно определяет источник, опрашивая регистры устройств (применялось в ранних системах, например, в шине ISA).
¶Механизм работы
При возникновении прерывания процессор завершает выполнение текущей команды и выполняет последовательность действий, называемую «циклом прерывания»:
- Сохранение контекста — в стек или специальные регистры записываются адрес возврата (содержимое счётчика команд) и, при необходимости, слово состояния программы (флаги).
- Определение источника — по номеру вектора или опросу устройств устанавливается причина.
- Запрет дальнейших прерываний (аппаратно или программно) для защиты критической секции обработчика.
- Переход к обработчику — загрузка в счётчик команд адреса из таблицы векторов или фиксированного адреса.
- Выполнение обработчика — подпрограмма, которая обслуживает устройство: читает данные, сбрасывает флаг запроса, обновляет состояние системы.
- Восстановление контекста — возврат из прерывания командой
IRET(x86) илиRTI(ARM), восстановление флагов и адреса возврата. - Возобновление прерванной программы с точки останова.
Время от возникновения сигнала до начала выполнения обработчика называется латентностью прерывания. Она зависит от длительности текущей команды, состояния конвейера и скорости сохранения контекста. Для систем реального времени латентность критична и минимизируется аппаратными средствами.
¶Приоритеты и вложенность
Прерывания имеют приоритеты: при одновременных запросах процессор обслуживает более важное событие первым. В типичной схеме (от высшего к низшему): внутренние ошибки, немаскируемые сигналы, таймер, внешние устройства, программные вызовы. Приоритеты реализуются аппаратно (контроллером, например, Intel 8259A, Advanced Programmable Interrupt Controller — APIC) или программно через маскирование.
Вложенные прерывания допускают обработку нового прерывания внутри текущего обработчика, если оно имеет более высокий приоритет. Для этого обработчик должен явно разрешить прерывания (снять маску) после сохранения контекста. Без вложенности система обрабатывает запросы строго последовательно, что упрощает синхронизацию, но увеличивает время реакции на срочные события.
¶Контроллеры прерываний
Для управления множеством источников применяются специализированные контроллеры. В IBM PC-совместимых компьютерах исторически использовались два каскадно-соединённых контроллера Intel 8259A, обеспечивающих до 15 линий запросов (IRQ0–IRQ15). С 2000-х годов в x86-системах применяется APIC (Advanced Programmable Interrupt Controller), поддерживающий до 224 векторов, межпроцессорные прерывания (IPI) и привязку к конкретным ядрам в многоядерных процессорах. В архитектуре ARM распространён Generic Interrupt Controller (GIC), работающий с процессорами семейства Cortex-A. Контроллер выполняет арбитраж приоритетов, маскирование отдельных линий и формирование номера вектора.
¶Программные прерывания и системные вызовы
Программные прерывания — основной механизм перехода из пользовательского режима в режим ядра операционной системы. Приложение выполняет команду INT 0x80 (в Linux на x86) или syscall, передавая номер функции в регистре. Процессор переключается в привилегированный режим, сохраняет контекст и вызывает соответствующий обработчик ядра. Такой подход изолирует пользовательский код от аппаратуры и обеспечивает контролируемый доступ к ресурсам. В современных ОС (Windows, Linux) для системных вызовов чаще используют специальную команду syscall/sysenter, которая быстрее классического INT, но принцип остаётся тем же.
¶Применение
- Обработка ввода-вывода — прерывания освобождают процессор от постоянного опроса (polling) устройств. Например, контроллер диска сообщает о завершении чтения данных, клавиатура — о нажатии клавиши.
- Таймерные прерывания — периодический сигнал от аппаратного таймера (обычно 100–1000 Гц) используется для планировщика задач, отсчёта времени и переключения контекста в многозадачных ОС.
- Обработка ошибок — исключения (деление на ноль, страничные нарушения) позволяют ОС корректно завершить аварийную программу или реализовать виртуальную память (подкачку страниц).
- Системы реального времени — в микроконтроллерах (AVR, STM32) прерывания обеспечивают детерминированную реакцию на датчики и управляющие сигналы с точностью до микросекунд.
- Отладка — аппаратные точки останова реализуются через исключения отладки (debug exceptions), генерируемые при совпадении адреса.
¶Критика и ограничения
Основные недостатки прерываний — латентность и сложность синхронизации. В высоконагруженных системах с тысячами событий в секунду обработчики могут создавать «шторм прерываний» (interrupt storm), перегружая процессор. Для борьбы применяются: объединение прерываний (coalescing) в сетевых картах, отложенная обработка (нижние половины, tasklets в Linux), привязка прерываний к отдельным ядрам (IRQ affinity). Альтернативой прерываниям служит механизм DMA (прямой доступ к памяти) и polling в высокопроизводительных приложениях, где управление потоком данных предсказуемо. Тем не менее прерывания остаются фундаментальным механизмом всех процессорных архитектур, без которого невозможна работа операционных систем общего назначения.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →

