Очереди (queues) сообщений предлагают более удобный метод связи между взаимодействующими процессами по сравнению с каналами, но в своей реализации они сложнее. С помощью очередей также можно из одной или нескольких задач независимым образом посылать сообщения некоторой задаче-приемнику. При этом только процесс-приемник может читать и удалять сообщения из очереди, а про-
Конвейеры и очереди сообщений_______________________________________ 245
цессы-клиенты имеют право лишь помещать в очередь свои сообщения. Таким образом, очередь работает только в одном направлении. Если же необходима двухсторонняя связь, то можно создать две очереди.
Работа с очередями сообщений отличается от работы с конвейерами. Во-первых, очереди сообщений предоставляют возможность использовать несколько дисциплин обработки сообщений:
- FIFO — сообщение, записанное первым, будет первым и прочитано; - LIFO — сообщение, записанное последним, будет прочитано первым; - приоритетный доступ — сообщения читаются с учетом их приоритетов;
- произвольный доступ — сообщения читаются в произвольном порядке. Тогда как канал обеспечивает только дисциплину FIFO.
Во-вторых, если при чтении сообщения оно удаляется из конвейера, то при чтении сообщения из очереди этого не происходит, и сообщение при желании может быть прочитано несколько раз.
В-третьих, в очередях присутствуют не непосредственно сами сообщения, а только их адреса в памяти и размер. Эта информация размещается системой в сегменте памяти, доступном для всех задач, общающихся с помощью данной очереди.
Каждый процесс, использующий очередь, должен предварительно получить разрешение на доступ в общий сегмент памяти с помощью системных запросов API, ибо очередь — это системный механизм, и для работы с ним требуются системные ресурсы и, соответственно, обращение к самой ОС. Во время чтения из очереди задача-приемник пользуется следующей информацией:
- идентификатор процесса (Process Identifier, PID), который передал сообщение; - адрес и длина переданного сообщения;
- признак необходимости ждать, если очередь пуста;
- приоритет переданного сообщения;
- номер освобождаемого семафора, когда сообщение передается в очередь.
Наконец, приведем перечень основных функций, управляющих работой очереди (без подробного описания передаваемых параметров, поскольку в различных ОС обращения к этим функциям могут существенно различаться):
- CreateQueue — создание новой очереди;
- OpenQueue — открытие существующей очереди;
- ReadQueue — чтение и удаление сообщения из очереди;
- PeekQueue — чтение сообщения без его последующего удаления из очереди;
- WriteQueue — добавление сообщения в очередь;
- CloseQueue — завершение использования очереди; - PurgeQueue — удаление из очереди всех сообщений;
- QueryQueue — определение числа элементов в очереди.
246________ Глава 7. Организация параллельных взаимодействующих вычислений
Контрольные вопросы и задачи
1. Какие последовательные вычислительные процессы мы называем параллель ными и почему? Какие параллельные процессы называются независимыми, а какие — взаимодействующими?
2. Изложите алгоритм Деккера, позволяющий разрешить проблему взаимного исключения путем использования одной только блокировки памяти.
3. Объясните, как действует команда проверки и установки. Расскажите о рабо те команд BTS и BTR, которые имеются в процессорах с архитектурой ia32.
4. Расскажите о семафорах Дейкстры. Чем обеспечивается взаимное исключе ние при выполнении примитивов Р и V?
5. Изложите, как могут быть реализованы семафорные примитивы для мульти процессорной системы?
6. Что такое мьютекс?
7. Изложите алгоритм решения задачи «поставщик-потребитель» при исполь зовании семафоров Дейкстры.
8. Изложите алгоритм решения задачи «читатели-писатели» при использова нии семафоров Дейкстры.
9. Что такое «монитор Хоара»? Приведите пример такого монитора.
10. Что представляют собой почтовые ящики?
11. Что представляют собой конвейеры (программные каналы)?
12. Что представляют собой очереди сообщений? Чем отличаются очереди сооб щений от почтовых ящиков?