1 ...8 9 10 12 13 14 ...41
Взаимодействие процессов традиционно является одной из проблемных областей в 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 |
Измерение производительности: блокировка между процессами с помощью взаимных исключений |
Читать дальше
Конец ознакомительного отрывка
Купить книгу