Сигналы и прерывания сравнения

основываясь на различных ссылках, мое субъективное определение сигналы в Linux-это "триггеры, которые используются для уведомления процессов о возникновении определенного события.Событие здесь может относиться к программному исключению.Дополнительно сигналы могут также быть использованы для механизмов IPC." вопросы у меня есть

  • Я предполагаю, что только исключения (программные прерывания) уведомляются через сигналы.Как насчет случая аппаратных прерываний.
  • каковы различные источники сигнала? Мне кажется, что kernel всегда является источником сигнала.(за исключением случаев, когда используется для IPC)
  • разница между обработчиком сигнала и ISR?.
  • разница между блокировкой сигнала и маскировкой прерываний?

3 ответов


прерывания можно рассматривать как средство связи между процессором и ядром ОС. Сигналы можно рассматривать как средство связи между ядром ОС и процессами ОС.

прерывания могут инициироваться процессором (исключения-например: деление на ноль, ошибка страницы), устройствами (аппаратные прерывания - e.g: входной сигнал доступный), или инструкцией К. П. У. (ловушками-е. g: syscalls, точки останова). В конечном итоге они управляются процессором, который "прерывает" текущую задачу и вызывает OS-ядро предоставило обработчик ISR/interrupt.

сигналы могут быть инициированы ядром ОС (e.g: SIGFPE, SIGSEGV, SIGIO) или процессом(kill ()). В конечном итоге они управляются ядром ОС, которое доставляет их в целевой поток/процесс, вызывая либо общее действие (игнорировать, завершать, завершать и дамп-ядро), либо обработчик сигналов, предоставленный процессом.


Я предполагаю, что только исключения (программные прерывания) уведомляются через сигналы.Как насчет случая аппаратных прерываний.

С чего начать ? Есть много разных случаев. Имейте в виду, что прерывания-это аппаратное обеспечение, вызывающее процессор. Прерывания по существу состоят из" аппаратного обеспечения, требующего внимания " и числа от 0 до 255. Сигналы похожи, но имеют 2 параметра: идентификатор процесса назначения и int (32 бит или 64 бита, в зависимости от arch). Аппаратные прерывания всегда обрабатывается в пространстве ядра, тогда как сигналы-это только вещи пользовательского пространства. Ядро использует аппаратные прерывания по разным причинам.

одним из примеров аппаратного прерывания, которое не имеет ничего общего с сигналами, является подсистема VM. Вы знаете, что в современных операционных системах вы можете выделить больше памяти, чем фактически существует в системе. Так как же это работает ? Ну, он работает, используя аппаратные прерывания. Когда вы выделяете память, ядро принимает к сведению, но на самом деле не все, что угодно. Затем, когда вы пытаетесь получить доступ к выделенной памяти, процессор будет жаловаться "но эта память не существует", что создаст аппаратное прерывание. Ядро пойдет и просмотрит свои заметки, обнаружит, что вы действительно запросили эту память, очистит некоторую память, которую она имеет свободной, и скажет процессору "сопоставить" эту память в ожидаемом месте. После чего ядро возобновляет работу вашей программы в точке непосредственно перед аппаратным прерыванием, и на этот раз процесс найдет память в порядке.

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

сигналы используются для связи между процессами. Что-то очень "сигнальное" было бы обычным поведением для демонов linux, чтобы перезагрузить свою конфигурацию на SIGHUP, любимых и ненавидимых сисадминами повсюду. Когда вы изменяете, скажем, конфигурацию apache, процесс автоматически не начинает использовать новый конфиг. Вы могли завершить и перезапустить процесс, но это означает, что 4-5 секунд ваш сервер будет из воздуха. Поэтому вместо этого вы можете "killall-HUP apache". Это вызовет подпрограмму в процессе apache,которая заставит ее перечитывать конфигурационный файл.

процесс приостановления реализуется с помощью сигналов (сочетание клавиш Ctrl-Z), то процесс прерывания (сочетание клавиш Ctrl-С), процесс бросить (клавиши Ctrl-), терминал отключается (сигнал SIGHUP), ... более полный список можно найти здесь : http://en.wikipedia.org/wiki/Unix_signal.

