消息队列在linux中是否过时?
我最近在Linux上一直在玩消息队列(System V,但是POSIX应该也可以),而且对于我的应用程序来说它们看起来非常完美,但是在阅读了Unix编程的艺术之后,我不确定它们是否真的是一个好select。
http://www.faqs.org/docs/artu/ch07s02.html#id2922148
System V IPC的高层消息传递层已经基本没有使用。 由共享内存和信号量组成的较低层在需要在同一机器上运行的进程之间进行互斥locking和一些全局数据共享的情况下仍然具有重要的应用。 这些System V共享内存设备演变成POSIX共享内存API,在Linux,BSD,MacOS X和Windows下支持,但不是经典的MacOS。
http://www.faqs.org/docs/artu/ch07s03.html#id2923376
System V IPC设施存在于Linux和其他现代Unix中。 但是,由于它们是遗留function,所以不经常使用。 到2003年中,Linux版本仍然存在漏洞。 似乎没有人愿意解决这些问题。
在更新的Linux版本中,System V消息队列仍然是错误的? 我不确定作者是否意味着POSIX消息队列应该正常?
似乎socket是几乎所有东西(?)的首选IPC,但我不明白用socket或其他方法实现消息队列将会如何简单。 还是我想太复杂?
我不知道是否与embedded式Linux相关?
就我个人而言,我非常喜欢消息队列,认为它们可以说是unix世界中利用率最低的IPC。 它们快速且易于使用。
一些想法:
-
其中一些只是时尚。 旧的东西又变新了。 在消息队列中添加一个shiny的父亲,他们可能是明年的最新和最热门的事情。 使用单独的进程查看Google的Chrome,而不是使用其选项卡的线程。 突然间,人们感到兴奋的是,当一个标签被locking时,并不会导致整个浏览器。
-
共享记忆有一些他人的光环。 如果你没有把最后一个周期从机器中挤出来,并且MQ的效率稍低,你就不是一个“真正的”程序员。 对许多人来说,即使不是绝大多数的应用程序,也完全是无稽之谈,但有时一旦掌握,很难打破心态。
-
MQ确实不适用于无限数据的应用程序。 面向stream的机制,比如pipe道或套接字,更容易使用。
-
System V变种真的失宠了。 一般来说,尽可能使用POSIX版本的IPC。
是的,我认为消息队列适用于某些应用程序。 POSIX消息队列提供了一个更好的接口,特别是,你可以给你的队列名称而不是ID,这对于故障诊断非常有用(使得更容易查看哪个是哪个)。
Linux允许你将posix消息队列作为一个文件系统挂载,并用“ls”来看它们,用“rm”删除它们,这也很方便(系统V依赖于笨重的“ipcs”和“ipcrm”命令)
我实际上并没有使用POSIX消息队列,因为我总是希望保留打开选项以通过networking分发消息的选项。 考虑到这一点,您可能会看到更强大的消息传递接口,如zeromq或实现AMQP的东西。
关于0mq的好处之一是,在multithreading应用程序中使用相同的进程空间时,它使用了非常快速的无锁零拷贝机制。 不过,您也可以使用相同的接口在networking上传递消息。
POSIX消息队列的最大缺点:
- POSIX消息队列并不要求它与
select()
兼容(它可以在Linux中使用select()
而在Qnx系统中使用) - 它有惊喜。
Unix Datagram套接字执行POSIX消息队列的相同任务。 Unix Datagram套接字在套接字层中工作。 可以将它与select()
/ poll()
或其他IO等待方法一起使用。 使用select()
/ poll()
在devise基于事件的系统时具有优势。 以这种方式避免繁忙循环是可能的。
消息队列中有惊喜。 想想mq_notify()
。 它被用来获得接收事件。 这听起来像我们可以通知有关消息队列。 但它实际上是注册通知而不是通知任何事情。
关于mq_notify()
更多惊喜是它必须在每个mq_receive()
之后被调用,这可能会导致竞争条件(当mq_receive()
和mq_notify()
)调用之间的某个其他进程/线程调用mq_send()
)时。
它有自己的定义的一整套mq_open, mq_send(), mq_receive() and mq_close()
,它们是多余的,在某些情况下与socket open(),send(),recv() and close()
方法不一致规范。
我不认为消息队列应该用于同步。 eventfd
和signalfd
适用signalfd
。
但它有一些实时支持。 它具有优先function。
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数据报套接字而不是POSIX消息队列。