Взаимодействие процессов. Сигналы, именованные и неименованные каналы, IPC, сокеты.
Резидентная в RAM часть OS UNIX называется ядром. Программа ядра оформлена как выполняемый файл, который хранится в корневом каталоге корневой файловой системы OS UNIX и имеет имя, однозначно выделяющее его среди других файлов. Все работы вне ядра оформлены в виде процессов выполнения системных и прикладных программ. Под процессом понимается единица вычислительной работы, потребляющая ресурсы, предоставляемые ядром, для обработки системных и прикладных программ, которые оформлены как командные или выполняемые файлы на внешнем устройстве. Процессы могут взаимодействовать между собой посредством программных каналов или сигналов и обращаться к подпрограммам ядра через системные вызовы.
Программный канал есть средство коммуникации процессов, которое можно рассматривать как программно реализованную линию связи для передачи данных между двумя или более процессами. Каналы реализованы в виде снабженных специальным механизмом управления буферов ввода-вывода, которые трактуются как псевдо-файлы.
Каналы принято использовать следующим образом. Один процесс направляет (записывает) данные в канал. Другой процесс получает (читает) данные из канала.
Сигналыгенерируется, когда происходят определенные события, которые вызывают посылку сигнала. Сигнальные события могут быть вызваны программными и аппаратными причинами, прерыванием от терминала, результатом измерения времени и выполнением других процессов. Если инициатор сигнала ядро, другой процесс или интерактивные действия пользователя, то сигнал считается асинхронным по отношению к процессу-приемнику сигнала. Когда сигнал инициируется выполнением инструкций процесса-приемника, сигнал считается синхронным.
Каждый сигнал имеет уникальный номер, однозначно определяющий событие, которым он вызван.
Aсинхронные терминальные сигналы. SIGHUP - разрыв связи с терминалом; SIGINT - прерывание от терминала, генерируется при нажатии Ctrl-C; SIGQUIT - сигнал выхода, генерируется при нажатии Ctrl-\.
Синхронные сигналы ловушки SIGILL - попытка выполнить нелегальную машинную инструкцию; SIGFPE - десятичное переполнение или деление на 0; SIGBUS - ошибка шины при неверной косвенной адресации; SIGSEGV - нарушение границ сегментов адресного пространства; SIGSYS - неверный параметр при обращении к системному вызову; SIGPIPE - разрыв программного канала.
Сигнал от таймера реального времени SIGALRM - генерируется ядром при истечении интервала, заданного системным вызовом alarm.
Сигналы от событий в других процессах или системе SIGKILL - безусловное завершение процесса; SIGTERM - условное завершение процесса; SIGUSR1 - сигнал, определенный пользователем; SIGUSR2 - сигнал, определенный пользователем; SIGCONT - возобновление выполнения приостановленного процесса.
Пакет IPC (interprocess communication) включает в себя три механизма. Механизм сообщений дает процессам возможность посылать другим процессам потоки сформатированных данных, механизм разделения памяти позволяет процессам совместно использовать отдельные части виртуального адресного пространства, а семафоры - синхронизировать свое выполнение с выполнением параллельных процессов. Несмотря на то, что они реализуются в виде отдельных блоков, им присущи общие свойства.
- С каждым механизмом связана таблица, в записях которой описываются все его детали.
- В каждой записи содержится числовой ключ (key), который представляет собой идентификатор записи, выбранный пользователем.
- В каждом механизме имеется системная функция типа "get", используемая для создания новой или поиска существующей записи; параметрами функции являются идентификатор записи и различные флаги (flag). Ядро ведет поиск записи по ее идентификатору в соответствующей таблице.
- В каждом механизме ядро использует следующую формулу для поиска по дескриптору указателя на запись в таблице структур данных: указатель = значение дескриптора по модулю от числа записей в таблице
- Каждая запись имеет некую структуру данных, описывающую права доступа к ней.
- В каждой записи имеется другая информация, описывающая состояние записи.
- В каждом механизме имеется системная функция типа "control", запрашивающая информацию о состоянии записи, изменяющая эту информацию или удаляющая запись из системы.
Сообщения
С сообщениями работают четыре системных функции: msgget, которая возвращает (и в некоторых случаях создает) дескриптор сообщения, определяющий очередь сообщений и используемый другими системными функциями, msgctl, которая устанавливает и возвращает связанные с дескриптором сообщений параметры или удаляет дескрипторы, msgsnd, которая посылает сообщение, и msgrcv, которая получает сообщение.
Синтаксис вызова системной функции msgget:
msgqid = msgget(key,flag);
где msgqid - возвращаемый функцией дескриптор, а key и flag имеют ту же семантику, что и в системной функции типа "get".
Для посылки сообщения процесс использует системную функцию msgsnd:
msgsnd(msgqid,msg,count,flag);
где msgqid - дескриптор очереди сообщений, обычно возвращаемый функцией msgget, msg - указатель на структуру, состоящую из типа в виде назначаемого пользователем целого числа и массива символов, count - размер информационного массива, flag - действие, предпринимаемое ядром в случае переполнения внутреннего буферного пространства.
Сокеты – универсальные методы взаимодействия процессов на основе использования многоуровневых сетевых протоколов. Сокеты предназначены для работы по сети: блокируют драйверы, для удобства выполнения локальных подпрограмм.
Сокеты можно разбить на 2 типа:
1. Виртуальный канал - обеспечивает надежную доставку данных с сохранением исходной последовательности.
2. Дейтаграммы - не гарантируют надежную доставку с сохранением уникальности и последовательности, но они более экономны в смысле использования ресурсов, поскольку для них не требуются сложные установочные операции; таким образом, дейтаграммы полезны в отдельных случаях взаимодействия.