Связь
До сих пор взаимодействие между процессами рассматривалось как обмен временными сигналами. Более тесное взаимодействие требует специальных средств связи, которые обеспечивают передачу и получение произвольных данных. Примерами последних служат данные, предназначенные для вывода на устройства построчной печати, команды (например, откачать процесс или подвести головку диска), запросы состояний (особенно устройств ввода/вывода) и даже почта от одного интерактивного пользователя к другому. В контексте связи между процессами все это называется сообщениями. В системе с одним процессором посылающий и получающий процессы не могут работать одновременно. В мультипроцессорных системах также нет никакой гарантии их одновременного исполнения. Следовательно, для хранения посланного, но еще не полученного сообщения необходимо место. Формально оно называется буфером сообщений, неформально - почтовым ящиком. Если объем передаваемых данных велик, то эффективнее не передавать их непосредственно, а отправлять в почтовый ящик сообщение, информирующее процесс-получатель о том, где можно их найти.
Почтовый ящик может быть связан с парой процессов, только с отправителем, только с получателем, или его можно получить из множества почтовых ящиков, которые используют все или несколько процессов. Если почтовый ящик не связан с процессами, то сообщение должно содержать идентификаторы и процесса-отправителя, и процесса-получателя. Почтовый ящик, связанный с процессом-получателем, облегчает посылку сообщений от нескольких процессов в фиксированный пункт назначения. В качестве примера можно привести программу управления вводом/выводом. Двунаправленный почтовый ящик, связанный с парой процессов, позволяет подтверждать прием сообщений. Если используется множество почтовых ящиков, то каждый из них хранит либо сообщение, либо подтверждение. Чтобы гарантировать передачу подтверждений, когда все почтовые ящики заняты, подтверждение на сообщение помещается в тот же почтовый ящик, который был использован для сообщения, и он уже не используется для другого сообщения до тех пор, пока подтверждение не будет получено. Из-за того, что некоторые процессы не забрали свои сообщения, связь может быть приостановлена. Если каждое сообщение снабдить пометкой времени, то управляющая программа может периодически уничтожать старые сообщения. Процессы могут быть также остановлены в связи с тем, что другие процессы не смогли послать им сообщения. Если время поступления каждого остановленного процесса в очередь заблокированных процессов регистрируется, то управляющая программа может периодически посылать им пустые сообщения, чтобы они не ждали чересчур долго.
Для двусторонней передачи потоков сообщений, которые не зависят друг от друга, лучше использовать два отдельных однонаправленных почтовых ящика, а не один, содержащий только подтверждения или ответы. Для доставки сообщений в пункты назначения, неизвестные процессам-отправителям, необходимо предоставить специальные средства. Таким пунктом назначения может быть процесс, выдавший команду подвода головки диску, ответ которого не зависит от того, кто выдал эту команду.
Однонаправленная связь между двумя процессами уже рассмотрена достаточно хорошо на примере пары производитель - потребитель. Вообще говоря, произвольную связь можно рассматривать как совместное использование некоторой переменной (почтовый ящик) в сочетании с синхронизацией отправителей и получателей. Те же самые дисциплины, которые применяются для выполнения взаимного исключения и синхронизации, можно непосредственно применить для реализации произвольной связи.
Реализация почтовых ящиков требует использования примитивных операторов низкого уровня, таких как Р и V, но пользователям можно дать средства более высокого уровня. В системе RС4000 для организации связи между процессами используется множество 8-словиых буферов для сообщений, очередь сообщений для каждого процесса, управляемая по дисциплинеFIFO, и следующие четыре операции, которые выполняются в непрерывном режиме:
1. ПОСЛАТЬ СООБЩЕНИЕ (получатель, сообщение, буфер)
2. ЖДАТЬ СООБЩЕНИЕ (отправитель, сообщение, буфер)
3. ПОСЛАТЬ ОТВЕТ (результат, ответ, буфер)
4. ЖДАТЬ ОТВЕТ (результат, ответ, буфер)
ПОСЛАТЬ СООБЩЕНИЕ переписывает сообщение в некоторый буфер, помещает его адрес в переменную буфер и добавляет буфер к очереди получатель. Процесс, выдавший операцию, продолжает исполнение. ЖДАТЬ СООБЩЕНИЕ блокирует процесс, выдавший операцию, до тех пор, пока в его очереди не появится какое-либо сообщение. Когда процесс устанавливается на процессор, он получает имя отправителя в переменной отправитель, текст сообщения - в сообщение и адрес буфера - в буфер. Затем буфер удаляется из очереди и процесс может записать в него ответ отправителю. ПОСЛАТЬ ОТВЕТ записывает ответ в тот буфер, из которого было получено сообщение, и добавляет буфер к очереди отправителя- Если отправитель ждет ответ, он деблокируется.
ЖДАТЬ ОТВЕТ блокирует процесс, выдавший операцию, до тек пор, пока в буфер не поступит ответ. После того как ответ поступил и процесс установлен на процессор, ответ переписывается в память процессу, а буфер освобождается. Результат указывает, является ли ответ пустым, т. е. выданным операционной системой, так как сообщение было адресовано несуществующему процессу. Описанные операции требуют, чтобы процесс обслуживал свою очередь в порядке FIFO и блокировал себя, пока другие процессы обрабатывают его запросы. Чтобы снять эти ограничения, вводятся следующие две операции;
5. ЖДАТЬ СОБЫТИЕ (последний буфер, следующий буфер, результат)
6. ПОЛУЧИТЬ СОБЫТИЕ (буфер)
ЖДАТЬ СОБЫТИЕ блокирует обратившийся процесс, пока событие (сообщение или ответ) не поступит в очередь за переменной последний буфер. После установки процесса на процессор адрес буфера, в который оно поступило, записывается в переменную следующий буфер, а результат сообщает, является событие сообщением или ответом.
ПОЛУЧИТЬ СОБЫТИЕ удаляет буфер из очереди обратившегося процесса: Если оно содержит сообщение, то буфер переводится в состояние, при котором он готов принять ответ. Если оно содержит ответ, то буфер освобождается. Обратившийся процесс должен сам переписать сообщение али ответ к себе в память прежде, чем обращаться к системе.
Система RC 4000 использовала описанные операции для всех связей между процессами, включая синхронизацию и взаимное исключение. Основные достоинства использования буферов сообщений состоят в следующем:
1. Процессу не нужно знать о существовании других процессов до тех пор, пока он не получит сообщения от них,
2. Два процесса могут обмениваться более чем одним сообщением за один раз.
3. Операционная система может гарантировать, что никакой процесс не вмешается в беседу других процессов.
4. Очереди буферов позволяют процессу-отправителю продолжать работу, не обращая внимания на получателя.
Основным недостатком буферизации сообщений является появление еще одного ресурса, которым нужно управлять, а именно - множества буферов.
Очень привлекательной формой однонаправленного почтового ящика является программный канал, существующий в системе UNIX. Это безымянный буфер для данных, производимых одним процессом и используемых другим. Пользователю нужно только указать процессы и последовательность их выполнения. Например, командаIs вызывает процесс, который выводит на терминал имена всех файлов из справочника пользователя- Командаqrep acpt вызывает процесс, который из входной информации выберет строки, содержащие строку “acpt”. Команда we-1 вызовет процесс, И который подсчитает число строк во входной информации. И Использование программного канала указывается с помощью символа “|”. Поэтому
Is | qrep acpt | wс - 1
выведет число файлов из справочника пользователя, имена которых содержат строку “eacpt”. Пользователю не нужно думать о синхронизации и буферизации, они обеспечиваются системой.