Очереди сообщений устарели в Linux? - PullRequest
63 голосов
/ 09 июня 2009

Я недавно играл с очередями сообщений (System V, но с POSIX тоже должно быть в порядке) в Linux, и они кажутся идеальными для моего приложения, но после прочтения Искусства программирования Unix я не уверен, действительно ли они хороший выбор.

http://www.faqs.org/docs/artu/ch07s02.html#id2922148

Верхний уровень передачи сообщений в System V IPC в значительной степени вышел из употребления. Нижний уровень, который состоит из разделяемой памяти и семафоров, по-прежнему имеет важные приложения в условиях, когда необходимо выполнить взаимную исключающую блокировку и некоторый глобальный обмен данными между процессами, работающими на той же машине. Эти средства общей памяти System V превратились в API разделяемой памяти POSIX, поддерживаемые в Linux, BSD, MacOS X и Windows, но не в классической MacOS.

http://www.faqs.org/docs/artu/ch07s03.html#id2923376

Средства System V IPC присутствуют в Linux и других современных Unixes. Однако, поскольку они являются устаревшей функцией, они выполняются не очень часто. В версии для Linux все еще есть ошибки на середину 2003 года. Кажется, никто не заботится о том, чтобы их починить.

Не исправлены ли очереди сообщений System V в более поздних версиях Linux? Я не уверен, если автор имеет в виду, что очереди сообщений POSIX должны быть в порядке?

Кажется, что сокеты являются предпочтительным IPC почти для всего (?), Но я не понимаю, как было бы очень просто реализовать очереди сообщений с сокетами или что-то еще. Или я слишком сложное мышление?

Не знаю, уместно ли, что я работаю со встроенным Linux?

Ответы [ 4 ]

71 голосов
/ 09 июня 2009

Лично я очень люблю очереди сообщений и думаю, что они, возможно, являются наиболее недоиспользуемым IPC в мире Unix. Они быстрые и простые в использовании.

Пара мыслей:

  • Отчасти это просто мода. Старые вещи снова становятся новыми. Добавьте блестящих друзей в очереди сообщений, и они могут быть самыми новыми и горячими вещами следующего года. Посмотрите на Google Chrome, используя отдельные процессы вместо потоков для его вкладок. Внезапно люди приходят в восторг от того, что когда одна вкладка блокируется, она не отключает весь браузер.

  • В общей памяти есть что-то вроде ореола He-человека. Вы не «настоящий» программист, если вы не выдавливаете последний цикл из машины, а MQ немного менее эффективны. Для многих, если не для большинства приложений, это полная чушь, но иногда трудно сломать мышление, как только оно овладевает.

  • MQ действительно не подходят для приложений с неограниченными данными. Потоково-ориентированные механизмы, такие как трубы или розетки, просто для этого проще использовать.

  • Варианты System V действительно потеряли свою популярность. Как правило, используйте POSIX-версии IPC, когда можете.

13 голосов
/ 09 июня 2009

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

Linux позволяет вам монтировать очереди сообщений posix в виде файловой системы и видеть их с помощью «ls», удалять их с помощью «rm», что тоже очень удобно (System V зависит от неуклюжих команд «ipcs» и «ipcrm»)

12 голосов
/ 09 июня 2009

Я на самом деле не использовал очереди сообщений POSIX, потому что я всегда хочу оставить открытой возможность распространять свои сообщения по сети. Имея это в виду, вы можете взглянуть на более надежный интерфейс передачи сообщений, такой как zeromq или что-то, что реализует AMQP .

Одна из приятных особенностей 0mq состоит в том, что при использовании из одного и того же пространства процесса в многопоточном приложении используется довольно быстрый механизм нулевого копирования без блокировки. Тем не менее, вы также можете использовать тот же интерфейс для передачи сообщений по сети.

4 голосов
/ 08 июня 2017

Крупнейшие недостатки очереди сообщений POSIX:

  • Очередь сообщений POSIX не предъявляет требования для совместимости с select(). (В Linux она работает с select(), но не в системе Qnx)
  • Есть сюрпризы.

Сокет Unix Datagram выполняет ту же задачу, что и очередь сообщений POSIX. И сокет Unix Datagram работает на уровне сокетов. Можно использовать его с select() / poll() или другими методами IO-wait. Использование select() / poll() имеет преимущество при разработке основанной на событиях системы. Таким образом можно избежать занятого цикла.

В очереди сообщений есть сюрприз. Подумайте о mq_notify(). Используется для получения receive-event. Похоже, мы можем что-то уведомить об очереди сообщений. Но на самом деле он регистрируется для уведомления, а не для уведомления.

Еще большее удивление в отношении mq_notify() заключается в том, что он должен вызываться после каждого mq_receive(), что может вызвать состояние гонки (когда какой-то другой процесс / поток вызывает mq_send() между вызовами mq_receive() и mq_notify()).

И у него есть целый набор mq_open, mq_send(), mq_receive() and mq_close() со своим собственным определением, которое является избыточным и в некоторых случаях несовместимым со спецификацией метода сокета open(),send(),recv() and close().

Я не думаю, что очередь сообщений должна использоваться для синхронизации. eventfd и signalfd подходят для этого.

Но it (очередь сообщений POSIX) имеет некоторую поддержку в реальном времени . Имеет приоритетные функции.

Messages are placed on the queue in decreasing order of priority, with newer messages of the same priority being placed after older messages with the same priority.

Но этот приоритет также доступен для сокета как внеполосных данных!

Наконец, для меня очередь сообщений POSIX является устаревшим API. Я всегда предпочитаю сокет Unix Datagram вместо очереди сообщений POSIX, если функции реального времени не нужны.

...