2016-03-25 3 views
0

Я очень смущен, чтобы понять, почему обработчик прерываний не может спать? У меня есть 2 мнения по той же проблеме: -Почему у обработчика прерывания есть функция сна?

  1. Обработчик прерываний не является планируемым? Потому что у него нет task_struct.

  2. Если обработчик спит, система может висеть, потому что прерывание системного такта маскируется и неспособно планировать процесс сна.

, что я не получает, является обработчик прерываний планируемым, но из-за более низкие часы приоритета системы прерываний, которая маскируется из-за более высокий приоритетом intrrupt не в состоянии генерировать снова.

, пожалуйста, дайте мне хороший пример для этого же.

+0

* система может зависнуть * - Почему может? Почему вы думаете, что это возможность? –

+0

Возможный дубликат: http://stackoverflow.com/questions/1053572/why-kernel-code-thread-executing-in-interrupt-context-cannot-sleep, см. Также https://www.quora.com/Why- cant-you-sleep-in-an-interrupt-handler-in-the-Linux-kernel-Is-this-true-of-all-OS-ядра? share = 1 – augurar

+0

Почему у этого есть тег C? Это вопрос ОС :( –

ответ

0

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

+0

Hi Liran Ben, Данная ссылка вызывает планировщик в контексте прерывания, я очень смущаюсь, что является причиной не использования сна. Https://www.quora.com/Why-cant-you-sleep -in-an-interrupt-handler-in-the-Linux-kernel-Is-this-true-of-all-OS-ядра –

+0

Внешний обработчик прерываний не должен спать или уступать, что исключает вызов lock_acquire(), thread_yield() и многие другие функции. Сон в контексте прерывания эффективно помещает прерванный поток в спящий режим, пока обработчик прерывания не будет снова запланирован и не будет возвращен. Это было бы несправедливо по отношению к несчастливому потоку, и он был бы тупиком, если бы обработчик был ожидая спальной нити, например, отпустить блокировку. https://web.stanford.edu/class/cs140/projects/pintos/pintos_6.html –

0

Вы можете» t спать в обработчиках прерываний в Linux, потому что они не подкреплены потоком выполнения. Другими словами, они не являются планируемыми сущностями.

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

От Robert Love on Quora

+0

HI MSC, до сих пор не получилось. Что вы имеете в виду по теме "Поддерживаемые по потоку ", называется ли это прерванным процессом? У обработчика прерываний есть task_struct? можно ли вызвать планировщик в контексте прерывания? –