Операционные системы. Курс лекций

       

Синхронизация передачи сообщений.


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

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

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

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

Передача сообщений может быть реализована по- разному. Можно присвоить каждому из процессов уникальный адрес и адресовать сообщения непосредственно процессом. Другой подход: использование новой структуры данных – почтовый ящик.

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

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

Из- за того что  в системе может быть много почтовых ящиков надо обеспечить доступ процесса к конкретному почтовому ящику. Почтовые ящики

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

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

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



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

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

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


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

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

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

Реализация почтовых ящиков требует использования примитивных операторов низкого уровня таких как SemWait и SemSignal, но пользователям могут дать средства более высокого уровня.

Основные достоинства почтовых ящиков:

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

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

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

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

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

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

 


Содержание раздела