Следует быть аккуратным при определении живучести объекта IPC, поскольку она не всегда очевидна. Например, данные в канале (pipe) обрабатываются ядром, но живучесть каналов определяется процессами, а не ядром, потому что после того, как последний процесс, которым канал был открыт на чтение, закроет его, ядро сбросит все данные и удалит канал. Аналогично, хотя каналы FIFO и обладают именами в файловой системе, живучесть их также определяется процессами, поскольку все данные в таком канале сбрасываются после того, как последний процесс, в котором он был открыт, закроет его.
В табл. 1.1 сведена информация о живучести перечисленных ранее объектов IPC.
Таблица 1.1. Живучесть различных типов объектов IPC
Тип IPC | Живучесть определяет |
---|---|
Программный канал (pipe) | Процесс |
Именованный канал (FIFO) | Процесс |
Взаимное исключение Posix (mutex) | Процесс |
Условная переменная Posix (condition variable) | Процесс |
Блокировка чтения-записи Posix (lock) | Процесс |
Блокировка записи fcntl | Процесс |
Очередь сообщений Posix (message queue) | Ядро |
Именованный семафор Posix (named semaphore) | Ядро |
Семафор Posix в памяти (memory-based semaphore) | Процесс |
Разделяемая память Posix (shared memory) | Ядро |
Очередь сообщений System V | Ядро |
Семафор System V | Ядро |
Память с общим доступом System V | Ядро |
Сокет TCP (TCP socket) | Процесс |
Сокет UDP (UDP socket) | Процесс |
Доменный сокет Unix (Unix domain socket) | Процесс |
Обратите внимание, что ни один тип IPC в этой таблице не обладает живучестью, определяемой файловой системой. Мы уже упомянули о том, что три типа объектов IPC в стандарте Posix
1.4. Пространства имен
Если два неродственных процесса используют какой-либо вид IPC для обмена информацией, объект IPC должен иметь имя или идентификатор, чтобы один из процессов (называемый обычно сервером — server) мог создать этот объект, а другой процесс (обычно один или несколько клиентов — client) мог обратиться к этому конкретному объекту.
Программные каналы (pipes) именами не обладают (и поэтому не могут использоваться для взаимодействия между неродственными процессами), но каналам FIFO сопоставляются имена в файловой системе, являющиеся их идентификаторами (поэтому каналы FIFO могут использоваться для взаимодействия неродственных процессов). Для других типов IPC, рассматриваемых в последующих главах, используются дополнительные соглашения об именовании (naming conventions). Множество возможных имен для определенного типа IPC называется его пространством имен (name space). Пространство имен — важный термин, поскольку для всех видов IPC, за исключением простых каналов, именем определяется способ связи клиента и сервера для обмена сообщениями.
В табл. 1.2 сведены соглашения об именовании для различных видов IPC.
Таблица 1.2. Пространства имен для различных типов IPC