Что такое программные и аппаратные прерывания и как они обрабатываются?

43

Я не уверен, что понимаю концепцию аппаратных и программных прерываний.

Если я правильно понимаю, цель аппаратного прерывания - привлечь внимание к процессору, что является частью реализации многозадачности процессора.

  1. Тогда что выдает аппаратное прерывание? Это процесс аппаратного драйвера?
  2. Если да, где работает процесс драйвера оборудования? Если он работает на процессоре, то ему не придется привлекать внимание процессора с помощью аппаратного прерывания, верно? Так это работает в другом месте?
  3. Аппаратное прерывание прерывает процессор напрямую или сначала связывается с процессом ядра, а затем процесс ядра связывается с процессором или прерывает его?

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

  1. Какие ресурсы? Они все в форме запущенных процессов? Например, процесс драйвера процессора и процесс драйвера памяти представляют ресурсы процессора и памяти? Представляет ли процесс драйвера устройств ввода-вывода ресурсы ввода-вывода? Другие запущенные процессы, с которыми процесс хотел бы взаимодействовать, также и ресурсы?
  2. Если да, программное прерывание связывается с процессами (которые представляют ресурсы) косвенно через процесс ядра? Правильно ли, что в отличие от аппаратного прерывания, программное прерывание никогда не прерывает процессор напрямую, а вместо этого прерывает / связывается с процессом ядра?
Тим
источник

Ответы:

55

Аппаратное прерывание на самом деле не является частью многозадачности ЦП, но может приводить его в действие.

  1. Аппаратные прерывания выдаются аппаратными устройствами, такими как диск, сетевые карты, клавиатуры, часы и т. Д. Каждое устройство или набор устройств будет иметь свою собственную линию IRQ (Interrupt ReQuest). На основании IRQ ЦП отправит запрос соответствующему аппаратному драйверу. (Аппаратные драйверы обычно являются подпрограммами в ядре, а не отдельным процессом.)

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

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

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

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

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

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

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

Ответ на комментарий:

  1. Для запросов ввода / вывода ядро ​​делегирует работу соответствующему драйверу ядра. Подпрограмма может поставить I / O в очередь для последующей обработки (обычно для дискового ввода / вывода) или выполнить ее немедленно, если это возможно. Очередь обрабатывается драйвером, часто при реагировании на аппаратные прерывания. Когда один ввод / вывод завершается, следующий элемент в очереди отправляется на устройство.

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

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

BillThor
источник
Благодарность! (1) В программном прерывании выполняются ли операции ввода-вывода подпрограммой драйвера устройства ввода-вывода в процессе ядра? (2) правильно ли, что путь, по которому проходит программное прерывание, на один шаг короче, чем путь к аппаратному прерыванию? Другими словами, для программного прерывания: программная программа -> процедура драйвера устройства в процессе ядра; для аппаратного прерывания: аппаратное обеспечение -> CPU -> процедура драйвера устройства в процессе ядра?
Тим
Благодарность! Правильно ли, что аппаратное прерывание заставляет ЦП выдвигать свое текущее состояние в стек, чтобы аппаратный драйвер мог работать на ЦП, а затем возвращать прерванный процесс на ЦП? Является ли программное прерывание причиной того, что процесс, запущенный на ЦП, помещается в стек, чтобы запрошенная служба могла быть запущена на ЦП?
Тим
Любое прерывание приведет к тому, что состояние будет помещено в стек. Это позволяет системе перезагрузить состояние, когда это сделано с прерыванием.
BillThor
Благодарность! если запрошенная служба не будет работать на ЦП, например, операции ввода-вывода, которые выполняются на устройствах ввода-вывода вместо ЦП, и процесс запроса может продолжаться без ожидания завершения запрошенной службы, будет ли процесс запроса все еще помещаться в стек ?
Тим
Обычно чтение ввода / вывода вызывается синхронно, и процесс не будет запущен до завершения ввода / вывода. Для чтения вы почти всегда хотите этого. Запись обычно происходит асинхронно, позволяя процессу продолжить работу.
BillThor