Введение
В операционных системах буря прерываний - это событие, во время которого процессор получает чрезмерное количество прерываний, которые потребляют большую часть времени процессора. Буря прерывания обычно вызвана аппаратными устройствами, которые не поддерживают ограничение скорости прерывания.
Предыстория
Поскольку обработка прерываний обычно является задачей, которую нельзя предотвратить в операционных системах совместного использования времени, шторм прерываний вызовет медленный ответ на ввод пользователя или даже полностью заморозит систему. Это состояние обычно называют "живой замком". В таком состоянии система тратит большую часть своих ресурсов на обработку перерывов, вместо того, чтобы выполнять другую работу. Для конечного пользователя, он не обрабатывает ничего, так как часто нет выхода. Иногда прерывающий шторм принимают за бьющийся, так как оба имеют схожие симптомы (неотзывчивый или медленный ответ на вход пользователя, мало или вообще никакого выхода). Общие причины включают: неправильную конфигурацию или неисправность оборудования, неисправные драйверы устройств, недостатки в операционной системе или метастабильность в одном или нескольких компонентах. Последнее состояние редко встречается за пределами прототипа или любительского оборудования. Большинство современных аппаратных средств и операционных систем имеют методы смягчения эффекта шторма прерывания. Например, большинство контроллеров Ethernet реализуют "ограничение скорости" прерываний, что заставляет контроллер ждать программируемое количество времени между каждым генерируемым им прерыванием. Когда подобная функциональность отсутствует в устройстве, она обычно записывается в драйвер устройства и/или в саму операционную систему. Наиболее распространенной причиной является то, что устройство "за" другим сигнализирует об прерывании APIC (Advanced Programmable Interrupt Controller). Большинство компьютерных периферийных устройств генерируют прерывания через APIC, поскольку количество прерываний всегда меньше (обычно 15 для современного ПК), чем количество устройств. Операционная система должна затем запросить каждый драйвер, зарегистрированный для этого прерывания, чтобы узнать, возникло ли прерывание из его аппаратного обеспечения. Неисправные драйверы всегда могут заявлять "да", в результате чего ОС не запрашивает другие драйверы, зарегистрированные для этого прерывания (одновременно может быть обработан только один прерывание). Устройство, которое первоначально запросило прерывание, поэтому не получает его обслуживания, поэтому генерируется новое прерывание (или не очищается), и процессор становится заваленным непрерывными сигналами прерывания. Любая операционная система может выжить в условиях шторма, вызванного такой ошибкой. Дебьюгер ядра обычно может прервать шторм, разгрузив неисправный драйвер, позволяя драйверу "под" неисправным очистить прерывание, если ввод пользователя все еще возможен. Это произошло в более старой версии FreeBSD, где PCI-карты, которые были настроены на работу в режиме совместимости ISA, не могли должным образом взаимодействовать с маршрутизацией прерывания ISA. Это либо приведет к тому, что операционная система никогда не обнаружит прерываний, либо операционная система никогда не сможет их устранить, в результате чего возникнет шторм прерываний. Поскольку драйверы чаще всего реализуются третьей стороной, большинство операционных систем также имеют режим опроса, который запрашивает ожидающие прерывания через фиксированные интервалы или в круглом порядке. Этот режим может быть установлен глобально, на основе каждого драйвера, каждого прерывания или динамически, если ОС обнаруживает состояние неисправности или чрезмерное создание прерываний. Режим голосования может быть включен динамически, когда количество прерываний или использование ресурсов, вызванных прерыванием, превышает определенные пороговые значения. Когда эти пороговые значения больше не превышаются, ОС может изменить прерывающий драйвер, прервать или прервать управление в целом, из режима прерывания в режим опроса. Ограничение скорости прерывания в аппаратном обеспечении обычно сводит на нет использование режима опроса, но все равно может произойти во время нормальной работы во время интенсивных вводов и выводов, если процессор не может достаточно быстро переключаться в контексте, чтобы идти в ногу.
История
Возможно, первая буря была во время спущения "Аполлона-11" на Луну в 1969 году.
Рассмотрение
Для достижения оптимальных результатов необходимо тщательно настроить ограничение скорости прерывания. Например, контроллер Ethernet с ограничением частоты прерываний будет буферировать пакеты, которые он получает из сети между каждым прерыванием. Если скорость установлена слишком низко, буфер контроллера переполняется, и пакеты будут выброшены. При определении скорости необходимо учитывать скорость заполнения буфера между прерываниями и время задержки между прерыванием и передачей буфера в систему.
Прерывание смягчения
Существуют аппаратные и программные подходы к решению проблемы. Например, FreeBSD обнаруживает штормы прерываний и в ответ на некоторое время маскирует проблемные прерывания. Система, используемая NAPI, является примером аппаратного подхода: система (драйвер) начинается в состоянии включенного прерывания, а затем Interrupt handler отключает прерывание и позволяет потоку / задаче обрабатывать событие (ы), а затем задачи опроса устройства, обрабатывая некоторое количество событий и включение прерывания. Другой интересный подход с использованием аппаратной поддержки - это тот, где устройство генерирует прерывание, когда состояние очереди событий меняется с "пустого" на "не пустое". Затем, если нет свободных DMA-дескрипторов в хвосте RX FIFO, устройство отключает событие. Затем событие добавляется к хвосту, и вход FIFO отмечается как занятый. Если в этой точке вход (хвост-1) свободен (чист), будет сгенерирован прерыв (уровневой прерыв) и указатель хвоста будет увеличен. Если аппаратное обеспечение требует признания прерывания, процессор (обработчик прерывания) сделает это, обрабатывает действительные дескрипторы DMA в начале и возвращается от прерывания.