Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
vovk.doc
Скачиваний:
0
Добавлен:
27.12.2019
Размер:
456.19 Кб
Скачать

38. Складені повідомлення та механізм iov.

Механизм IOV(Input Output Vector) , или «вектор ввода/вывода» - фактически это метод при котором ядро выполняет операцию фрагментации/дефрагментацин сообщения.

То есть мы сообщаем ему о том, что одна часть данных (заголовок) фиксирована по некоторому адресу, а другая часть (собственно данные) фиксирована где-нибудь еще, без необходимости самим вручную собирать буферы из частей и копировать данные.

Для формирования сообщения используется массив структур типа iov_t, которые состоят из 2х полей- ссылки на начало буфера и значения длинны данных в этом буфере.

Заполняется эта структура макросом SЕTIOV(укзатель на вектор, адрес буфера, длина данных)

Такую пересылку сообщений выполняет функция MsgSendv(coid, siov, sparts, riov, rparts), где

сoid- идентификатор соединения, по которому мы передаем — как и при использовании функции MsgSend().

sparts и rparts - число пересылаемых и принимаемых частей.

siov и riov – эти массивы значений указывают на пары «адрес — длина», которые мы хотим передать.

Прием таких сообщений можно осуществлять с помощью функции MsgReceivev(chid,iov,parts,msg_info)

Chid – идентификатор канала

iov - вектор приемник

parts - количество фрагментов в сообщении

При выполнении MsgSendv() ядро просто прозрачно копирует данные из каждой части вектора IOV из адресного пространства клиента в адресное пространство сервера (и обратно, при ответе на сообщение).

Число фрагментов ограничено значением 231;

Ядро просто копирует данные, указанные вектором IOV, из одного адресного пространства в другое.

Вектор-источник и вектор-приемник не должны совпадать.

39. Повідомлення за типом “імпульс”. Передача та прийом імпульсу.

Импульс это механизм, который обеспечивает отправку сообщения без блокирования отправителя. Это маленькое сообщение (16 байт) которое:

- может перенести 40 бит полезной информации (32 бита данных + 8 бит кода импульса);

- является неблокируемым для отправителя;

- может быть получено точно так же, как и сообщение другого типа;

- ставиться в очередь, если получатель не заблокирован в ожидании сообщения.

Прием импульса выполняется очень просто: короткое, четко определенное сообщение передается функции MsgReceive(), как будто поток отправил обычное стандартное сообщение. Единственное различие состоит в невозможности применить функцию MsgReply() к такому сообщению, поскольку, общая идея импульса состоит в том, что это сообщение по своей сути является асинхронным. Идентификатор отправителя, который возвращается функцией MsgReceive() при приеме импулься, имеет нулевое значение. Это верный индикатор того, что принятое сообщение является импульсом, а не стандартным сообщением клиента.

Пример:

rcvid = MsgReceive(…)

if (rcvid == 0) {

код, обработка}

Функция MsgReceive() может принимать как обычные сообщения, так и импульсы, но если нужно принимать только импульсы, то нужно использовать функцию MsgReceivePulse (), клиент в свою очередь должен использовать вызов MsgSendPulse().

С помощью механизма импульсов можно реализовать процесс запуска некоторого сервера, который имеет пул потоков, способных обрабатывать запросы от клиентов, т.к. при вызове MsgReceive() гарантирует, что никакой клиентский запрос не просочиться, пока не придет импульс, означающий команду начать работу.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]