Подтвердить что ты не робот

Как процесс узнает, что он получил сигнал

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

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

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

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

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

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

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

Привет

Lali

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

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

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