КАК УСТРОЕНО ВСЁ - приложение A

Прерывания: как устройства зовут процессор

Механизм, без которого не работает ни клавиатура, ни мышь, ни сеть - и который объясняет, почему процессор не тратит время впустую

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

🤔 Проблема: как устройство сообщает процессору о событии?

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

Первый способ называется опрос (polling). Процессор раз за разом спрашивает каждое устройство: «У тебя что-нибудь есть? А у тебя? А у тебя?» Это работает, но расточительно: большую часть времени ответ «нет», а процессор занят бессмысленным обходом. Если устройств много - клавиатура, мышь, сетевая карта, диск, USB, звуковая карта - опрос каждого из них становится заметной нагрузкой.

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

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

⚡ Как работает прерывание - шаг за шагом

Вы нажали клавишу на клавиатуре. Разберём, что за этим следует.

Контроллер клавиатуры фиксирует нажатие и формирует электрический сигнал - запрос на прерывание (IRQ, Interrupt Request). Этот сигнал поступает на специальный чип - контроллер прерываний, который управляет очерёдностью сигналов от разных устройств и передаёт их процессору.

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

Обработчик прерывания - это небольшая функция в ядре ОС, написанная для этого типа устройств. Для клавиатуры она читает из контроллера, какая именно клавиша была нажата, кладёт этот код в буфер, и сообщает той программе, которая сейчас ждёт ввода. Всё это занимает микросекунды.

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

📌 Таблица векторов прерываний: Это массив адресов, хранящийся в памяти. Каждому номеру прерывания соответствует адрес обработчика. Номер 1 - прерывание от таймера, номер 12 - от мыши, номер 14 - от диска, и так далее. ОС заполняет эту таблицу при загрузке, прописывая адреса своих обработчиков. Именно поэтому, когда ОС загружается, она «берёт под контроль» железо - в буквальном смысле переписывает таблицу под себя.

🗂️ Виды прерываний

Не все прерывания приходят от внешних устройств. Их принято делить на три большие группы.

Аппаратные прерывания - те самые, от периферии. Клавиатура нажата, пакет пришёл по сети, диск закончил запись, USB-устройство подключено. Любое физическое событие, о котором нужно сообщить процессору немедленно. Программные прерывания, или системные вызовы - их генерирует сама программа. Когда браузер хочет открыть файл или отправить данные по сети, он не обращается к железу напрямую: он выполняет специальную инструкцию, которая передаёт управление ядру ОС. С точки зрения железа это тоже прерывание - только вызванное намеренно, а не внешним сигналом. Исключения - прерывания, которые процессор генерирует сам, когда что-то пошло не так. Деление на ноль, обращение к несуществующему адресу памяти, выполнение запрещённой инструкции - всё это исключения. ОС перехватывает их и решает, что делать: чаще всего завершает программу с сообщением об ошибке.
Вид прерывания Кто генерирует Примеры
Аппаратное Внешнее устройство Нажатие клавиши, приход пакета, готовность диска
Программное (системный вызов) Сама программа Открыть файл, выделить память, отправить данные в сеть
Исключение Сам процессор Деление на ноль, выход за границы памяти, недопустимая инструкция

⏱️ Прерывание от таймера - сердце многозадачности

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

Именно так реализован квант времени, о котором мы говорили в статье про многозадачность. Программа не может «захватить» процессор навсегда - таймер в любом случае прервёт её через несколько миллисекунд и передаст управление ОС. Планировщик решает, какому процессу выделить процессорное время, и работа продолжается. Программа при этом даже не знает, что её прерывали.

💡 Что значит «отключить прерывания»: Процессор умеет временно запрещать обработку прерываний - специальной инструкцией. Это делается в критических местах ядра, когда нельзя допустить переключения посередине операции. Например, когда ОС меняет таблицу страниц виртуальной памяти: если прерывание придёт в этот момент и планировщик попытается переключить контекст - получится несогласованное состояние. Поэтому ядро на доли микросекунды «глушит» прерывания, делает своё дело и снова их включает. Злоупотреблять этим нельзя: пока прерывания отключены, мышь не реагирует, сеть не принимает пакеты, таймер не тикает.

🔗 Прерывания и всё остальное

Теперь, зная о прерываниях, многое встаёт на свои места. Когда вы двигаете мышью - прерывание. Когда приходит сообщение в мессенджере - прерывание от сетевой карты разбудило процесс. Когда компьютер «засыпает» при бездействии и мгновенно «просыпается» от нажатия клавиши - это прерывание подняло его из состояния пониженного потребления. Когда программа зависает и перестаёт реагировать, но остальные продолжают работать - прерывание от таймера всё равно приходит, планировщик переключается, другие процессы получают своё время.

Прерывание - это не экзотика и не деталь реализации. Это базовый язык, на котором железо разговаривает с операционной системой. Каждое нажатие, каждый байт из сети, каждый тик часов - всё начинается с сигнала, который говорит процессору: «Отвлекись на секунду. Есть кое-что важное».


ANY.BY

Нужна помощь с техникой? Привозите - диагностика при заказе ремонта бесплатна. Контакты и запись.

Посмотреть, как прерванная работа уходит в стек и возвращается Интерактив: три прохода - одно прерывание, вложенное и случай, когда прерывания отключены, а сигналы ждут. Открыть демо →