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

Очереди сообщений

Очереди сообщений (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 — определение числа элементов в очереди.

4

Примеры создания параллельных взаимодействующих вычислительных процессов

В завершение данного раздела рассмотрим учебный пример, в котором ставится задача создания комплекса параллельно выполняющихся взаимодействующих программ. Пример не будет иметь содержательного смысла в том плане, что ни­какой полезной работы программные модули, взаимодействующие между собой, не выполняют. Они только синхронизируют друг друга по предопределенной

схеме, демонстрируя главным образом способы организации взаимодействую­щих вычислений — взаимное исключение при выполнении критических интер­валов, обмены синхросигналами и данными.

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

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

Начнем с более простого случая, когда создается обычное мультитредовое при­ложение, причем воспользуемся не средствами API, а методами, специально соз­данными для системы программирования. Второй пример будет иллюстрировать применение более мощных средств для организации взаимного исключения и обмена сообщениями; здесь будут использованы средства самой ОС.