Как аппаратные прерывания обрабатываются при планировании без прерывания? - PullRequest
1 голос
/ 28 мая 2020

Допустим, у меня есть процесс A, который в настоящее время выполняется. Затем я нажимаю Ctrl + C, как обрабатывается это прерывание?

Выполняется ли сначала A fini sh, а затем обрабатывается прерывание?

Попадает ли A в очередь готовности?

Ответы [ 2 ]

2 голосов
/ 28 мая 2020

Вы путаете прерывания, сигналы и планирование задач. Все это очень разные концепции.

Я нажимаю Ctrl + C, как обрабатывается это прерывание?

CTRL + C не имеет ничего , связанного с прерываниями. Это комбинация клавиш, которая перехватывается эмулятором терминала, который затем отправляет сигнал (SIGINT) текущему запущенному процессу. Доставка сигнала осуществляется с помощью системного вызова kill (который, вопреки своему названию, не обязательно убивает процесс).

Выполняется ли сначала sh, а тогда прерывание обрабатывается?

Что происходит, когда ваша программа получает сигнал SIGINT, зависит от конкретного случая c. Программа может зарегистрировать обработчик сигнала и решить, что делать, если он получит определенный сигнал c. Другими словами, это «прерывание», как вы его называете, происходит во время работы процесса : когда сигнал доставляется, ядро ​​временно «приостанавливает» нормальный код процесса, позволяя процессу запустить свой сигнал обработчик, а затем возобновить процесс с того места, где он остановился.

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

См. man 7 signal для получения дополнительной информации.

Помещается ли A в очередь готовности?

Не существует такой вещи, как «очередь готовности» , Я полагаю, вы имеете в виду очередь выполнения . Если процесс будет остановлен сигналом, он перестанет существовать и будет удален из своей очереди выполнения, поэтому ни одна очередь выполнения больше не будет иметь A.

Если процесс не завершен, он по-прежнему будет существовать в системе, и ядро ​​продолжит выполнять его вместе с другими процессами, выполняемыми на том же процессоре. Для каждого ЦП существует одна очередь выполнения, и планировщик использует ее, чтобы определить, какие процессы и когда запускать. Процессы также можно перемещать из одной очереди выполнения в другую (например, в целях балансировки нагрузки), но это другой topi c.

1 голос
/ 28 мая 2020

В x86 прерывания запрещаются и включаются командами CLI (очистить флаг прерывания) и STI (установить флаг прерывания) соответственно.
Немаскируемые прерывания не будут затронуты этим. Другие прерывания будут обслуживаться, как только вы снова установите флаг прерывания.

Терминал, в котором вы нажали Ctrl- C, отправляет сигнал INT всем процессам, присоединенным к нему («прерывание», SIGINT) что по умолчанию приводит к завершению процесса.

...