Прерывать - Interrupt

источники прерываний и обработка процессора

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

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

Типы

2 типа прерываний в операционной системе.jpg

Сигналы прерывания могут выдаваться в ответ на аппаратные или программные события. Они классифицируются как аппаратные прерывания или программные прерывания соответственно. Для любого конкретного процессора количество типов прерываний ограничено архитектурой.

Аппаратные прерывания

Аппаратное прерывание - это состояние, связанное с состоянием аппаратного обеспечения, о котором может сигнализировать внешнее аппаратное устройство, например линия запроса прерывания (IRQ) на ПК, или обнаруженное устройствами, встроенными в логику процессора (например, таймером ЦП. в IBM System / 370), чтобы сообщить, что устройству необходимо внимание со стороны операционной системы (ОС) или, если ОС нет, со стороны «голой» программы, запущенной на ЦП. Такие внешние устройства могут быть частью компьютера (например, контроллером диска ) или они могут быть внешними периферийными устройствами . Например, нажатие клавиши клавиатуры или перемещение мыши, подключенной к порту PS / 2, вызывает аппаратные прерывания, которые заставляют процессор считывать нажатие клавиши или положение мыши.

Аппаратные прерывания могут поступать асинхронно относительно тактовой частоты процессора и в любой момент во время выполнения инструкции. Следовательно, все сигналы аппаратных прерываний обусловлены их синхронизацией с часами процессора и действуют только на границах выполнения команд.

Во многих системах каждое устройство связано с определенным IRQ-сигналом. Это позволяет быстро определить, какое аппаратное устройство запрашивает обслуживание, и ускорить обслуживание этого устройства.

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

Маскировка

Процессоры обычно имеют внутренний регистр маски прерывания, который позволяет выборочно включать и отключать аппаратные прерывания. Каждый сигнал прерывания связан с битом в регистре маски; в некоторых системах прерывание разрешено, когда бит установлен, и отключено, когда бит сброшен, в то время как в других установленный бит запрещает прерывание. Когда прерывание отключено, соответствующий сигнал прерывания будет игнорироваться процессором. Сигналы, на которые действует маска, называются маскируемыми прерываниями .

Некоторые сигналы прерывания не зависят от маски прерывания и поэтому не могут быть отключены; они называются немаскируемыми прерываниями (NMI). NMI указывают на высокоприоритетные события, которые нельзя игнорировать ни при каких обстоятельствах, например, сигнал тайм-аута от сторожевого таймера .

Чтобы замаскировать прерывание, нужно отключить его, а чтобы демаскировать прерывание, нужно включить.

Ложные прерывания

Паразитное прерывание представляет собой аппаратное прерывание , для которых ни один источник не может быть найден. Термин «фантомное прерывание» или «фантомное прерывание» также может использоваться для описания этого явления. Ложные прерывания, как правило, представляют собой проблему с цепью прерывания с проводным ИЛИ, подключенной к входу процессора, чувствительному к уровню. Такие прерывания может быть трудно идентифицировать, когда система работает неправильно.

В схеме с проводным ИЛИ зарядка / разрядка паразитной емкости через резистор смещения линии прерывания вызовет небольшую задержку, прежде чем процессор обнаружит, что источник прерывания очищен. Если прерывающее устройство очищается слишком поздно в программе обслуживания прерывания (ISR), не будет достаточно времени для возврата схемы прерывания в состояние покоя до завершения текущего экземпляра ISR. В результате процессор будет думать, что еще одно прерывание ожидает обработки, поскольку напряжение на его входе запроса прерывания не будет высоким или достаточно низким, чтобы установить однозначную внутреннюю логику 1 или логический 0. Кажущееся прерывание не будет иметь идентифицируемого источника, следовательно, " ложное "прозвище".

Ложное прерывание также может быть результатом электрических аномалий из-за неправильной конструкции схемы, высоких уровней шума , перекрестных помех , проблем с синхронизацией или, что реже, неисправностей устройства .

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

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

Программное прерывание запрашивается самим процессором при выполнении определенных инструкций или при выполнении определенных условий. Каждый сигнал программного прерывания связан с определенным обработчиком прерывания.

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

Программные прерывания также могут быть неожиданно вызваны ошибками выполнения программы. Эти прерывания обычно называются ловушками или исключениями . Например, исключение деления на ноль будет «выброшено» (запрошено программное прерывание), если процессор выполняет команду деления с делителем, равным нулю. Обычно операционная система перехватывает и обрабатывает это исключение.

Способы срабатывания

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

Срабатывает по уровню

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

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

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

