Интерфейс, аналогичный файлам

Очереди сообщений похожи на файлы, по крайней мере с точки зрения интерфейса. Очередь сообщений открывается с помощью функции 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; просмотров: 505;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.003 сек.