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

<p>я не уверен, что понимаю концепцию аппаратных и программных прерываний.</p><p>если я правильно понимаю, цель аппаратного прерывания - привлечь внимание к процессору, что является частью реализации многозадачности процессора.</p><ol> <li>тогда что выдает аппаратное прерывание? это процесс аппаратного драйвера?</li> <li>если да, где работает процесс драйвера оборудования? если он работает на процессоре, то ему не придется привлекать внимание процессора с помощью аппаратного прерывания, верно? так это работает в другом месте?</li> <li>аппаратное прерывание прерывает процессор напрямую или сначала связывается с процессом ядра, а затем процесс ядра связывается с процессором или прерывает его?</li> </ol><hr><p>с другой стороны, я думаю, что целью программного прерывания является процесс, запущенный в данный момент на цп, для запроса некоторых ресурсов.</p><ol> <li>какие ресурсы? они все в форме запущенных процессов? например, представляют ли процесс драйвера процессора и процессы драйвера памяти ресурсы процессора и памяти? представляет ли процесс драйвера устройств ввода-вывода ресурсы ввода-вывода? являются ли другие запущенные процессы, с которыми процесс хотел бы взаимодействовать, также ресурсами?</li> <li>если да, программное прерывание связывается с процессами (которые представляют ресурсы) косвенно через процесс ядра? правильно ли, что в отличие от аппаратного прерывания, программное прерывание никогда не прерывает процессор напрямую, а вместо этого прерывает/связывается с процессом ядра?</li> </ol>

<p>аппаратное прерывание на самом деле не является частью многозадачности цп, но может приводить его в действие.</p><ol> <li> <p>аппаратные прерывания выдаются аппаратными устройствами, такими как диск, сетевые карты, клавиатуры, часы и т.д. каждое устройство или набор устройств будет иметь свою собственную линию irq (interrupt request). на основании irq цп отправит запрос соответствующему аппаратному драйверу. (аппаратные драйверы обычно являются подпрограммами в ядре, а не отдельным процессом.)</p> </li> <li> <p>драйвер, который обрабатывает прерывание, запускается на процессоре. процессор прерывается из-за того, что он делал для обработки прерывания, поэтому для привлечения внимания процессора ничего дополнительного не требуется. в многопроцессорных системах прерывание обычно прерывает только один из процессоров. (в особых случаях мэйнфреймы имеют аппаратные каналы, которые могут работать с несколькими прерываниями без поддержки со стороны основного процессора.)</p> </li> <li> <p>аппаратное прерывание прерывает процессор напрямую. это приведет к запуску соответствующего кода в процессе ядра. для процессов, для обработки которых требуется некоторое время, код прерывания может позволить себе прерываться другими аппаратными прерываниями.</p> <p>в случае прерывания по таймеру код планировщика ядра может приостановить запущенный процесс и разрешить запуск другого процесса. именно наличие кода планировщика обеспечивает многозадачность.</p> </li> </ol><p>программные прерывания обрабатываются так же, как аппаратные прерывания. однако они могут быть сгенерированы только теми процессами, которые в данный момент запущены.</p><ol> <li> <p>обычно программные прерывания - это запросы на ввод/вывод (вход или выход). они будут вызывать подпрограммы ядра, которые будут планировать ввод-вывод. для некоторых устройств ввод-вывод будет выполнен немедленно, но дисковый ввод-вывод обычно ставится в очередь и выполняется позднее. в зависимости от выполняемого ввода-вывода, процесс может быть приостановлен до завершения ввода-вывода, в результате чего планировщик ядра выбирает другой процесс для запуска. ввод-вывод может происходить между процессами, и обработка обычно планируется таким же образом, как и дисковый ввод-вывод.</p> </li> <li> <p>программное прерывание говорит только с ядром. ядро отвечает за планирование любых других процессов, которые должны быть запущены. это может быть другой процесс в конце трубы. некоторые ядра позволяют существовать некоторым частям драйвера устройства в пользовательском пространстве, и ядро запланирует запуск этого процесса при необходимости.</p> <p>правильно, что программное прерывание напрямую не прерывает процессор. только код, который в данный момент выполняет код, может генерировать программное прерывание. прерывание - это запрос к ядру сделать что-то (обычно ввод/вывод) для запуска процесса. специальным программным прерыванием является вызов yield, который запрашивает планировщик ядра, чтобы проверить, можно ли запустить какой-то другой процесс.</p> </li> </ol><p>ответ на комментарий:</p><ol> <li> <p>для запросов ввода/вывода ядро делегирует работу соответствующему драйверу ядра. подпрограмма может поставить i/o в очередь для последующей обработки (обычно для дискового ввода/вывода) или выполнить ее немедленно, если это возможно. очередь обрабатывается драйвером, часто при реагировании на аппаратные прерывания. когда один ввод/вывод завершается, следующий элемент в очереди отправляется на устройство.</p> </li> <li> <p>да, программные прерывания позволяют избежать этапа аппаратной сигнализации. процесс, генерирующий программный запрос, должен быть текущим процессом, чтобы он не прерывал работу цп. однако они прерывают поток вызывающего кода.</p> <p>если аппаратному обеспечению требуется, чтобы процессор что-то делал, это заставляет процессор прерывать внимание к коду, который он выполняет. процессор поместит свое текущее состояние в стек, чтобы впоследствии он мог вернуться к тому, что делал. прерывание может остановиться: запущенная программа; код ядра, обрабатывающий другое прерывание; или простой процесс.</p> </li> </ol>