Срабатывает по фронту

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

Ответ процессора

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

  • Program Counter (PC) сохраняется в известном месте.
  • Все инструкции, предшествующие той, на которую указывает ПК, полностью выполнены.
  • Никакая инструкция, кроме той, на которую указывает ПК, не была выполнена, или любые такие инструкции отменяются до обработки прерывания.
  • Состояние выполнения инструкции, на которую указывает ПК, известно.

Реализация системы

Прерывания могут быть реализованы аппаратно как отдельный компонент с линиями управления или они могут быть интегрированы в подсистему памяти.

Если аппаратно реализовано как отдельный компонент, схема контроллера прерывания, такая как программируемый контроллер прерываний (PIC) IBM PC, может быть подключена между устройством прерывания и выводом прерывания процессора для мультиплексирования нескольких источников прерывания на одну или две линии ЦП, как правило. доступный. Если реализовано как часть контроллера памяти , прерывания отображаются в адресное пространство системной памяти .

Общие IRQ

Несколько устройств могут совместно использовать линию прерывания, запускаемую фронтом, если они предназначены для этого. Линия прерывания должна иметь подтягивающий или подтягивающий резистор, чтобы в неактивном состоянии она перешла в неактивное состояние, которое является ее состоянием по умолчанию. Устройства сигнализируют о прерывании, ненадолго переводя линию в состояние, отличное от состояния по умолчанию, и позволяют линии плавать (не запускать ее активно), когда не сигнализируют о прерывании. Этот тип подключения также называется открытым коллектором . Затем линия передает все импульсы, генерируемые всеми устройствами. (Это аналогично шнурку на некоторых автобусах и троллейбусах, который любой пассажир может потянуть, чтобы подать сигнал водителю о том, что он запрашивает остановку.) Однако импульсы прерывания от разных устройств могут слиться, если они возникают близко по времени. Чтобы избежать потери прерываний, ЦП должен запускаться по заднему фронту импульса (например, по переднему фронту, если линия подтягивается и переводится в низкий уровень). После обнаружения прерывания ЦП должен проверить все устройства на предмет требований к обслуживанию.

Прерывания, запускаемые по фронту, не страдают от проблем, которые возникают с прерываниями, запускаемыми по уровню, при совместном использовании. Обслуживание устройства с низким приоритетом может быть отложено произвольно, в то время как прерывания от устройств с высоким приоритетом продолжают приниматься и обслуживаться. Если есть устройство, которое ЦП не знает, как обслуживать, что может вызвать ложные прерывания, оно не будет мешать сигнализации прерывания других устройств. Однако прерывание, вызванное фронтом, может быть легко пропущено - например, когда прерывания замаскированы на определенный период - и, если нет какого-либо типа аппаратной защелки, которая записывает событие, восстановление невозможно. Эта проблема вызвала множество «зависаний» в раннем компьютерном оборудовании, потому что процессор не знал, что от него ожидается что-то делать. Более современное оборудование часто имеет один или несколько регистров состояния прерывания, которые фиксируют запросы прерываний; Хорошо написанный код обработки прерываний, управляемый ребрами, может проверять эти регистры, чтобы убедиться, что события не пропущены.

Пожилых Industry Standard Architecture (ISA) , шина использует по фронту сигнала прерывания, не обязующие устройства смогут обмениваться IRQ линии, но все материнские платы основного ISA включают подтягивающие резисторы на их IRQ линии, так хорошо себя устройство ISA совместного использования прерываний линий должно работать нормально. Параллельный порт , также использует по фронту сигнала прерывания. Многие старые устройства предполагают, что они имеют исключительное использование линий IRQ, что делает их электрически небезопасным совместное использование.

Есть 3 способа поднять несколько устройств, «использующих одну линию». Во-первых, исключительная проводимость (переключение) или исключительное подключение (к контактам). Далее идет по шине (все подключены к одной и той же линии прослушивания): карты на шине должны знать, когда они должны разговаривать, а не разговаривать (например, шина ISA). Разговор может быть инициирован двумя способами: защелкой накопления или логическими вентилями. Логические вентили ожидают непрерывного потока данных, который отслеживается на предмет ключевых сигналов. Аккумуляторы срабатывают только тогда, когда удаленная сторона возбуждает ворота сверх порогового значения, поэтому согласованная скорость не требуется. У каждого есть свои преимущества в скорости по сравнению с расстоянием. Как правило, триггер - это метод обнаружения возбуждения: нарастающий фронт, спадающий фронт, порог ( осциллограф может запускать самые разные формы и условия).

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

