Интерфейс, аналогичный файлам
Очереди сообщений похожи на файлы, по крайней мере с точки зрения интерфейса. Очередь сообщений открывается с помощью функции mq_open(), закрывается с помощью функции mq_close(), а уничтожается — mq_unlink(). Для того чтобы записать ("write") данные в очередь сообщений или прочитать ("read") данные из нее, используются функции mq_send() и mq_receive() соответственно.
Для строгого соответствия стандарту POSIX имена очередей сообщений должны начинаться с символа косой черты (/) и больше не содержать других косых черт. Однако в QNX Neutrino данное ограничение снято, и имена путей могут содержать множество косых черт. Это расширяет возможности стандарта POSIX — например, компания может размещать все очереди сообщений под своим именем и таким образом быть более уверенной в том, что имена ее очередей не будут конфликтовать с именами очередей других компаний.
В ОС QNX Neutrino все создаваемые очереди сообщений размещаются в пространстве файловых имен в каталоге /dev/mqueue (табл. 2.15).
Таблица 2.15. Соответствие имен очередей
Имя, задаваемое в функцииmq__open() | Путевое имя очереди сообщений |
/data | /dev/mqueue/data |
/acme/data | /dev/mqueue/acme/data |
/qnx/data | /dev/mqueue/qnx/data |
Функции управления очередями сообщений
Управление очередями сообщений стандарта POSIX выполняется с помощью функций, отраженных в табл. 2.16.
Таблица 2.16. Функции управлений очередями сообщений
Функция | Описание |
mq_open() | Открыть очередь сообщений |
mq_close() | Закрыть очередь сообщений |
mq_unlink() | Удалить очередь сообщений |
mq_send() | Добавить сообщение в очередь сообщений |
mq_receive() | Прочитать сообщение из очереди сообщений |
mq_notify() | Сообщить вызывающему процессу о том, что в очереди имеется сообщение |
mq_setattr() | Установить атрибуты очереди |
mq_getattr() | Получить атрибуты очереди |
Разделяемая память
Разделяемая память (shared memory) обеспечивает максимальную пропускную способность механизма межзадачного взаимодействия. После создания некоторого объекта в разделяемой памяти процессы, имеющие доступ к этому объекту, могут использовать указатели (pointers) для непосредственного чтения или записи данных. Это означает, что доступ к разделяемой памяти, по сути, является несинхронным. Если процесс обновляет содержание некоторой области разделяемой памяти, другой процесс не должен в этот момент обращаться к этой области для чтения или записи данных в нее. Даже в случае простого чтения данных такое действие может быть некорректным, так как процесс может получить неверную или испорченную информацию.
Для решения этой проблемы разделяемая память часто используется в сочетании с одним из примитивов синхронизации, что позволяет процессам обновлять данные атомарно. В качестве примитивов синхронизации для разделяемой памяти подходят как семафоры, так и мьютексы.
Дата добавления: 2017-01-29; просмотров: 568;