В цифровых компьютерах прерывание (иногда называемое ловушкой ) [1] — это запрос процессору на прерывание текущего выполняемого кода (когда это разрешено), чтобы событие могло быть обработано своевременно. Если запрос принят, процессор приостановит свою текущую деятельность, сохранит свое состояние и выполнит функцию, называемую обработчиком прерываний (или процедурой обслуживания прерываний , ISR), для обработки события. Это прерывание часто является временным, позволяя программному обеспечению возобновить [a] нормальную деятельность после завершения работы обработчика прерываний, хотя прерывание может вместо этого указывать на фатальную ошибку. [2]
Прерывания обычно используются аппаратными устройствами для указания изменений электронного или физического состояния, требующих внимания, чувствительного ко времени. Прерывания также обычно используются для реализации многозадачности компьютера и системных вызовов , особенно в вычислениях в реальном времени . Системы, которые используют прерывания таким образом, называются системами, управляемыми прерываниями. [3]
Аппаратные прерывания были введены в качестве оптимизации, устраняющей непродуктивное время ожидания в циклах опроса , ожидающих внешних событий. Первой системой, использовавшей этот подход, была DYSEAC , завершенная в 1954 году, хотя более ранние системы предоставляли функции ловушки ошибок. [4]
Компьютер UNIVAC 1103A обычно считается самым ранним применением прерываний в 1953 году. [5] [6] Ранее, на UNIVAC I (1951) «Арифметическое переполнение либо запускало выполнение двухинструкционной процедуры исправления по адресу 0, либо, по выбору программиста, приводило к остановке компьютера». IBM 650 (1954) включил первое появление маскирования прерываний. Национальное бюро стандартов DYSEAC (1954) было первым, кто использовал прерывания для ввода-вывода. IBM 704 был первым, кто использовал прерывания для отладки , с «ловушкой передачи», которая могла вызывать специальную процедуру при обнаружении инструкции перехода. Система TX-2 MIT Lincoln Laboratory (1957) была первой, кто предоставил несколько уровней приоритетных прерываний. [6]
Сигналы прерывания могут выдаваться в ответ на аппаратные или программные события. Они классифицируются как аппаратные прерывания или программные прерывания соответственно. Для любого конкретного процессора количество типов прерываний ограничено архитектурой.
Аппаратное прерывание — это состояние, связанное с состоянием оборудования, которое может быть передано внешним аппаратным устройством, например, линией запроса прерывания (IRQ) на ПК, или обнаружено устройствами, встроенными в логику процессора (например, таймером ЦП в IBM System/370), чтобы сообщить, что устройство требует внимания со стороны операционной системы (ОС) [7] или, если ОС отсутствует, от программы bare metal , работающей на ЦП. Такие внешние устройства могут быть частью компьютера (например, контроллер диска ) или они могут быть внешними периферийными устройствами . Например, нажатие клавиши клавиатуры или перемещение мыши, подключенной к порту PS/2, запускает аппаратные прерывания, которые заставляют процессор считывать нажатие клавиши или положение мыши.
Аппаратные прерывания могут поступать асинхронно относительно часов процессора и в любое время во время выполнения инструкции. Следовательно, все входящие сигналы аппаратных прерываний обуславливаются их синхронизацией с часами процессора и обрабатываются только на границах выполнения инструкции.
Во многих системах каждое устройство связано с определенным сигналом IRQ. Это позволяет быстро определить, какое аппаратное устройство запрашивает обслуживание, и ускорить обслуживание этого устройства.
В некоторых старых системах, таких как CDC 3600 1964 года , [8] все прерывания направлялись в одно и то же место, и ОС использовала специализированную инструкцию для определения наиболее приоритетного невыполненного немаскированного прерывания. В современных системах обычно существует отдельная процедура прерывания для каждого типа прерывания (или для каждого источника прерывания), часто реализованная как одна или несколько таблиц векторов прерываний .
Маскировка прерывания означает его отключение, поэтому оно откладывается [b] или игнорируется [ c ] процессором, в то время как демаскировка прерывания означает его включение. [9]
Процессоры обычно имеют внутренний регистр маски прерываний , [d] , который позволяет выборочно включать [2] (и отключать) аппаратные прерывания. Каждый сигнал прерывания связан с битом в регистре маски. В некоторых системах прерывание включается, когда бит установлен, и отключается, когда бит очищен. В других системах верно обратное, и установленный бит отключает прерывание. Когда прерывание отключено, связанный сигнал прерывания может игнорироваться процессором или может оставаться в режиме ожидания. Сигналы, на которые влияет маска, называются маскируемыми прерываниями .
Некоторые сигналы прерывания не подвержены влиянию маски прерывания и, следовательно, не могут быть отключены; они называются немаскируемыми прерываниями (NMI). Они указывают на высокоприоритетные события, которые нельзя игнорировать ни при каких обстоятельствах, например, сигнал тайм-аута от сторожевого таймера . Что касается SPARC , немаскируемое прерывание (NMI), несмотря на то, что оно имеет наивысший приоритет среди прерываний, может быть предотвращено с помощью маски прерывания. [10]
Один из режимов отказа — когда оборудование не генерирует ожидаемое прерывание для изменения состояния, заставляя операционную систему ждать неопределенно долго. В зависимости от деталей, отказ может повлиять только на один процесс или иметь глобальное воздействие. В некоторых операционных системах есть код, специально предназначенный для решения этой проблемы.
Например, IBM Operating System/360 (OS/360) полагается на прерывание «не готово к готовности» конца устройства, когда лента смонтирована на ленточном накопителе, и не будет считывать метку ленты, пока это прерывание не произойдет или не будет смоделировано. IBM добавила код в OS/360, чтобы команда VARY ONLINE смоделировала прерывание конца устройства на целевом устройстве.
Ложное прерывание — это аппаратное прерывание, для которого не может быть найден источник. Термин «фантомное прерывание» или «призрачное прерывание» также может использоваться для описания этого явления. Ложные прерывания, как правило, являются проблемой для схемы прерывания проводного ИЛИ , подключенной к чувствительному к уровню входу процессора. Такие прерывания может быть трудно идентифицировать, когда система ведет себя неправильно.
В схеме проводного ИЛИ паразитная емкость , заряжающаяся/разряжающаяся через резистор смещения линии прерывания, вызовет небольшую задержку, прежде чем процессор распознает, что источник прерывания был очищен. Если прерывающее устройство очищается слишком поздно в процедуре обслуживания прерывания (ISR), у схемы прерывания не будет достаточно времени, чтобы вернуться в состояние покоя до того, как текущий экземпляр ISR завершится. В результате процессор будет думать, что ожидается другое прерывание, поскольку напряжение на его входе запроса прерывания не будет достаточно высоким или низким, чтобы установить однозначную внутреннюю логическую 1 или логическую 0. Очевидное прерывание не будет иметь идентифицируемого источника, отсюда и прозвище «ложное».
Ложное прерывание может также быть результатом электрических аномалий из-за неправильной конструкции схемы, высокого уровня шума , перекрестных помех , проблем синхронизации или, что реже, ошибок устройства . [11]
Ложное прерывание может привести к системной блокировке или другой неопределенной операции, если ISR не учитывает возможность возникновения такого прерывания. Поскольку ложные прерывания в основном являются проблемой схем прерываний с проводным ИЛИ, хорошей практикой программирования в таких системах является проверка ISR всех источников прерываний на активность и не предпринимать никаких действий (кроме возможной регистрации события), если ни один из источников не прерывает. Они могут даже привести к сбою компьютера в неблагоприятных сценариях.
Программное прерывание запрашивается самим процессором при выполнении определенных инструкций или при выполнении определенных условий. Каждый сигнал программного прерывания связан с определенным обработчиком прерываний.
Программное прерывание может быть намеренно вызвано выполнением специальной инструкции , которая по замыслу вызывает прерывание при выполнении. [e] Такие инструкции функционируют аналогично вызовам подпрограмм и используются для различных целей, таких как запрос служб операционной системы и взаимодействие с драйверами устройств (например, для чтения или записи носителей информации). Программные прерывания также могут быть вызваны ошибками выполнения программы или системой виртуальной памяти .
Обычно ядро операционной системы перехватывает и обрабатывает такие прерывания. Некоторые прерывания обрабатываются прозрачно для программы — например, обычное разрешение ошибки страницы заключается в том, чтобы сделать требуемую страницу доступной в физической памяти. Но в других случаях, таких как ошибка сегментации, операционная система выполняет обратный вызов процесса. В операционных системах типа Unix это включает отправку сигнала, такого как SIGSEGV , SIGBUS , SIGILL или SIGFPE , который может либо вызвать обработчик сигнала, либо выполнить действие по умолчанию (завершение программы). В Windows обратный вызов выполняется с использованием структурированной обработки исключений с кодом исключения, таким как STATUS_ACCESS_VIOLATION или STATUS_INTEGER_DIVIDE_BY_ZERO. [12]
В процессе ядра часто бывает так, что некоторые типы программных прерываний не должны происходить. Если они все же происходят, это может привести к сбою операционной системы .
Термины прерывание , ловушка , исключение , неисправность и отмена используются для различения типов прерываний, хотя «нет четкого консенсуса относительно точного значения этих терминов». [13] Термин ловушка может относиться к любому прерыванию, к любому программному прерыванию, к любому синхронному программному прерыванию или только к прерываниям, вызванным инструкциями, в названии которых есть слово «ловушка ». В некоторых случаях термин ловушка относится конкретно к точке останова, предназначенной для инициирования переключения контекста на программу-монитор или отладчик . [1] Он также может относиться к синхронному прерыванию, вызванному исключительным условием (например, деление на ноль , недопустимый доступ к памяти , недопустимый код операции ), [13] хотя термин исключение более распространен для этого.
x86 делит прерывания на (аппаратные) прерывания и программные исключения и выделяет три типа исключений: сбои, ловушки и аварийные остановки. [14] [15] (Аппаратные) прерывания — это прерывания, запускаемые асинхронно устройством ввода-вывода и позволяющие перезапускать программу без потери непрерывности. [14] Сбой также может быть перезапущен, но он привязан к синхронному выполнению инструкции — адрес возврата указывает на инструкцию, вызвавшую сбой. Ловушка похожа на ошибку, за исключением того, что адрес возврата указывает на инструкцию, которая должна быть выполнена после инструкции, вызвавшей сбой; [16] одно из ее важных применений — реализация системных вызовов . [15] Аварийная остановка используется для серьезных ошибок, таких как аппаратные ошибки и недопустимые значения в системных таблицах, и часто [f] не позволяет перезапустить программу. [16]
Arm использует термин исключение для обозначения всех типов прерываний [17] и делит исключения на (аппаратные) прерывания , прерывания , сбросы и инструкции по генерации исключений. Прерывания соответствуют исключениям x86 и могут быть прерываниями предварительной выборки (неудачные выборки инструкций) или прерываниями данных (неудачные доступы к данным) и могут быть синхронными или асинхронными. Асинхронные прерывания могут быть точными или неточными. Прерывания MMU (ошибки страниц) являются синхронными. [18]
RISC-V использует прерывание как общий термин, так и для внешнего подмножества; внутренние прерывания называются исключениями.
Каждый вход сигнала прерывания предназначен для срабатывания либо по уровню логического сигнала, либо по определенному фронту сигнала (переход уровня). Чувствительные к уровню входы непрерывно запрашивают обслуживание процессора, пока на вход подается определенный (высокий или низкий) логический уровень. Чувствительные к фронту входы реагируют на фронты сигнала: определенный (нарастающий или падающий) фронт вызовет защелкивание запроса на обслуживание; процессор сбрасывает защелку, когда выполняется обработчик прерываний.
Прерывание, вызванное уровнем, запрашивается путем удержания сигнала прерывания на его определенном (высоком или низком) активном логическом уровне . Устройство вызывает прерывание, вызванное уровнем, путем перевода сигнала на активный уровень и удержания его на этом уровне. Оно отменяет сигнал, когда процессор дает ему команду сделать это, как правило, после того, как устройство было обслужено.
Процессор производит выборку входного сигнала прерывания во время каждого цикла инструкции. Процессор распознает запрос прерывания, если сигнал подтверждается во время выборки.
Входы, запускаемые уровнем, позволяют нескольким устройствам совместно использовать общий сигнал прерывания через проводные ИЛИ-соединения. Процессор опрашивает, чтобы определить, какие устройства запрашивают обслуживание. После обслуживания устройства процессор может снова опрашивать и, при необходимости, обслуживать другие устройства перед выходом из ISR.
Прерывание по фронту — это прерывание, сигнализируемое изменением уровня на линии прерывания, либо нисходящим фронтом (с высокого на низкий), либо нарастающим фронтом (с низкого на высокий). Устройство, желающее подать сигнал прерывания, подает импульс на линию, а затем переводит линию в неактивное состояние. Если импульс слишком короткий для обнаружения опрашиваемым вводом-выводом , то для его обнаружения может потребоваться специальное оборудование. Важной частью срабатывания по фронту является то, что сигнал должен перейти, чтобы вызвать прерывание; например, если сигнал был высоким-низким-низким, будет срабатывать только одно прерывание по нисходящему фронту, а продолжающийся низкий уровень не вызовет дальнейшего прерывания. Сигнал должен вернуться к высокому уровню и снова упасть, чтобы вызвать дальнейшее прерывание. Это контрастирует с срабатыванием по уровню, где низкий уровень будет продолжать создавать прерывания (если они включены), пока сигнал не вернется к своему высокому уровню.
Компьютеры с прерываниями, запускаемыми по фронту, могут включать регистр прерываний , который сохраняет статус ожидающих прерываний. Системы с регистрами прерываний обычно также имеют регистры маски прерываний.
Процессор производит выборку сигналов прерывания триггера или регистра прерывания во время каждого цикла инструкции и обрабатывает найденное прерывание с наивысшим приоритетом. Независимо от метода запуска процессор начнет обработку прерывания на следующей границе инструкции после обнаруженного триггера, тем самым обеспечивая:
Существует несколько различных архитектур для обработки прерываний. В некоторых из них есть один обработчик прерываний [19] , который должен сканировать для разрешенного прерывания с наивысшим приоритетом. В других есть отдельные обработчики прерываний для отдельных типов прерываний, [20] отдельных каналов ввода-вывода или устройств, или и того, и другого. [21] [22] Несколько причин прерывания могут иметь один и тот же тип прерывания и, следовательно, один и тот же обработчик прерываний, требуя, чтобы обработчик прерываний определил причину. [20]
Прерывания могут полностью обрабатываться аппаратно центральным процессором или могут обрабатываться как центральным процессором, так и другим компонентом, например программируемым контроллером прерываний или южным мостом .
Если используется дополнительный компонент, этот компонент будет подключен между прерывающим устройством и выводом прерывания процессора для мультиплексирования нескольких источников прерывания на одну или две линии ЦП, которые обычно доступны. Если реализовано как часть контроллера памяти , прерывания отображаются в адресном пространстве памяти системы . [ необходима цитата ]
В реализациях систем на кристалле (SoC) прерывания поступают из разных блоков кристалла и обычно объединяются в контроллере прерываний, подключенном к одному или нескольким процессорам (в многоядерной системе). [23]
Несколько устройств могут совместно использовать линию прерывания, запускаемую по фронту, если они спроектированы так. Линия прерывания должна иметь резистор подтягивания вниз или вверх, чтобы при отсутствии активного управления она переходила в неактивное состояние, которое является ее состоянием по умолчанию. Устройства сигнализируют о прерывании, кратковременно переводя линию в состояние, отличное от состояния по умолчанию, и позволяют линии плавать (не активируют ее), когда не подают сигнал о прерывании. Этот тип соединения также называется открытым коллектором . Затем линия переносит все импульсы, генерируемые всеми устройствами. (Это аналогично шнуру на некоторых автобусах и троллейбусах, за который любой пассажир может потянуть, чтобы подать водителю сигнал об остановке.) Однако импульсы прерывания от разных устройств могут сливаться, если они происходят близко по времени. Чтобы избежать потери прерываний, ЦП должен срабатывать по заднему фронту импульса (например, по переднему фронту, если линия подтянута и переведена в низкий уровень). После обнаружения прерывания ЦП должен проверить все устройства на предмет требований к обслуживанию.
Прерывания, запускаемые фронтом, не страдают от проблем, которые возникают у прерываний, запускаемых уровнем, при совместном использовании. Обслуживание низкоприоритетного устройства может быть отложено произвольно, в то время как прерывания от высокоприоритетных устройств продолжают приниматься и обслуживаться. Если есть устройство, которое ЦП не знает, как обслуживать, что может вызывать ложные прерывания, это не помешает сигнализации прерываний других устройств. Однако прерывание, запускаемое фронтом, легко пропустить — например, когда прерывания маскируются на определенный период — и если нет какого-либо типа аппаратной защелки, которая записывает событие, восстановить его невозможно. Эта проблема вызывала множество «зависаний» в раннем компьютерном оборудовании, поскольку процессор не знал, что от него ожидают что-то сделать. Более современное оборудование часто имеет один или несколько регистров статуса прерывания, которые фиксируют запросы прерываний; хорошо написанный код обработки прерываний, управляемых фронтом, может проверять эти регистры, чтобы гарантировать, что ни одно событие не будет пропущено.
Шина Industry Standard Architecture (ISA) использует прерывания, запускаемые по фронту, не требуя, чтобы устройства могли совместно использовать линии IRQ, но все основные материнские платы ISA включают подтягивающие резисторы на своих линиях IRQ, поэтому хорошо работающие устройства ISA, совместно использующие линии IRQ, должны работать нормально. Параллельный порт также использует прерывания, запускаемые по фронту. Многие старые устройства предполагают, что они имеют исключительное использование линий IRQ, что делает их совместное использование электрически небезопасным.
Существует три способа, с помощью которых можно поднять несколько устройств, «разделяющих одну линию». Первый — это исключительная проводимость (переключение) или исключительное подключение (к контактам). Следующий — это шина (все подключены к одной и той же линии прослушивания): платы на шине должны знать, когда им следует говорить, а когда нет (т. е. шина ISA). Разговор может быть запущен двумя способами: защелкой накопления или логическими вентилями. Логические вентили ожидают непрерывного потока данных, который отслеживается на предмет ключевых сигналов. Накопители срабатывают только тогда, когда удаленная сторона возбуждает вентиль сверх порогового значения, поэтому согласованная скорость не требуется. Каждый из них имеет свои преимущества в скорости по сравнению с расстоянием. Триггер, как правило, представляет собой метод, при котором обнаруживается возбуждение: нарастающий фронт, спадающий фронт, порог ( осциллограф может запускать самые разные формы и условия).
Запуск программных прерываний должен быть встроен в программное обеспечение (как в ОС, так и в приложение). Приложение на языке 'C' имеет таблицу триггеров (таблицу функций) в заголовке, о которой знают и используют соответствующим образом и которая не связана с оборудованием. Однако не путайте это с аппаратными прерываниями, которые сигнализируют ЦП (ЦП запускает программное обеспечение из таблицы функций, аналогично программным прерываниям).
Несколько устройств, совместно использующих линию прерывания (любого стиля запуска), действуют как источники ложных прерываний по отношению друг к другу. При наличии большого количества устройств на одной линии нагрузка по обслуживанию прерываний растет пропорционально квадрату числа устройств. Поэтому предпочтительнее равномерно распределять устройства по доступным линиям прерываний. Нехватка линий прерываний является проблемой в старых конструкциях систем, где линии прерываний являются отдельными физическими проводниками. Прерывания, сигнализируемые сообщениями, где линия прерывания является виртуальной, предпочтительны в новых архитектурах систем (таких как PCI Express ) и в значительной степени решают эту проблему.
Некоторые устройства с плохо спроектированным программным интерфейсом не позволяют определить, запросили ли они обслуживание. Они могут зависнуть или вести себя неправильно, если обслуживаются, когда они этого не хотят. Такие устройства не терпят ложных прерываний, и поэтому не терпят совместного использования линии прерывания. Карты ISA , из-за часто дешевой конструкции и дизайна, печально известны этой проблемой. Такие устройства становятся все более редкими, поскольку аппаратная логика становится дешевле, а новые архитектуры систем требуют совместного использования прерываний.
Некоторые системы используют гибрид сигнализации, запускаемой уровнем и фронтом. Аппаратное обеспечение не только ищет фронт, но и проверяет, что сигнал прерывания остается активным в течение определенного периода времени.
Обычно гибридное прерывание используется для ввода NMI (немаскируемое прерывание). Поскольку NMI обычно сигнализируют о крупных — или даже катастрофических — системных событиях, хорошая реализация этого сигнала пытается гарантировать, что прерывание действительно, проверяя, что оно остается активным в течение определенного периода времени. Этот двухэтапный подход помогает исключить ложные прерывания, влияющие на систему.
Прерывание, сигнализируемое сообщением, не использует физическую линию прерывания. Вместо этого устройство сигнализирует о своем запросе на обслуживание, отправляя короткое сообщение по некоторой среде связи, обычно по компьютерной шине . Сообщение может быть типа, зарезервированного для прерываний, или может быть некоторого уже существующего типа, например, записи в память.
Прерывания, вызванные сообщением, ведут себя очень похоже на прерывания, вызванные фронтом, в том смысле, что прерывание является кратковременным сигналом, а не непрерывным состоянием. Программное обеспечение обработки прерываний обрабатывает их примерно одинаково. Обычно разрешается объединять несколько ожидающих прерываний, вызванных сообщением, с одним и тем же сообщением (одной и той же виртуальной линией прерывания), так же как могут объединяться близко расположенные прерывания, вызванные фронтом.
Векторы прерываний, передаваемые по сообщениям, могут быть общими, в той степени, в которой может быть общим базовый коммуникационный носитель. Никаких дополнительных усилий не требуется.
Поскольку идентификатор прерывания указывается шаблоном битов данных, не требующим отдельного физического проводника, можно эффективно обрабатывать гораздо больше отдельных прерываний. Это снижает необходимость в совместном использовании. Сообщения о прерывании также могут передаваться по последовательной шине, не требуя дополнительных линий.
PCI Express , последовательная компьютерная шина, использует исключительно прерывания, передаваемые сообщениями .
В аналогии с кнопкой, применяемой к компьютерным системам , термин дверной звонок или прерывание дверного звонка часто используется для описания механизма, посредством которого программная система может сигнализировать или уведомлять аппаратное устройство компьютера о том, что необходимо выполнить некоторую работу. Обычно программная система помещает данные в некоторые известные и взаимно согласованные ячейки памяти и «звонит в дверь», записывая данные в другую ячейку памяти. Эта другая ячейка памяти часто называется областью дверного звонка, и в этой области может быть даже несколько дверных звонков, служащих различным целям. Именно этот акт записи в область памяти дверного звонка «звонит в звонок» и уведомляет аппаратное устройство о том, что данные готовы и ждут. Теперь аппаратное устройство будет знать, что данные действительны и с ними можно работать. Обычно оно записывает данные на жесткий диск , или отправляет их по сети , или шифрует их и т. д.
Термин прерывание дверного звонка обычно является неправильным . Он похож на прерывание, потому что он заставляет устройство выполнять некоторую работу; однако, область дверного звонка иногда реализуется как опрашиваемая область, иногда область дверного звонка записывает данные в регистры физического устройства , а иногда область дверного звонка напрямую подключается к регистрам физического устройства. При записи через или напрямую в регистры физического устройства это может привести к возникновению реального прерывания в центральном процессоре устройства ( ЦП ), если таковой имеется.
Прерывания дверного звонка можно сравнить с прерываниями, сигнализируемыми сообщениями , поскольку у них есть некоторые сходства.
В многопроцессорных системах процессор может отправлять запрос на прерывание другому процессору через межпроцессорные прерывания [h] (IPI).
Прерывания обеспечивают низкие накладные расходы и хорошую задержку при низкой нагрузке, но значительно ухудшаются при высокой частоте прерываний, если не принять меры для предотвращения нескольких патологий. Явление, при котором общая производительность системы серьезно снижается из-за чрезмерного количества времени обработки, потраченного на обработку прерываний, называется штормом прерываний .
Существуют различные формы лайвлоков , когда система тратит все свое время на обработку прерываний, исключая другие необходимые задачи. В экстремальных условиях большое количество прерываний (например, очень высокий сетевой трафик) может полностью остановить систему. Чтобы избежать таких проблем, операционная система должна планировать обработку сетевых прерываний так же тщательно, как она планирует выполнение процессов. [24]
С многоядерными процессорами дополнительные улучшения производительности обработки прерываний могут быть достигнуты посредством масштабирования на стороне приема (RSS) при использовании многоочередных сетевых карт . Такие сетевые карты предоставляют несколько очередей приема , связанных с отдельными прерываниями; путем маршрутизации каждого из этих прерываний на разные ядра, обработка запросов прерываний, инициированных сетевым трафиком, полученным одной сетевой картой, может быть распределена между несколькими ядрами. Распределение прерываний между ядрами может выполняться автоматически операционной системой, или маршрутизация прерываний (обычно называемая IRQ affinity ) может быть настроена вручную. [25] [26]
Чисто программная реализация распределения получаемого трафика, известная как управление приемными пакетами (RPS), распределяет полученный трафик между ядрами на более поздних этапах пути данных как часть функциональности обработчика прерываний . Преимущества RPS перед RSS включают отсутствие требований к определенному оборудованию, более продвинутые фильтры распределения трафика и сниженную частоту прерываний, создаваемых сетевой картой. В качестве недостатка RPS увеличивает частоту межпроцессорных прерываний (IPI). Управление приемным потоком (RFS) продвигает программный подход дальше, учитывая локальность приложения ; дальнейшее повышение производительности достигается за счет обработки запросов на прерывание теми же ядрами, на которых конкретные сетевые пакеты будут потребляться целевым приложением. [25] [27] [28]
Прерывания обычно используются для обслуживания аппаратных таймеров, передачи данных в хранилище и из него (например, дисковый ввод-вывод) и интерфейсы связи (например, UART , Ethernet ), обработки событий клавиатуры и мыши, а также для реагирования на любые другие чувствительные ко времени события, требуемые прикладной системой. Немаскируемые прерывания обычно используются для реагирования на высокоприоритетные запросы, такие как тайм-ауты сторожевого таймера, сигналы отключения питания и ловушки .
Аппаратные таймеры часто используются для генерации периодических прерываний. В некоторых приложениях такие прерывания подсчитываются обработчиком прерываний для отслеживания абсолютного или прошедшего времени или используются планировщиком задач ОС для управления выполнением запущенных процессов , или и то, и другое. Периодические прерывания также обычно используются для вызова выборки с устройств ввода, таких как аналого-цифровые преобразователи , интерфейсы инкрементального энкодера и входы GPIO , а также для программирования устройств вывода, таких как цифро-аналоговые преобразователи , контроллеры двигателей и выходы GPIO.
Дисковое прерывание сигнализирует о завершении передачи данных с или на дисковое периферийное устройство; это может привести к запуску процесса, ожидающего чтения или записи. Прерывание отключения питания предсказывает неизбежную потерю питания, позволяя компьютеру выполнить упорядоченное выключение, пока еще остается достаточно энергии для этого. Клавиатурные прерывания обычно вызывают буферизацию нажатий клавиш , чтобы реализовать опережающую печать .
Прерывания иногда используются для эмуляции инструкций, которые не реализованы на некоторых компьютерах в семействе продуктов. [29] [30] Например, инструкции с плавающей точкой могут быть реализованы на аппаратном уровне на некоторых системах и эмулироваться на более дешевых системах. В последнем случае выполнение нереализованной инструкции с плавающей точкой вызовет прерывание исключения «недопустимая инструкция». Обработчик прерываний реализует функцию плавающей точки в программном обеспечении, а затем возвращается к прерванной программе, как если бы была выполнена инструкция, реализованная на аппаратном уровне. [31] Это обеспечивает переносимость прикладного программного обеспечения по всей линейке.
Прерывания похожи на сигналы , разница в том, что сигналы используются для межпроцессного взаимодействия (IPC), опосредованного ядром (возможно, через системные вызовы) и обрабатываемого процессами, в то время как прерывания опосредованы процессором и обрабатываются ядром . Ядро может передавать прерывание как сигнал процессу, который его вызвал (типичные примеры — SIGSEGV , SIGBUS , SIGILL и SIGFPE ).
остается только очистить, запустить программные прерывания и вернуться к обычной работе. "Обычная работа" вполне могла измениться в результате прерывания (обработчик мог быть
процессом, например), поэтому последнее, что происходит при возврате из прерывания, — это возможное перепланирование процессора.
wake_up
В системе Cortex-M4 прерывания и исключения имеют следующие свойства: ... Обычно один бит в регистре маски используется для маскирования (отключения) или демаскирования (разрешения) возникновения определенных прерываний/исключений.
Концепция прерывания — это то, что с годами расширилось в своих масштабах. Семейство 80x86 только добавило путаницы вокруг прерываний, введя инструкцию int (программное прерывание). Действительно, разные производители использовали такие термины, как исключения, сбои, аварийные остановки, ловушки и прерывания, для описания явлений, обсуждаемых в этой главе. К сожалению, нет четкого консенсуса относительно точного значения этих терминов. Разные авторы принимают разные термины для собственного использования.