Тесное взаимодействие между процессами предполагает не только синхронизацию – обмен временными сигналами, но и передачу, и получение произвольных данных – обмен сообщениями. В системе с одним процессором посылающий и получающий процессы не могут работать одновременно. В мультипроцессорных системах также нет гарантии их одновременного исполнения. следовательно, для хранения посланного, но еще не полученного сообщения необходимо место, оно называется буфером сообщений или почтовым ящиком.
Если процесс1 хочет общаться с процессом1, то процесс1 просит систему образовать или предоставить ему почтовый ящик, который свяжет эти два процесса так, чтобы они могли передавать друг другу сообщения. Для того чтобы послать процессу2 сообщение, процесс1 помещает это сообщение в почтовый ящик, откуда процесс2 может взять его в любое время. При применении почтового ящика процесс2 получит сообщение, когда обратится за ним, процесс2 должен знать о существовании почтового ящика. Т.к. в системе может быть много почтовых ящиков, необходимо обеспечить доступ процессу к конкретному почтовому ящику. Почтовые ящики являются системными объектами, и для пользования ими необходимо получить его у ОС с помощью запросов.
Если объем передаваемых данных велик, то эффективнее не передавать их, а отправлять в почтовый ящик сообщение, информирующее процесс-получатель о том, где их найти.
Почтовый ящик может быть связан с парой процессов, только с отправителем, только с получателем, или сообщение можно получить из множества почтовых ящиков, которые используют все или несколько процессов. Почтовый ящик, связанный с процессом-получателем, облегчает посылку сообщений от нескольких процессов в фиксированный пункт назначения. Если почтовый ящик не связан жестко с процессами, то сообщение должно содержать идентификаторы и процесса-отправителя, и процесса-получателя.
Таким образом, почтовый ящик – это информационная структура, поддерживаемая ОС. Она состоит из головного элемента, в котором находится информация о данном почтовом ящике, и из нескольких буферов (гнезд), в которые помещают сообщения. Размер каждого буфера и их количество обычно задаются при образовании почтового ящика.
Правила работы почтового ящика могут быть различными в зависимости от его сложности: однонаправленные, двунаправленные и многовходовые почтовые ящики.
Однонаправленные: процесс1 может посылать сообщения до тех пор, пока имеются свободные гнезда. Если все гнезда заполнены, то процесс1 может либо ждать, либо заняться другими делами и попытаться послать сообщение позже. Аналогично процесс2 может получать сообщения до тех пор, пока имеются заполненные гнезда. Если сообщений нет, то он может либо ждать сообщений, либо продолжать свою работу.
Двунаправленный почтовый ящик, связанный с парой процессов, позволяет подтверждать прием сообщений. Если используется множество гнезд, то каждое из них хранит либо сообщение, либо подтверждение. Чтобы гарантировать передачу подтверждений, когда все гнезда заняты, подтверждение на сообщение помещается в то же гнездо, которое было использовано для сообщения, и оно используется для другого сообщения до тех пор, пока подтверждение не будет получено. Из-за того, что некоторые процессы не забрали свои сообщения, связь может быть приостановлена. Если каждое сообщение снабдить пометкой времени, то управляющая программа может периодически уничтожать старые события.
К достоинствам почтовых ящиков можно отнести:
• процессу не нужно знать о существовании других процессов до тех пор, пока он не получит сообщение от них;
• два процесса могут обмениваться более чем одним сообщением за раз;
• ОС гарантирует, что никакой процесс не вмешивается в работу других процессов;
• Очереди буферов позволяют процессу-отправителю продолжать работу, не обращая внимания на получателя.
Основным недостатком буферизации сообщений является появление еще одного ресурса, которым нужно управлять, самого почтового ящика. Другим недостатком является то, что количество буферов для передачи сообщений через почтовый ящик фиксировано.
Почтовые ящики
05 Мар, 2009
