it-swarm-ru.tech

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

57
BillThor