Чтение онлайн

ЖАНРЫ

UNIX: взаимодействие процессов

Стивенс Уильям Ричард

Шрифт:

■ В марте 1997 года было объявлено о выходе второй версии Единой спецификации Unix. Этот стандарт программного обеспечения называется также Unix 98, и именно так мы ссылаемся на эту спецификацию далее в тексте книги. Количество интерфейсов в Unix 98 возросло с 1170 до 1434, хотя для рабочей станции это количество достигает 3030, поскольку в это число включается CDE (Common Desktop Environment — общее окружение рабочего стола), которое, в свою очередь, требует системы X Window System и пользовательского интерфейса Motif. Подробно об этом написано в книге [9]. Полезную информацию можно также найти по адресу http://www.UNIX-systems.org/version2.

ПРИМЕЧАНИЕ

С этого сайта можно свободно скачать единую спецификацию Unix практически целиком.

Версии Unix и переносимость

Практически все версии Unix, с которыми можно столкнуться сегодня,

соответствуют какому-либо варианту стандарта Posix.1 или Posix.2. Мы говорим «какому-либо», потому что после внесения изменений в Posix (например, Добавление расширений реального времени в 1993 и потоков в 1996) производителям обычно требуется год или два, чтобы подогнать свои программы под эти стандарты.

Исторически большинство систем Unix являются потомками либо BSD, либо System V, но различия между ними постепенно стираются, по мере того как производители переходят к использованию стандартов Posix. Основные различия лежат в области системного администрирования, поскольку ни один стандарт Posix на данный момент не описывает эту область.

В большинстве примеров этой книги мы использовали операционные системы Solaris 2.6 и Digital Unix 4.0B. Дело в том, что на момент написания книги (конец 1997 — начало 1998 года) только эти две операционные системы поддерживали System V IPC, Posix IPC и программные потоки Posix (Pthreads).

1.8. Комментарий к примерам IPC

Чаще всего для иллюстрации различных функций в книге используются три шаблона (модели) взаимодействия:

1. Сервер файлов: приложение клиент-сервер, причем клиент посылает серверу запрос с именем файла, а сервер возвращает клиенту его содержимое.

2. Производитель-потребитель: один или несколько потоков или процессов (производителей) помещают данные в буфер общего пользования, а другие потоки или процессы (потребители) производят с этими данными различные операции.

3. Увеличение последовательного номера: один или несколько потоков или процессов увеличивают общий для всех индекс. Число это может храниться в файле с общим доступом или в совместно используемой области памяти.

Первый пример иллюстрирует различные формы передачи сообщений, а других два — разнообразные виды синхронизации и использования разделяемой памяти.

Таблицы 1.5, 1.6 и 1.7 представляют собой своего рода путеводитель по разрабатываемым нами программам на различные темы, изложенные в книге. В этих таблицах кратко описаны сами программы и указаны номера соответствующих листингов.

1.9. Резюме

Взаимодействие процессов традиционно является одной из проблемных областей в Unix. По мере развития системы предлагались различные решения, и ни одно из них не было совершенным. Мы подразделяем IPC на четыре главных типа.

1. Передача сообщений (каналы, FIFO, очереди сообщений).

2. Синхронизация (взаимные исключения, условные переменные, блокировки чтения-записи, семафоры).

3. Разделяемая память (неименованная и именованная).

4. Вызов процедур (двери в Solaris, RPC Sun).

Мы рассматриваем взаимодействие как отдельных потоков одного процесса, так и нескольких независимых процессов.

Живучесть каждого типа IPC определяется либо процессом, либо ядром, либо файловой системой в зависимости от продолжительности его существования. При выборе типа IPC для конкретного применения нужно учитывать его живучесть.

Другим свойством каждого типа IPC является пространство имен, определяющее идентификацию объектов IPC процессами и потоками, использующими его. Некоторые объекты не имеют имен (каналы, взаимные исключения, условные переменные, блокировки чтения-записи), другие обладают именами в рамках файловой системы (каналы FIFO), третьи характеризуются тем, что в главе 2 названо «именами IPC стандарта Posix», а четвертые — еще одним типом имен, который описан в главе 3 (ключи или идентификаторы IPC стандарта System V). Обычно сервер создает объект 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 Индекс в файле, блокировка с использованием функции open
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 Измерение производительности: блокировка между процессами с помощью взаимных исключений
Поделиться с друзьями: