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

UptoLike

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

41
щения предопределенного формата. Для этого в сообщении выделяется
заголовок (обычно длиной 12 байт), который содержит сведения о том, что
находится внутри сообщения. Например, подобный заголовок автоматиче-
ски добавляет системный вызов write() библиотеки языка Си. Компонент
операционной системы должен уметь сначала прочитать заголовок, а затем
в зависимости от полученной информации принять решение о том, как по-
ступить с остальными частями сообщения. В QNX Neutrino для этой цели
реализовано несколько дополнительных функций, представленных в табл.
3.4.
Таблица 3.4
Для векторных сообщений Для одиночных сообщений
MsgReadv() MsgRead()
MsgWritev() MsgWrite()
Эти функции имеют дополнительный аргумент offset (смещение) и ис-
пользуются следующим образом:
1. Клиент передает полное сообщение, имеющее заголовок.
2. Сначала сервер принимает сообщение с помощью MsgReceive(),
при этом длина приемного буфера устанавливается равной размеру пере-
даваемого заголовка.
3. Клиент переходит в Reply-блокированное состояние, а сервер тем
временем анализирует заголовок сообщения. Заголовок содержит инфор-
мацию о размещении составных частей сообщения.
4. Сервер считывает сообщение с помощью нескольких вызовов функ-
ции MsgRead(), в качестве аргументов функции указывается идентификатор
отправителя полученного сообщения (возвращаемый функцией
MsgReceive()), адрес и размер буфера, в который следует записать полу-
ченные данные, и смещение offset, с которого надо начинать считывать
данные из буфера клиента. Клиент все это время остается Reply-
блокированным.
5. Сервер подготавливает ответное сообщение. Он может его отпра-
вить единовременно, вызвав MsgReply(), или может записать ответ пор-
циями в буфер клиента, используя вызов MsgWrite() и смещения offset. Но в
этом случае, записав данные, сервер должен для разблокировки клиента
обязательно вызвать MsgReply() или MsgError() с нулевым размером буфе-
ра.