Сложность с разделением линий прерывания

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

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

Гибридный

Некоторые системы используют гибрид сигнализации с запуском по уровню и по фронту. Аппаратное обеспечение не только ищет фронта, но также проверяет, что сигнал прерывания остается активным в течение определенного периода времени.

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

С сообщением

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

Прерывания, сигнализируемые сообщениями, очень похожи на прерывания, запускаемые фронтом, в том смысле, что прерывание является мгновенным сигналом, а не непрерывным состоянием. Программное обеспечение обработки прерываний работает с ними примерно одинаково. Как правило, несколько ожидающих обработки прерываний, сигнализируемых сообщением, с одним и тем же сообщением (одна и та же виртуальная линия прерывания) могут объединяться, точно так же, как могут объединяться близко расположенные прерывания, запускаемые фронтом.

Векторы прерываний, сигнализируемые сообщением, могут быть общими в той степени, в которой может использоваться совместно используемая среда связи. Никаких дополнительных усилий не требуется.

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

PCI Express , последовательная компьютерная шина, использует исключительно прерывания, сигнализирующие о сообщениях .

Дверной звонок

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

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

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

Многопроцессорный IPI

В многопроцессорных системах процессор может отправить запрос прерывания другому процессору через межпроцессорные прерывания (IPI).

Представление

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

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

С многоядерными процессорами дополнительные улучшения производительности при обработке прерываний могут быть достигнуты за счет масштабирования на стороне приема (RSS) при использовании сетевых адаптеров с несколькими очередями . Такие сетевые адаптеры предоставляют несколько очередей приема, связанных с отдельными прерываниями; путем маршрутизации каждого из этих прерываний к разным ядрам обработка запросов прерывания, инициированных сетевым трафиком, полученным одной сетевой картой, может быть распределена между несколькими ядрами. Распределение прерываний между ядрами может выполняться автоматически операционной системой, или маршрутизация прерываний (обычно называемая сходством IRQ ) может быть настроена вручную.

Чисто программная реализация распределения принимающего трафика, известная как управление принимаемыми пакетами (RPS), распределяет полученный трафик между ядрами на более позднем этапе пути данных как часть функциональности обработчика прерываний . Преимущества RPS перед RSS включают отсутствие требований к конкретному оборудованию, более продвинутые фильтры распределения трафика и пониженную частоту прерываний, создаваемых сетевой картой. Как обратная сторона, RPS увеличивает частоту межпроцессорных прерываний (IPI). Управление потоком приема (RFS) развивает программный подход за счет учета местоположения приложения ; дальнейшее повышение производительности достигается за счет обработки запросов на прерывание теми же ядрами, на которых определенные сетевые пакеты будут потребляться целевым приложением.

Типичное использование

Прерывания обычно используются для обслуживания аппаратных таймеров, передачи данных в хранилище и из него (например, дисковый ввод-вывод) и интерфейсов связи (например, UART , Ethernet ), обработки событий клавиатуры и мыши, а также для ответа на любые другие чувствительные ко времени события. в соответствии с требованиями прикладной системы. Немаскированные прерывания обычно используются для ответа на высокоприоритетные запросы, такие как тайм-ауты сторожевого таймера, сигналы отключения питания и прерывания .

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

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

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

Прерывания похожи на сигналы , с той разницей, что сигналы используются для межпроцессного взаимодействия (IPC), опосредуются ядром (возможно, через системные вызовы) и обрабатываются процессами, в то время как прерывания опосредуются процессором и обрабатываются ядром . Ядро может передать прерывание как сигнал процессу, который его вызвал (типичными примерами являются SIGSEGV , SIGBUS , SIGILL и SIGFPE ).

История

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

UNIVAC 1103 компьютер , как правило , приписывают раннее использование прерываний в 1953. Ранее, на UNIVAC I (1951) «Арифметика переполнение либо вызвало Лобного FIX-подпрограмму из двух команд по адресу 0, или, по выбору программиста , заставил компьютер остановиться ". IBM 650 (1 954) включены в первое вхождение прерывания маскировки. Национальное бюро стандартов DYSEAC (1954) был первым , чтобы использовать прерывания для ввода / вывода. IBM 704 был первым , чтобы использовать прерывания для отладки , с «передаточной ловушкой», которая может ссылаться на специальную процедуру , когда команда ветвления была обнаружена. Система TX-2 лаборатории Линкольна Массачусетского технологического института (1957 г.) была первой, которая обеспечила несколько уровней приоритетных прерываний.

Смотрите также

Примечания

использованная литература

внешние ссылки