Синхронизация и взаимодействие программных потоков в операционной среде реального времени. Дорогов А.Ю. - 51 стр.

UptoLike

Составители: 

51
уровне иерархии. При этом передачи MsgSend() будут направлены от кли-
ента нижнего уровня к серверу верхнего уровня, а ответы на сообщения бу-
дут иметь встречное направление.
Однако существуют ситуации, ко-
гда приходится нарушать естествен-
ное направление передач, например,
когда для формирования ответа сер-
веру требуется значительное время,
а клиент, пославший сообщение, не
может позволить себе блокироваться
на длительное время из-за опасности
потери событий.
Такому клиенту необходимо,
чтобы сервер ответил сразу чем-то вроде «заказ принят». Получив такой
«формальный ответ», клиент способен продолжать работу, а тем временем
сервер отрабатывает запрос и после выполнения «заказа» должен как-то
сказать клиенту, что «заказ выполнен». Использовать MsgSend() сервер не
может из-за опасности взаимной блокировки. Для разрешения подобной си-
туации эффективно используется механизм доставки событий с помощью
системного вызова MsgDeliverEvent(). Эта составная операция работает
следующим образом (рис. 3.6).
1. Клиент создает структуру типа struct sigevent, в которой указывает,
какое уведомление о завершении работы сервером он желает получить.
2. Клиент посылает сообщение, которое содержит структуру sigevent
(как заголовок) и данные для обработки сервером.
3. Сервер принимает сообщение, сохраняет структуру sigevent и иден-
тификатор отправителя rcvd и немедленно отвечает клиенту.
4. Теперь клиент деблокирован и выполняетсятак же как и сервер.
Когда сервер завершает работу, он использует функцию
MsgDeliverEvent(), чтобы сообщить об этом клиенту.
Функция доставки события имеет следующий синтаксис:
int MsgDeliverEvent( int rcvd, // идентификатор отправителя
const struct sigevent* event ); // уведомление о событии
A
B C
D E F
MsgSend()
MsgSend()
MsgSend()
Рис. 3.5
Server
MsgSend
MsgReply
MsgDeliverEvent
Client
sigevent
Рис. 3.6