Каналы и соединения
В ОС QNX Neutrino сообщения передаются в направлении каналов (channel) и соединений (connection), а не напрямую от потока к потоку. Поток, которому необходимо получить сообщение, сначала создает канал, а другой поток, которому необходимо передать сообщение этому потоку, должен сначала установить соединение, "подключившись" к этому каналу. Каналы требуются для вызовов микроядра, предназначенных для обмена сообщениями (message kernel calls), и используются серверами для приема сообщений с помощью функции MsgRecelve(). Соединения создаются потоками-клиентами для того, чтобы "присоединиться" к каналам, открытым серверами. После того как соединения установлены, клиенты могут передавать по ним сообщения с помощью функции MsgSend(). Если несколько потоков процесса подключается к одному и тому же каналу, тогда для повышения эффективности все эти соединения отображаются в один объект ядра. Каналы и соединения, созданные процессом, обозначаются небольшими целочисленными идентификаторами. Клиентские соединения отображаются непосредственно в дескрипторы файлов.
Приведем функции для каналов и соединений.
Таблица Функции для каналов и соединений
Функция | Описание |
ChannelCreate() | Создать канал для получения сообщений |
ChannelDestroy() | Уничтожить канал |
ConnectAttach() | Создать соединение для передачи сообщений |
ConnectDetach() | Закрыть соединение |
Процесс, выполняемый как сервер, может содержать событийный цикл для получения и обработки сообщений.
Например:
chid = ChannelCreate(flags);
SETIOV(&iov, &msg, sizeof(msg));
for(;;){
rcv_id = MsgReceivev(chid, &iov, parts, &info ) ;
switch( msg.type ) {
/* Обработка сообщения. */
}
MsgReplyv( rcv_d, &iov, rparts ) ;
}
Этот цикл позволяет потоку получать сообщения от любого другого потока, установившего соединение с данным каналом.
С этим каналом связаны три очереди:
· очередь потоков, ожидающих сообщения;
· очередь потоков, которые отправили сообщения, но эти сообщения еще не получены;
· очередь потоков, которые отправили сообщения, и эти сообщения были получены, но ответы на них еще не отправлены.
Ожидающий поток блокируется, если оказывается в любой из этих очередей (т. е, блокируется в состоянии RECEIVE, SEND или REPLY)
Импульсы
Кроме служб синхронизации Send/Receive/Reply, в ОС QNX Neutrino используются неблокирующие сообщения фиксированного размера. Эти сообщения называются импульсами (pulses) и имеют небольшую длину (4 байта данных и 1 байт кода).
|
8 битов
|
рис. 2.17. Импульсы формат
Дата добавления: 2017-01-29; просмотров: 698;