Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Почтовые ящики



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

Если процесс Р1 хочет общаться с процессом Р2, то Р1 просит ОС образовать почтовый ящик, который свяжет эти два процесса так, чтобы они могли передавать друг другу сообщения. Для того чтобы послать процессу Р2 какое-то сообщение, процесс Р1 просто помещает это сообщение в почтовый ящик, откуда процесс Р2 может его взять в любое время. При использовании почтового ящика процесс Р2 в конце концов обязательно получит сообщение, когда обратится за ним.

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

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

Почтовый ящик – это информационная структура, поддерживаемая ОС. Она состоит из головного элемента (заголовка), в котором находится информация о характеристиках почтового ящика, и из нескольких буферов (гн¨зд), в которые помещаются сообщения. Размер каждого гнезда и количество гн¨зд обычно задаются при образовании почтового ящика.

Правила работы почтовых ящиков могут разные в зависимости от их сложности. В простейшем случае сообщения передаются только в одном направлении. Процесс Р1 может посылать сообщения до тех пор, пока имеются свободные гн¨зда. Если все гн¨зда заполнены, то процесс Р1 вынужден ждать когда хотя бы одно из гн¨зд освободится. Аналогично, процесс Р2 может получать сообщения до тех пор, пока имеются заполненные гн¨зда. Если сообщений нет в почтовом ящике, Р2 будет ждать их появлений. Такие почтовые ящики называются однонаправленными. Реализацией однонаправленного почтового ящика является решение задачи “Поставщик-Потребитель”.

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

При реализации почтовых ящиков используются низкоуровневые средства, например - семафорные примитивы и т. п.

Рассмотрим интерфейс операций с двунаправленным почтовым ящиком, которые могут использовать процессы при сво¨м взаимодействии:

  1. Send_message (receiver, message, buffer) – посылка сообщения (message) получателю (receiver) через почтовый ящик (buffer). Процесс, выдавший данную операцию, продолжает сво¨ выполнение.
  2. Wait_message (sender, message, buffer) – процесс, выдавший данную операцию жд¨т до тех пор, пока в почтовом ящике не появится сообщение от отправителя (sender) и не перепишется в собственную память получателя (message).
  3. Send_answer (result, answer, buffer) – записывает ответ (answer) в тот буфер, в который было записано сообщение.
  4. Wait_answer (result, answer, buffer) – блокирует процесс, выдавший данную операцию до тех пор, пока в почтовом ящике не появится ответ и не перепишется в собственную память процесса (answer). Значение переменной result определяет, каков ответ: от процесса получателя или пустой от ОС.

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





Дата публикования: 2014-12-08; Прочитано: 322 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.007 с)...