Очереди сообщений являются более сложным методом связи между взаимодействующими процессами по сравнению с каналами. С помощью очередей можно из одной или нескольких задач независимым образом посылать сообщения некоторой задаче-приемнику. При этом только процесс-приемник может читать и удалять сообщения из очереди, а процессы-клиенты имеют право лишь помещать в очередь свои сообщения. Таким образом, очередь работает только в одном направлении. Если необходима двусторонняя связь, то создаются две очереди.
Работа с очередями сообщений имеет много отличий от работы с конвейерами:
1) Очереди сообщений представляют возможность использовать несколько дисциплин обработки сообщений:
• FIFO – сообщение, записанное первым, будет первым прочитано;
• LIFO – сообщение, записанное последним, будет прочитано первым;
• приоритетный – сообщения читаются с учетом их приоритетов;
• произвольный доступ, т.е. можно читать любое сообщение, тогда как канал обеспечивает только дисциплину FIFO.
2) Если при чтении сообщения из канала (конвейера) оно удаляется из него, то при чтении сообщения из очереди этого не происходит, и при желании сообщение можно прочитать несколько раз.
3) В очередях присутствуют не непосредственно сами сообщения, а только их адреса в памяти и размер. Эта информация размещается системой в сегменте памяти, доступном для всех задач, общающихся с помощью данной очереди.
Каждый процесс, использующий очередь, должен предварительно получить разрешение на использование общего сегмента памяти с помощью системных запросов API, т.к. очередь – это системный механизм и для работы с ним требуются системные ресурсы и обращение к ОС.
Очереди сообщений
05 Мар, 2009
