В UNIX есть набор средств, поддерживающих взаимодействие произвольных процессов. Одно из таких средств - Система Межпроцессного Взаимодействия IPC (InterProcess Communications). Суть этой системы заключается в следующем.
Имеется некоторое количество ресурсов, которые называются в системе разделяемыми. К одному и тому же разделяемому ресурсу может быть организован доступ со стороны произвольного количества произвольных процессов. При этом возникает две проблемы
1) Именование;
2) Синхронизация;
1. Для неименованных каналов, за счет того, что они передавались по родственному наследованию, всегда в процессе были известны дескрипторы, ассоциированные с каналом.
Проблема именования в системе IPC решается за счет ассоциирования с каждым ресурсом некоторого ключа. В общем случае это целочисленное значение. Для того, чтобы не было коллизии ключей, в системе предусмотрено стандартное средство генерации уникальных ключей. При создании разделяемого ресурса его автор приписывает ему номер и определяет права доступа к этому ресурсу. После этого любой процесс, который укажет системе, что он хочет общаться с разделяемым ресурсом с ключом N, и обладает необходимыми правами доступа, будет допущен для работы с этим ресурсом.
2. Проблема синхронизации доступа - как организовать обмен с ресурсами, чтобы этот обмен был корректным. Если у нас есть, например, ресурс “оперативная память”, то когда один процесс еще не дописал информацию, а другой процесс уже прочитал весь блок, то возникает некорректная ситуация.
Система IPC поддерживает три разновидности разделяемых ресурсов:
1. Разделяемая память.
2. Передача сообщений.
3. Семафоры.
1. Разделяемая память.
При создании ресурса разделяемой памяти задаются три параметра - ключ, права доступа и размер области памяти. После создания ресурса к нему могут быть подключены процессы, желающие работать с этой памятью. Т.е. концептуально - это возможность нескольких процессов иметь общее поле оперативной памяти, и соответственно работать с этим полем, как с неким массивом, на который имеется указатель.
Проблема синхронизации здесь стоит особенно остро, но базовые средства работы с разделяемой памяти никакой синхронизации не предполагают. Имеются некоторые функции управления доступом к разделяемому ресурсу, с помощью которых можно установить некоторые правила работы с разделяемыми ресурсами. В частности, существует опция, заставляющая процесс дождаться появления ресурса.
2. Передача сообщений.
Разделяемым ресурсом здесь является очередь сообщений. Эта очередь может содержать произвольное количество (в пределах разумного) сообщений разной длины и разного типа.
Сообщение состоит из некоторого спецификатора типа, и некоторого набора данных. Процесс, подтвердив ключ и имея права доступа к этому разделяемому ресурсу, может осуществлять действия по записи сообщений в очередь, и по чтению сообщений из очереди.
Рисунок 3.10 - Использование очереди сообщений
Порядок чтения и записи сообщений из очереди соответствует названию этой структуры - очередь. Кроме того, за счет того, что каждое сообщение типизировано, есть возможность рассмотрения этой очереди с нескольких точек зрения. Первая точка зрения - это одна очередь и порядок в ней хронологический. Вторая точка зрения - это возможность представление этой очереди в виде нескольких очередей, каждая из которых содержит элементы определенного типа.
Здесь также возникают проблемы синхронизации.
3. Семафоры.
Семафоры - это некоторый объект, который имеет целочисленное значение S, и с которым связаны две операции: V(S) и P(S).
Одна позволяет увеличивать значение семафора, другая - уменьшать. С этими изменениями связаны возможности блокировки процесса и разблокировки процесса.
Выполнение этих операций не может прерваться до их завершения. Т.е. если семафор реализован в системе, то это должна быть одна команда.
В этом случае разделяемым ресурсом является “массив семафоров”, каждый элемент массива - семафор. Как и к любому разделяемому ресурсу, к этому массиву может быть обеспечен доступ со стороны различных процессов, обладающих нужными правами и ключом к данному ресурсу.
Для управления работой семафора есть некоторые функции, которые позволяют реализовывать операции P и V над одним или несколькими семафорами и управлять ресурсом.