Linux的消息队列有哪些缺点?

问题描述 投票:13回答:5

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

msgctl,msgget msgrcv,msgsnd。

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

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

c linux message-queue sysv-ipc
5个回答
10
投票

msgctl()msgctl()msgget()msgget()是“ System V IPC”消息队列功能。它们会为您工作,但重量却很大。它们由POSIX标准化。

POSIX还提供了更现代的功能集msgrcv()msgrcv()msgsnd()msgsnd()mq_close()mq_close()mq_getattr()mq_getattr(),这可能对您更好(如此令人尴尬的财富)。

但是,您需要检查默认情况下在目标平台上安装了哪一种。尤其是在嵌入式系统中,可能是因为它们默认情况下不存在,所以您必须对其进行配置,甚至安装它们(共享内存和信号量也可能如此)。

两组消息工具的主要优点是(可能)已对它们进行了预调试,因此并发问题已得到解决-而如果您要使用共享内存和信号量来自己做到这一点,要达到相同的功能水平,需要做很多工作。

因此,请(重新)使用。如果可以选择,请使用两个消息队列系统之一,而不要重塑您自己的系统。如果最终发现性能瓶颈或类似瓶颈,则可以研究编写自己的替代方案,但是直到那时— reuse!


6
投票

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

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


2
投票

消息传递非常适合小的数据块,并且在消息队列复制数据时,需要保持不变性。

共享存储区不会在发送/接收时复制数据,并且可以通过较不干净的编程模型来权衡更大的数据集的效率。


1
投票

消息队列的缺点很小-一些系统调用和复制开销-对于大多数应用程序来说什么都没有。好处远远超过了开销。同步是自动的,它们可以通过多种方式使用:阻塞,非阻塞,并且由于在Linux中消息队列类型被实现为文件描述符,它们甚至可以在mq_notify()调用中用于复用。在POSIX中,除非确实有必要使用SYSV队列,否则应该使用POSIX,甚至可以自动生成线程或信号来处理队列项目。最好的是,它们已经完全调试。


0
投票

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

消息队列和共享内存不同。程序员和他的要求来选择使用哪个。有预定义的功能,使您在消息队列中的生活变得轻松。

© www.soinside.com 2019 - 2024. All rights reserved.