14

我正在研究一个消息队列,用于在嵌入式 Linux 上的进程之间进行通信。我想知道为什么我不使用 Linux 提供的消息队列,如下所示:

msgctl、msgget、msgrcv、msgsnd。

而不是创建共享内存,并与信号量同步?

直接在商业嵌入式产品上使用这组功能有什么缺点?

4

5 回答 5

10

函数msgctl()msgget()msgrcv()msgsnd()是“System V IPC”消息队列函数。他们会为你工作,但他们是相当重量级的。它们由 POSIX 标准化。

POSIX 还提供了一组更现代的函数,mq_close(), mq_getattr(), mq_notify(), mq_open(), mq_receive(), mq_send(), mq_setattr(),mq_unlink()可能对你更好(这样的财富尴尬)。

但是,您需要检查默认情况下在您的目标平台上安装了哪个(如果有的话)。特别是在嵌入式系统中,您可能必须配置它们,甚至安装它们,因为它们默认不存在(共享内存和信号量也是如此)。

任何一组消息工具的主要优点是它们是预先调试的(可能),因此已经解决了并发问题 - 而如果你打算自己使用共享内存和信号量来做这件事,你有很多要达到相同级别的功能需要做的工作。

因此,尽可能(重新)使用。如果可以选择,请使用两个消息队列系统之一,而不是重新发明自己的系统。如果您最终发现存在性能瓶颈或类似情况,那么您可以研究编写自己的替代方案,但在那之前——重用!

于 2012-03-05T07:22:53.267 回答
6

System V 消息队列(由 msg* 系统调用操作的队列)有很多奇怪的怪癖和陷阱。对于新代码,我强烈建议使用 UNIX 域套接字。

话虽如此,我还强烈建议通过共享内存方案传递消息的 IPC。共享内存更容易出错,而且更容易出错。

于 2012-03-05T07:20:27.873 回答
2

消息传递非常适合小数据块和需要维护不变性的地方,因为消息队列复制数据。

共享内存区域不会在发送/接收时复制数据,并且可以更有效地处理更大的数据集,但要以不太干净的编程模型为代价。

于 2012-03-05T07:19:06.297 回答
1

消息队列的缺点是微不足道的——一些系统调用和复制开销——这对大多数应用程序来说都不算什么。好处远远超过了开销。同步是自动的,它们可以以多种方式使用:阻塞、非阻塞,并且由于在 linux 中消息队列类型是作为文件描述符实现的,它们甚至可以用于select()多路复用调用。在 POSIX 变体中,除非您非常迫切地需要使用 SYSV 队列,否则您应该使用它,您甚至可以自动生成线程或信号来处理队列项。最重要的是,它们已完全调试。

于 2012-03-05T08:14:39.817 回答
0

消息队列和共享内存是不同的。选择使用哪个取决于程序员和他的要求。在共享内存中,您必须小心阅读和写作。并且这些过程应该是同步的。所以执行顺序在共享内存中非常重要。在共享内存中,无法找到读取的值是新写入的值还是旧的值。并且没有明确的等待机制。

消息队列和共享内存是不同的。选择使用哪个取决于程序员和他的要求。有预定义的功能可以让您在消息队列中轻松生活。

于 2012-03-05T07:21:10.810 回答