Механизм прерываний в компьютере: от сигнала к действию

Иван Корнев·03.05.2026·6 мин

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

Без прерываний процессору пришлось бы бесконечно проверять статус каждого устройства («поллинг»), что тратило бы до 90% его мощности впустую. Прерывания делают систему отзывчивой и эффективной.

Оглавление

Что такое прерывание и зачем оно нужно

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

Прерывание работает как звонок в дверь или телефонный звонок. Вы продолжаете читать, но как только раздается сигнал, вы:

  1. Запоминаете место, где остановились (сохраняете контекст).
  2. Идете открывать дверь или брать трубку (выполняете обработчик прерывания).
  3. Возвращаетесь к чтению с того же места (восстанавливаете контекст).

В компьютере это позволяет периферии (клавиатуре, диску, сетевой карте) сообщать процессору о готовности данных только тогда, когда это действительно необходимо.

Участники процесса: кто и кого прерывает

В системе прерываний задействованы три ключевых компонента:

  1. Источник прерывания (Device): Аппаратное устройство (мышь, таймер, контроллер диска) или программа (системный вызов), которое генерирует сигнал.
  2. Контроллер прерываний (Interrupt Controller): Специальный чип (например, APIC в современных x86 системах), который собирает сигналы от множества устройств. Он определяет приоритеты: если одновременно нажали клавишу и пришел сетевой пакет, контроллер решит, какое событие важнее, и передаст его процессору.
  3. Процессор (CPU): Принимает сигнал, останавливает текущий поток инструкций и переключается на выполнение кода ядра операционной системы.

Аппаратные vs Программные прерывания

  • Аппаратные (Hardware Interrupts, IRQ): Генерируются физическими устройствами. Асинхронны (могут произойти в любой момент).
  • Программные (Software Interrupts/Exceptions): Генерируются самим процессором при ошибке (деление на ноль, обращение к недопустимой памяти) или по команде программы (системный вызов syscall). Синхронны (привязаны к конкретной инструкции).

Пошаговый алгоритм обработки

Когда происходит событие, система выполняет строгий набор действий. Этот процесс занимает микро- или наносекунды, но логически он выглядит так:

  1. Генерация сигнала: Устройство отправляет электрический импульс контроллеру прерываний.
  2. Завершение текущей инструкции: Процессор не прерывает выполнение посередине команды. Он дожидается окончания текущей машинной инструкции.
  3. Сохранение контекста: Процессор автоматически сохраняет в стек значение счетчика команд (адрес следующей инструкции) и регистров флагов. Это «закладка», чтобы потом вернуться.
  4. Поиск обработчика: Процессор обращается к таблице векторов прерываний (IDT — Interrupt Descriptor Table). Это массив адресов, где каждому типу прерывания (например, №1 для клавиатуры, №32 для таймера) сопоставлен адрес функции-обработчика.
  5. Выполнение ISR (Interrupt Service Routine): Процессор переходит по найденному адресу и выполняет код драйвера устройства.
  6. Восстановление контекста: После завершения обработчика процессор извлекает сохраненные данные из стека.
  7. Возврат: Выполнение основной программы продолжается с места остановки.

Top-half и Bottom-half: разделение нагрузки

Обработчики прерываний (ISR) должны выполняться максимально быстро. Пока выполняется ISR, другие прерывания того же или низшего приоритета часто блокируются. Если обрабатывать всё подряд в прерывании, система может «зависнуть» от потока событий (например, при скачивании большого файла по сети).

Поэтому в современных ОС (Linux, Windows) используется двухуровневая модель:

УровеньНазваниеЧто делаетТребования к скорости
ВерхнийTop-half (Hard IRQ)Минимальная работа: считывает байт из регистра устройства, очищает флаг прерывания, копирует данные в буфер памяти.Экстремально высокая. Критично для железа.
НижнийBottom-half (Softirq, Tasklet, DPC)Тяжелая работа: разбор протоколов, запись на диск, передача данных пользовательскому приложению. Выполняется позже, когда прерывания разрешены.Может занимать больше времени. Планируется ОС.

