198
бы выполнил системный вызов Recive() прежде, чем Процесс
A выполнил Send().
Модель сообщений QNX более всего напоминает взаимодействие
процессов по принципу рандеву (см. раздел 8.11 части I), описываемую
как:
A!x; ?y
Для взаимодействия процессов необходима "встреча" готовности
одного процесса (Процесса A) передать сообщение и готовности другого
процесса (Процесса B) принять сообщение. При этом для процессов,
участвующих в рандеву, нет необходимости знать о готовности процесса-
корреспондента. Процесс, первым пришедший в точку рандеву, просто
блокируется (SEND- или RECIVE-блокировкой) до готовности процесса-
партнера.
Передача ответа подтверждения не требует, и выполнение вызова
Reply() не приводит к блокировке процесса, выполнившего этот вызов.
При необходимости процесс может посылать сообщения нулевой
длины и/или ответы нулевой длины – такие приемы применяются для
взаимного исключения и синхронизации без обмена данными.
Несколько процессов могут послать сообщения одновременно
одному адресату. В этом случае сообщения могут обрабатываться
(получаться адресатом) либо в порядке их поступления, либо в
соответствии с приоритетами отправителей.
Еще один вызов микроядра – Crecive() – позволяет процессу
проверить наличие сообщений для него и, таким образом, избежать
RECIVE-блокировки.
Интересно, что, используя механизм сообщений-рандеву, библиотеки
системных вызовов QNX обеспечивают интерфейсы других стандартных
средств взаимодействия процессов, таких как программные каналы или
семафоры.