Копирование сообщений
Поскольку службы обмена сообщениями в ОС QNX Neutrino копируют сообщение прямо из адресного пространства одного потока в адресное пространство другого потока без помощи буфера, скорость обмена сообщениями определяется производительностью памяти в используемом оборудовании.
Примитивы обмена сообщениями поддерживают составную (multipart) передачу данных, поэтому буфер не обязательно должен быть сплошным. Вместо этого оба потока (поток-отправитель и поток-получатель) могут задавать таблицу-вектор (vector table), которая указывает на место расположения фрагментов сообщений. Следует иметь в виду, что размер части сообщения может быть разным для отправителя и получателя. Составная передача позволяет пересылать сообщения, в которых заголовок отделен от тела, без затрат на копирование данных для получения сплошного сообщения. Кроме того, если исходная структура данных построена на основе кольцевого буфера, формирование трехчастного сообщения позволяет передавать заголовок и две части, размещенные в кольцевом буфере, в виде одного атомарного сообщения.
Простые сообщения
Для передачи простых одночастных сообщений в ОС QNX Neutrino используются функции, которым передается указатель непосредственно на буфер без помощи вектора ввода/вывода (IOV). В этом случае количество частей заменяется на размер сообщения. Например, в примитиве передачи сообщений (для которого требуется буфер передачи и буфер ответа), используются следующие четыре функции.
Таблица Функции примитива передачи сообщений
Функция | Передача | Прием |
MsgSend() | Указатель на буфер | Указатель на буфер |
MsgSendsv() | Указатель на буфер | IOV |
MsgSendvs() | IOV | Указатель на буфер |
MsgSendv() | IOV | IOV |
В названиях других примитивов передачи сообщений, которые принимают указатель на буфер, последняя буква "v" опускается.
Таблица Примитивы передачи сообщений, принимающие указатель на буфер
IOV | Указатель на буфер |
MsgReceivev() | MsgReceive() |
MsgReceivePulsev() | MsgReceivePulse() |
MsgReplyv() | MsgRepty() |
MsgReedv() | MsgRead() |
MsgWritev() | MsgWrite() |
Дата добавления: 2017-01-29; просмотров: 778;