Как процесс узнает, что получил сигнал - PullRequest
20 голосов
/ 07 декабря 2009

Пожалуйста, поправьте меня, если я ошибаюсь. Вот мое понимание сигналов:

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

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

Значит ли это, что сигналы могут быть доставлены процессу только тогда, когда ядро ​​планирует этот процесс, т.е. выделяет ему ЦП? Может ли процесс получить сигнал, когда он фактически выполняется на процессоре? Если это так, как это возможно, т.е. как процесс узнает, что сигнал ожидает его (так как он выполняется в режиме пользователя и не может получить доступ к печатной плате)

Скажем, есть многопроцессорная машина, и поэтому существует реальный параллелизм, т.е. одновременно выполняется несколько процессов. Процесс P1 выполняется на процессоре 1, а процесс P2 выполняется на процессоре 2, и теперь процесс P2 (имеющий достаточные привилегии) ​​отправляет сигнал процессу P1. Будет ли этот сигнал доставлен в P1 прямо сейчас, или же он будет доставлен после того, как P1 по какой-то причине освободит ЦП и будет снова перенесен на более позднее время ядром, а затем этот сигнал будет доставлен процессу P1.

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

Большое спасибо за вашу помощь и терпение :) 1015 *

Привет

Лали

Ответы [ 4 ]

12 голосов
/ 07 декабря 2009

Ответ зависит от реализации :). В Mac OS X (и FreeBSD) сигналы обрабатываются асинхронно - ядро ​​находит поток, который не блокирует сигнал, и устанавливает флаг асинхронного прерывания системы в этом потоке. В следующий раз, когда ядро ​​планирует этот поток, оно обрабатывает ловушку (выход из процесса, игнорирование ловушки или, при необходимости, вызов обработчика сигнала в пользовательском пространстве), вместо того чтобы организовывать обычное продолжение потока в пользовательском пространстве.

В Solaris реализация несколько похожа, хотя она также предлагает синхронные сигналы на основе аппаратных прерываний - синхронные сигналы доставляются в поток, вызвавший прерывание, в то время как асинхронные сигналы работают описанным выше способом.

Linux делает нечто подобное с Solaris (я не уверен, как вывод из этой ссылки следует из обсуждения, но это обсуждение полезно).

Posix.4 также определяет сигналы в реальном времени, но я с ними не работал.

3 голосов
/ 12 декабря 2009

Краткий ответ - да, процесс получает информацию о сигнале только на следующем запланированном временном интервале ЦП.

Как узнать, что процесс получил сигнал - он может вызвать sigprocmask (2).

0 голосов
/ 05 сентября 2014

Если я правильно помню, бит прибытия прерывания проверяется во время последнего состояния T команды 8085. Таким образом, должен быть способ генерировать реальное прерывание при поступлении сигнала, или должен быть (постоянный?) Фрагмент кода, прежде чем проверяется бит сигнала.

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

Просто постарайтесь быть идеальным, и надеюсь, что этот сайт поможет.

0 голосов
/ 15 декабря 2009

Процесс P1 выполняется на процессоре 1, а процесс P2 выполняется на процессоре 2, и теперь процесс P2 (имеющий достаточные привилегии) ​​отправляет сигнал процессу P1. Будет ли этот сигнал доставлен в P1 прямо сейчас, или же он будет доставлен после того, как P1 по какой-то причине освободит ЦП и будет снова перенесен на более позднее время ядром, а затем этот сигнал будет доставлен процессу P1.

Насколько я знаю в последних ядрах Linux, выполнение P1 может быть приостановлено, когда сигнал P2 испускает, и сигнал будет доставлен немедленно. Может быть, это так только для сигналов реального времени

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...