Хмм. Получается, что функции
Вероятно, вы уже подозревали, что все варианты функций
Которые из этих функций следует применять? В общем-то вопрос этот является чисто философским. Что до меня лично, то я предпочитаю комбинировать.
Если мы посылаем или принимаем только одноэлементные сообщения, то зачем нам все эти проблемы с настройкой векторов IOV?
Накладные расходы (кстати, незначительные) по загрузке процессора обычно не зависят от того, настраиваете ли вы все сами или оставляете это ядру или библиотеке. Подход с использованием одноэлементных сообщений избавляет ядро от необходимости манипуляций с адресным пространством и поэтому работает несколько быстрее.
Следует ли вам применять функции, использующие IOV? Конечно! Используйте их всегда, когда вам приходится самостоятельно программировать обмен многоэлементными сообщениями.
Сообщения типа «импульс» (pulse)
Все сообщения, которые мы обсуждали до настоящего времени, блокируют клиента. Как только клиент вызывает функцию
Однако есть ситуации, где отправитель сообщения не может себе позволить блокироваться. Мы рассмотрим некоторые из них в главах «Прерывания» и «Часы, таймеры и периодические уведомления», а сейчас мы должны понять концепцию данной проблемы.
Механизм, который обеспечивает отправку сообщения без блокирования, называют «импульсом» (pulse). Импульс — это миниатюрное сообщение, которое:
• может перенести 40 бит полезной информации (8-битный код и 32 бита данных);
• является неблокирующим для отправителя;
• может быть получено точно так же, как и сообщение другого типа;
• ставится в очередь, если получатель не заблокирован в ожидании сообщения.
Прием импульса
Прием импульса выполняется очень просто: короткое, четко определенное сообщение передается функции
Единственно что забавляет при работе с импульсами — это то, что идентификатор отправителя, который возвращается функцией
#include
rcvid = MsgReceive(chid, ...);
if (rcvid == 0) { // Это импульс
// Определить тип импульса
// Обработать его
} else { // Это обычное сообщение
// Определить тип сообщения
// Обработать его
}
Итак, вы принимаете сообщение с нулевым идентификатором отправителя. Что у него внутри? Вот фрагмент заголовочного файла
:
struct _pulse {
_uint16 type;
_uint16 subtype;
_int8 code;
_uint8 zero[3];
union sigval value;
_int32 scoid;
};