Очереди сообщений
Очереди сообщений (Queue) являются более сложным методом связи между взаимодействующими процессами по сравнению с каналами. С помощью очередей также можно из одной или нескольких задач независимым образом посылать сообщения некоторой задаче-приемнику. При этом только процесс-приемник может читать и удалять сообщения из очереди, а процессы-клиенты имеют право лишь помещать в очередь свои сообщения. Таким образом, очередь работает только в одном направлении. Если же необходима двухсторонняя связь, то можно создать две очереди.
Работа с очередями сообщений имеет много отличий от работы с конвейерами. Во-первых, очереди сообщений предоставляют возможность использовать несколько дисциплин обработки сообщений:
Q FIFO — сообщение, записанное первым, будет первым и прочитано; Q LIFO — сообщение, записанное последним, будет прочитано первым; О приоритетный — сообщения читаются с учетом их приоритетов; Q произвольный доступ, то есть можно читать любое сообщение, тогда как канал обеспечивает только дисциплину FIFO.
Во-вторых, если при чтении сообщения из канала (конвейера) оно удаляется из него, то при чтении сообщения из очереди этого не происходит, и сообщение при желании может быть прочитано несколько раз.
В третьих, в очередях присутствуют не непосредственно сами сообщения, а только их адреса в памяти и размер. Эта информация размещается системой в сегменте памяти, доступном для всех задач, общающихся с помощью данной очереди.
Каждый процесс, использующий очередь, должен предварительно получить разрешение на использование общего сегмента памяти с помощью системных запросов API, ибо очередь — это системный механизм и для работы с ним требуются системные ресурсы и, соответственно, обращение к самой ОС. Во время чтения из очереди задача-приемник пользуется следующей информацией:
Q идентификатор процесса (PID — process ID), который передал сообщение;
Q адрес и длина переданного сообщения;
Q ждать или нет, если очередь пуста;
О приоритет переданного сообщения;
Q номер освобождаемого семафора, когда сообщение передается в очередь.
Наконец, приведем перечень основных функций, управляющих работой очереди (без подробного описания передаваемых параметров), поскольку в различных ОС обращения к этим функциям могут существенно различаться:
Q CreateQueue — создание новой очереди;
О OpenQueue — открытие существующей очереди;
Q ReadQueue — чтение и удаление сообщения из очереди;
Q PeekQueue — чтение сообщения без его последующего удаления из очереди;
Q WriteQueue — добавление сообщения в очередь;
Q CloseQueue — завершение использования очереди;
Q PurgeQueue — удаление из очереди всех сообщений;
Q QueryQueue — определение числа элементов в очереди.
Дата добавления: 2015-01-18 | Просмотры: 621 | Нарушение авторских прав
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
|