我正在研究用于嵌入式Linux上进程间通信的消息队列。我想知道为什么我没有使用Linux提供的消息队列如下:
msgctl,msgget msgrcv,msgsnd。
而不是创建共享内存,并与信号量同步?
直接在业务嵌入式产品上使用这组功能有什么缺点?
答案 0 :(得分:9)
这些是'System V IPC'消息队列功能。他们会为你工作,但他们相当重。它们由POSIX标准化。 POSIX还提供了一组更现代的功能,mq_close
,mq_getattr
,mq_notify
,mq_open
,mq_receive
,mq_send
,{{1} },mq_setattr
这对你来说可能更好(这种财富的尴尬)。但是,您需要检查默认情况下在目标平台上安装了哪个(如果有)。特别是在嵌入式系统中,可能需要配置它们,甚至安装它们,因为它们默认不存在(共享内存和信号量也是如此)。
任一组消息工具的主要优点是它们是预先调试的(可能),因此已经解决了并发问题 - 而如果你要用共享内存和信号量为自己做,那么你已经为了达到相同的功能水平,还有很多工作要做。
所以,(重新)尽可能使用。如果是一个选项,请使用两个消息队列系统中的一个,而不是重新创建自己的系统。如果您最终发现存在性能瓶颈或类似问题,那么您可以调查编写自己的替代方案,但在此之前 - 重用!
答案 1 :(得分:6)
System V消息队列(由msg *系统调用操纵的队列)有很多奇怪的怪癖和陷阱。对于新代码,我强烈建议使用UNIX域套接字。
话虽如此,我还强烈建议通过共享内存方案传递IPC消息。共享内存更容易出错,并且更容易出错。
答案 2 :(得分:2)
消息传递非常适合小数据块,并且需要维护不变性,因为消息队列可以复制数据。
共享内存区域不会在发送/接收时复制数据,并且在较不干净的编程模型权衡时可以更有效地处理大型数据集。
答案 3 :(得分:1)
缺点消息队列是微不足道的 - 一些系统调用和复制开销 - 对于大多数应用程序来说都没有。好处远大于开销。同步是自动的,它们可以以多种方式使用:阻塞,非阻塞,并且因为在linux中,消息队列类型被实现为文件描述符,它们甚至可以在select()
调用中用于多路复用。在您应该使用的POSIX变种中,除非您非常迫切需要使用SYSV队列,否则您甚至可以自动生成线程或信号来处理队列项。最重要的是,它们已经过完全调试。
答案 4 :(得分:0)
消息队列和共享内存不同。并且程序员和他的要求是选择使用哪个。在共享内存中,您必须在阅读和写作时要小心。并且流程应该同步。因此,执行顺序在共享内存中非常重要。在共享内存中,无法查找读取值是新写入的值还是旧值。并且没有明确的等待机制。
消息队列和共享内存不同。并且程序员和他的要求是选择使用哪个。有预定义的功能可以让您在消息队列中轻松生活。