один вывод может заключаться в том, что они похожи, но они работают на другом уровне : аппаратные прерывания-это, ну, аппаратное обеспечение, требующее внимания, и программное обеспечение самого низкого уровня обязывает. Как правило, ядро обрабатывает все аппаратные средства, а процессы информирования выполняются несколько независимо от аппаратных прерываний. Для ряда сигналов предусмотрена обработка по умолчанию (например, ctrl-z, ctrl-c,...), для других реализация очень зависит от приложения (например, SIGHUP).

когда дело доходит до сигналов, ну, это просто программное обеспечение. Они делают все, что вы можете захотеть, и linux поставляется с удобными методами для вызова этих подпрограмм. В некоторых случаях ядро может вызвать процедуру сигнала (например, SIGSEGV, SIGCHILD,...), но это вряд ли когда-либо связано с оборудованием. Они просто удобный способ запуска определенной процедуры в приложении.

раньше был специальный случай: прерывание "OS", в DOS 21h. Это больше не используется (хотя все еще работает), но идея такова. Программа может вызвать определенное прерывание, чтобы попросить ядро выполнить определенные действия. Действия, являющиеся syscalls (открытие файла, закрытие сокета, что у вас есть). Как я уже сказал, интересно,но больше не используется.

каковы различные источники сигнала? Мне кажется, что kernel всегда является источником сигнала.(за исключением случаев, когда используется для IPC)

A сигнал либо поступает от самого процесса (SIGABRT), либо от ядра (SIGSEGV,...) или из других процессов, таких как оболочка, например (ctrl-z, ctrl-c, ctrl -\,...) или убить. Но они могут поступать из любой другой программы с помощью функции kill libc:

   #include <sys/types.h>
   #include <signal.h>

   int kill(pid_t pid, int sig);

разница между обработчиком сигнала и ISR?.

основное отличие заключается в том, что ISRs живут в пространстве ядра и должны учитывать, что весь компьютер заморожен во время их исполнение. Это означает, что они могут прервать любой процесс и что угодно в ядре. Они также "останавливают мир". В то время как прерывание обрабатывается, ничего не будет. Поэтому, если обработчик прерываний чего-то ждет, машина зависает. Если обработчик прерываний переходит в цикл, единственным вариантом является перезагрузка компьютера.

ISRs действительно трудно получить право. На них много теории, в linux у них есть верхняя половина и нижняя половина, со всеми видами приоритетная обработка, специальное выделение памяти, ... и это минное поле. Один шаг в неправильном направлении в ISR убьет машину. Ошибка в ISR вызовет dataloss, возможно, даже прямой сбой оборудования. На самом деле, говоря по опыту, простое подозрение, что вы планируете сделать что-то неправильно в ISR, немедленно приводит к совершенно непредсказуемому поведению машины.

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

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

разница между блокировкой сигнала и маскировкой прерываний?

Они очень похожи. За исключением того, что блокировка сигнала выполняется на основе каждого процесса. В обоих случаях есть разблокированные сигналы, и есть NMI (non maskable interrupt) (оба указывают на серьезные ошибки).

В конце сигналы и прерывания посылают число, либо ядру, либо конкретным процессам. Блокировка сигнала и маскировка прерываний просто означает, что система игнорирует определенные номера.

одно отличие заключается в том, что маскировка прерываний реализована в аппаратном обеспечении.


сигналы и прерывания ведут себя примерно одинаково. Разница в том, что сигналы происходят с процессом (который живет в виртуальной среде), в то время как исключения являются общесистемными.

определенные ошибки помечаются ЦП как исключение, а затем сопоставляются с сигналом, который доставляется процессу ядром. Ядро может выбрать скрытие любого исключения из процесса (например, доступ к несопоставленной памяти автоматически фиксируется пейджинговый.)

аппаратные прерывания-это просто исключение, которое ядро может выбрать для отображения сигнала (например, если вы используете alarm(2)).

ядро генерирует сигналы в ответ на различные события, среди которых исключения, завершение ввода-вывода, явные запросы пользовательского пространства,...

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