POSIX Message Queue проходит через пространство ядра? - PullRequest
6 голосов
/ 30 марта 2011

Я хочу использовать очереди сообщений POSIX в однопотоковом многопоточном приложении.mqueues будет использоваться для обмена данными между потоками.

Я немного запутался в том, как они работают в ядре Linux.Все ли сообщения проходят через пространство ядра и затем возвращаются в пространство пользователя на приеме?ака из потока пользовательского пространства я делаю mq_send, и сообщение заканчивается в пространстве ядра, а затем при получении это еще один системный вызов для получения сообщения из пространства ядра.Если это так, не слишком ли это неэффективно для очередей с интенсивным использованием сообщений?

Ответы [ 2 ]

7 голосов
/ 30 марта 2011

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

Если вы хотите что-то с большим количеством функций, вам почти наверняка лучше смотреть что-то вроде AMQP.

Традиционно Unix / Linux использует сокеты+ чтение / запись вместо этого, но это зависит от того, что вы хотите (и как вы хотите его использовать).

5 голосов
/ 30 марта 2011

Ну, я должен возразить, что MQ "очень" неэффективны.

Это правда, что при копировании данных в / из ядра возникают некоторые накладные расходы, и для действительно высокопроизводительных приложений это может быть реальным соображением и причиной вместо этого использовать разделяемую или кучную память.

Но, если не считать хорошо написанного кода с общей памятью, MQ являются самыми быстрыми IPC и оснащены существенными встроенными средствами. Устранены проблемы с синхронизацией, и (по крайней мере, под Linux) дескриптор очереди сообщений (mqd_t) может использоваться в качестве дескриптора файла в операторе select (). Это обеспечивает значительную гибкость при выполнении чего-либо, кроме ожидания мьютекса или постоянного опроса. Кроме того, MQ сохраняются в ядре, и это хорошая небольшая функция, если важно, чтобы данные очереди переживали сбой приложения.

...