Процессы называются параллельными если они существуют одновременно. Параллельные процессы могут работать совершенно независимо друг от друга либо быть асинхронными. Это означает что данным процессам необходимо периодически синхронизироваться и взаимодействовать при они могут быть достаточно сложны.
Во время выполнения параллельных процессов может возникнуть ситуация одновременного доступа из нескольких процессов к массивам данных, хранимых в глобальных переменных. В этом случае результат такого обращения к будет непредсказуемым и в большинстве случаев данные будут испорчены.
Для того, чтобы избежать этой ситуация придуман и используется в различных языках программирования механизм блокировок «критическая секция», который гарантирует что только один поток/процесс находится в этом состоянии, остальные же потоки находятся в заблокированном состоянии и ожидают выхода процесса из этой части программы.
Сигнал дает возможность задаче реагировать на событие, источником которого может быть операционная система или другая задача. Сигналы вызывают прерывание задачи и выполнение заранее предусмотренных действий. Сигналы могут вырабатываться синхронно, то есть как результат работы самого процесса, а могут быть направлены процессу другим процессом, то есть вырабатываться асинхронно. Синхронные сигналы чаще всего приходят от системы прерываний процессора и свидетельствуют о действиях процесса, блокируемых аппаратурой, например деление на нуль, ошибка адресации.
Примером асинхронного сигнала является сигнал с терминала – например нажатие CTRL-C для снятия процесса с выполнения. В результате нажатия этой комбинации клавиш ОС вырабатывает сигнал и направляет его активному процессу. В данном случае реакцией на сигнал является безусловное завершение процесса.
В системе может быть определен набор сигналов. Программный код процесса, которому поступил сигнал, может либо:
проигнорировать его,
прореагировать на него стандартным действием (например, завершиться),
выполнить специфические действия, определенные прикладным программистом. В данном случае в программном коде необходимо предусмотреть специальные системные вызовы, с помощью которых операционная система информируется, какую процедуру надо выполнить в ответ на поступление того или иного сигнала.
Наиболее часто используемые сигналы:
9 (KILL) – принудительное уничтожение процесса
15 (TERM) - программное завершение процесса
1 (HUP) - сигнал отбоя. Многие системные процессы при получении этого сигнала перечитывают свои конфигурационные файлы.
Иногда, правда, редко, процессы впадают в такие состояния, что их нельзя "убить" даже выдав команду kill -9 <pid>.
За сигналами SIGUSR1, SIGUSR2 не закреплено системных функций, они доступны для использования под любые цели.