Ошибка новичка: Пытаться выполнить сложные вычисления или ввод-вывод прямо внутри обработчика прерывания (Top-half). Это приводит к потере данных от других устройств и увеличению задержек (latency) всей системы.

Реальные примеры из жизни ПК

1. Нажатие клавиши на клавиатуре

  1. Вы нажимаете «A».
  2. Контроллер клавиатуры посылает прерывание (обычно IRQ1).
  3. Процессор прерывает игру или текст.
  4. Top-half: Драйвер считывает скан-код из порта клавиатуры, кладет его в кольцевой буфер ядра.
  5. Процессор возвращается к игре.
  6. Bottom-half: Подсистема ввода ОС берет код из буфера, преобразует его в символ «A» с учетом раскладки и отправляет в активное окно.

2. Сетевой пакет

  1. По кабелю приходит пакет данных.
  2. Сетевая карта загружает его в свою память (DMA) и шлет прерывание.
  3. Top-half: Драйвер сообщает карте, что пакет принят, и выделяет новый пустой буфер для следующего пакета.
  4. Bottom-half: Сетевой стек (TCP/IP) разбирает заголовки, проверяет контрольные суммы и передает данные браузеру.

3. Системный таймер

  1. Таймер срабатывает каждые 1–10 мс (в зависимости от настроек ядра).
  2. Прерывание заставляет запуститься планировщик задач.
  3. ОС решает, не пора ли отдать процессор другой программе (переключение контекста). Без этого одна зависшая программа могла бы захватить процессор навсегда.

Частые проблемы и ошибки

Даже в современных системах механизмы прерываний могут становиться узким местом.

  • Interrupt Storm (Шторм прерываний): Ситуация, когда устройство генерирует прерывания чаще, чем процессор успевает их обрабатывать. Система полностью останавливается, реагируя только на курсор мыши (если он на другом ядре) или не реагирует вовсе.
    • Решение: Использование режима MSI (Message Signaled Interrupts), где сообщения пишутся прямо в память, и настройка балансировки прерываний между ядрами (IRQ Affinity).
  • Latency (Задержка): Время между событием и началом его обработки. Высокая задержка критична для аудиоинтерфейсов и онлайн-игр.
    • Решение: Изоляция ядер (изолирование одного ядра только под обработку прерываний), использование realtime-ядер (PREEMPT_RT).
  • Spurious Interrupts (Ложные прерывания): Сигнал пришел, но устройство ничего не отправило (из-за помех или багов драйвера).
    • Решение: Хороший драйвер всегда проверяет статус устройства внутри ISR. Если событие не подтвердилось, обработчик сразу выходит.

FAQ

Влияет ли количество прерываний на скорость компьютера? Да, но косвенно. Каждое прерывание требует накладных расходов на сохранение/восстановление регистров и переключение контекста. При огромном потоке мелких прерываний (например, от дешевого сетевого адаптера с миллионами пакетов в секунду) процессор может тратить больше времени на обслуживание прерываний, чем на полезную работу.

Можно ли отключить прерывания? Полностью — нет, система зависнет. Но можно временно запрещать прерывания на одном ядре (cli/sti в ассемблере) для защиты критических участков кода. В пользовательских программах прямое управление прерываниями обычно недоступно из соображений безопасности.

Что такое MSI и MSI-X? Это современные способы доставки прерываний. Вместо использования отдельных физических проводов (IRQ lines), устройство записывает специальное сообщение прямо в оперативную память по шине PCIe. Это позволяет иметь тысячи уникальных векторов прерываний и лучше распределять нагрузку по многоядерным процессорам.

Почему мышь иногда «лагает» при копировании файлов? При интенсивном дисковом вводе-выводе или сетевой нагрузке возникают частые прерывания. Если они обрабатываются тем же ядром, что и поток управления мышью, или если очередь прерываний переполнена, обработка движения мыши задерживается. Привязка разных устройств к разным ядрам (IRQ Affinity) часто решает эту проблему.