Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основы построения операционных систем.doc
Скачиваний:
50
Добавлен:
07.11.2018
Размер:
5.07 Mб
Скачать

4.2.7. Передача сообщений

Взаимодействие между процессами при реализации взаимного исключения и семафоров осуществляется посредством обмена временными сигналами. Более тесное взаимодействие требует специальных средств связи, которые обеспечивают передачу и получение произвольных данных. Примерами последних служат данные, предназначенные для вывода на устройства построчной печати, запросы состояний (особенно устройств ввода-вывода) и даже почта от одного интерактивного пользователя к другому. В контексте связи между процессами все это называется сообщениями. В системе с одним процессором посылающий и пол­учающий процессы не могут работать одновременно. В мультипроцессорных системах также нет никакой гарантии их одновременного исполнения. Следовательно, для хранения посланного, но еще не полученного сообщения необходимо место. Формально оно называется буфером сообщений, неформально - почтовым ящиком. Если объем передаваемых д­анных велик, то эффективнее не передавать их непосредственно, а отправлять в почтовый ящик сообщение, информирующее процесс-получатель о том, где можно их найти.

Почтовый ящик может быть связан с парой процессов, только с отправителем, только с получателем, или его можно получить из множества почтовых ящиков, которые использ­уют все или несколько процессов. Если почтовый ящик не связан с процессами, то сообщение должно содержать идентификаторы и процесса-отправителя, и процесса-получателя. Почтовый ящик, связанный с процессом-получателем, облегчает посылку сообщений от нескольких процессов в фиксированный пункт назначения. Если используется множество почтовых ящиков, то каждый из них хранит либо сообщение, либо подтверждение. Чтобы гарантировать передачу подтверждений, когда все почтовые ящики заняты, по­дтверждение на сообщение помещается в тот же почтовый ящик, который был использован для сообщения, и он уже не используется для другого сообщения до тех пор, пока подтверждение не будет получено. Из-за того, что некоторые проц­ессы не забрали свои сообщения, связь может быть приостановлена. Если каждое сообщение снабдить пометкой времени, то управляющая программа может периодически уничтожать старые сообщения. Процессы могут быть также остановлены в связи с тем, что другие процессы не смогли послать им сообщения. Если время поступления каждого остановленного процесса в очередь заблокированных проц­ессов регистрируется, то управляющая программа может периодически посылать им пустые сообщения, чтобы они не ждали чересчур долго.

Реализация почтовых ящиков требует использования пр­имитивных операторов низкого уровня, таких как Р и V, но пользователям можно дать средства более высокого уровня. Для организации связи между процессами используется множество 8-словных буферов для сообщений, очередь сообщений для каждого процесса, управляемая по дисциплине FIFO (первый пришел - первый обслужен), и следующие четыре операции, которые выполняются в непрерывном режиме:

1. Послать сообщение (получатель, сообщение, буфер)

2. Ждать сообщение (отправитель, сообщение, буфер)

3. Послать ответ (результат, ответ, буфер)

4. Ждать ответ (результат, ответ, буфер).

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

Ждать сообщение блокирует процесс, выдавший операцию, до тех пор, пока в его очереди не появится какое-либо сообщение. Когда процесс устанавливается на процессор, он получает имя отправителя в переменной отправитель, текст сообщения - в сообщение и адрес буфера - в буфер. Затем буфер удаляется из очереди и процесс может записать в него ответ отправителю.

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

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

Описанные операции требуют, чтобы процесс обслуживал свою очередь в порядке FIFO и блокировал себя, пока другие процессы обрабатывают его запросы. Чтобы снять эти ограничения, вводятся следующие две операции:

5. Ждать событие (последний буфер, следующий буфер, результат)

6. Получить событие (буфер)

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

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

Основные достоинства использования буферов сообщений состоят в следующем:

1. Процессу не нужно знать о существовании других процессов до тех пор, пока он не получит сообщения от них.

2. Два процесса могут обмениваться более чем одн­им сообщением за один раз.

3. Операционная система может гарантировать, что никакой процесс не вмешается в беседу других процессов.

4. Очереди буферов позволяют процессу-отправителю продолжать работу, не обращая внимания на получателя.

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