UNIX: взаимодействие процессов
Шрифт:
1.9. Резюме
Взаимодействие процессов традиционно является одной из проблемных областей в Unix. По мере развития системы предлагались различные решения, и ни одно из них не было совершенным. Мы подразделяем IPC на четыре главных типа.
1. Передача сообщений (каналы, FIFO, очереди сообщений).
2. Синхронизация (взаимные исключения, условные переменные, блокировки чтения-записи, семафоры).
3. Разделяемая память (неименованная и именованная).
4. Вызов процедур (двери в Solaris, RPC Sun).
Мы рассматриваем взаимодействие как отдельных потоков одного процесса, так и нескольких независимых процессов.
Живучесть каждого типа IPC определяется либо процессом, либо ядром, либо файловой системой в зависимости от продолжительности его существования. При выборе типа IPC для конкретного применения нужно учитывать его живучесть.
Другим свойством каждого типа IPC является пространство
В исходных кодах, приведенных в книге, используются функции-обертки, описанные в разделе 1.6, позволяющие уменьшить объем кода, обеспечивая, тем не менее, проверку возврата ошибки для любой вызываемой функции. Имена всех функций-оберток начинаются с заглавной буквы.
Стандарты IEEE Posix — Posix.1, определяющий основы интерфейса С в Unix, и Posix.2, определяющий основные команды, — это те стандарты, к которым движутся большинство производителей. Однако стандарты Posix в настоящее время быстро поглощаются (включаются в качестве части) и расширяются коммерческими стандартами, в частности The Open Group (Unix 98).
Таблица 1.5. Версии модели клиент-сервер
Листинг | Описание |
---|---|
4.1 | Два канала между родительским и порожденным процессами |
4.5 | Использует popen и cat |
4.6 | Использует два канала FIFO между родительским и порожденным процессами |
4.7 | Два канала FIFO между независимым сервером и неродственным клиентом |
4.10 | Каналы FIFO между независимым последовательным сервером и несколькими клиентами |
4.12 | Программный канал или FIFO: формирование записей в потоке байтов |
6.7 | Две очереди сообщений System V |
6.12 | Одна очередь сообщений System V с несколькими клиентами |
6.16 | Одна очередь сообщений System V для каждого клиента; клиентов несколько |
15.15 | Передача дескриптора через дверь |
Таблица 1.6. Версии модели производитель-потребитель
Листинг | Описание |
---|---|
7.1 | Взаимное исключение, несколько производителей, один потребитель |
7.5 | Взаимное исключение и условная переменная, несколько производителей, один потребитель |
10.8 | Именованные семафоры Posix, один производитель, один потребитель |
10.11 | Семафоры Posix в памяти, один производитель, один потребитель |
10.12 | Семафоры Posix в памяти, несколько производителей, один потребитель |
10.15 | Семафоры Posix в памяти, несколько производителей, несколько потребителей |
10.18 | Семафоры Posix в памяти, один производитель, один потребитель: несколько буферов |
Таблица 1.7. Версии программы с увеличением последовательного номера
Листинг | Описание |
---|---|
9.1 | Индекс в файле, без блокировки |
9.3 | Индекс в файле, блокировка с помощью fcntl |
9.9 | Индекс
|
10.10 | Индекс в файле, блокировка с помощью именованного семафора Posix |
12.2 | Индекс в общей памяти mmap, блокировка с помощью именованного семафора Posix |
12.3 | Индекс в общей памяти mmap, блокировка с помощью семафора Posix в памяти |
12.4 | Индекс в неименованной общей памяти 4.4BSD, блокировка с помощью именованного семафора Posix |
12.5 | Индекс в общей памяти SVR4 /dev/zero, блокировка с помощью именованного семафора Posix |
13.6 | Индекс в общей памяти Posix, блокировка с помощью семафора Posix в памяти |
А.19 | Измерение производительности: блокировка взаимным исключением между потоками |
А.22 | Измерение производительности: блокировка чтения-записи между потоками |
А.23 | Измерение производительности: блокировка между потоками с помощью семафоров Posix в памяти |
А.25 | Измерение производительности: блокировка между потоками с помощью именованных семафоров Posix |
А.28 | Измерение производительности: блокировка между потоками с помощью семафоров System V |
А.29 | Измерение производительности: блокировка между потоками с помощью fcntl |
А.33 | Измерение производительности: блокировка между процессами с помощью взаимных исключений |
Упражнения
1. На рис 1.1 изображены два процесса, обращающиеся к одному файлу. Если оба процесса только дописывают данные к концу файла (возможно, длинного), какой нужен будет тип синхронизации?
2. Изучите заголовочный файл <errno.h> в вашей системе и выясните, как определена errno.
3. Дополните табл. 1.3 используемыми вами функциями, поддерживаемыми Unix-системами.
ГЛАВА 2
Posix IPC
2.1. Введение
Из имеющихся типов IPC следующие три могут быть отнесены к Posix IPC, то есть к методам взаимодействия процессов, соответствующим стандарту Posix:
■ очереди сообщений Posix (глава 5);
■ семафоры Posix (глава 10);
■ разделяемая память Posix (глава 13).
Эти три вида IPC обладают общими свойствами, и для работы с ними используются похожие функции. В этой главе речь пойдет об общих требованиях к полным именам файлов, используемых в качестве идентификаторов, о флагах, указываемых при открытии или создании объектов IPC, и о разрешениях на доступ к ним.
Полный список функций, используемых для работы с данными типами IPC, приведен в табл. 2.1.
Таблица 2.1. Функции Posix IPC
Очереди сообщений | Семафоры | Общая память | |
---|---|---|---|
Заголовочный файл | <mqueue.h> | <semaphore.h> | <sys/mman.h> |
Функции для создания, открытия и удаления | mq_open mq_close mq_unlink | sem_open sem_close sem_unlink sem_init sem_destroy | shm_open shm_unlink |
Операции управления | mq_getattr mq_setattr | ftruncate fstat | |
Операции IPC | mq_send mq_receive mq_notify | sem_wait sem_trywait sem_post sem_getvalue | mmap munmap |
2.2. Имена IPC
В табл. 1.2 мы отметили, что три типа IPC стандарта Posix имеют идентификаторы (имена), соответствующие этому стандарту. Имя IPC передается в качестве первого аргумента одной из трех функций: mq_open, sem_open и shm_open, причем оно не обязательно должно соответствовать реальному файлу в файловой системе. Стандарт Posix.1 накладывает на имена IPC следующие ограничения: