消息队列和共享内存之间的区别?

时间:2010-02-18 10:51:58

标签: operating-system

我读了很多关于消息队列和共享内存之间差异的文章。 但仍然不清楚哪一个有利于实现良好的表现。

与共享内存一样,假设队列优于队列,但在同步时也存在性能问题。

4 个答案:

答案 0 :(得分:29)

共享内存和消息队列都可用于在进程之间交换信息。区别在于 的使用方式。

共享内存正是您的想法:它是一个可以由多个进程读取和写入的存储区域。它没有提供固有的同步;换句话说,由程序员来确保一个进程不会破坏另一个进程的数据。但它在吞吐量方面效率很高:读写操作相对较快。

消息队列是单向管道:一个进程写入队列,另一个进程按照写入的顺序读取数据,直到发生数据结束。创建队列时,将设置消息大小(每个消息的字节数,通常相当小)和队列长度(最大未决消息数)。访问速度比共享内存慢,因为每次读/写操作通常都是单个消息。但是队列保证每个操作都将成功处理整个消息,或者在不更改队列的情况下失败。所以作者在写完部分信息之后永远不会失败,读者将要么找回一条完整的信息,要么根本不回复。

答案 1 :(得分:3)

当使用共享内存时考虑可能的竞争条件,其中一个进程写入它并且另一个进程从中读取,需要记住一些事项。使用前者存在相关的风险,假设两个进程正在使用它,一个用于写入它,另一个用于读取它,另一个正在写入由于异常条件而死亡,读取它的进程可能挂起或崩溃。

共享内存可以被视为更快(低开销,大量数据传递)然后排队。但另一方面,队列需要较高的开销(设置使队列成为永久性等),数据量较小。

共享内存的责任在于您必须实现同步才能保证线程安全。请查看Beej关于IPC的优秀文章。

使用队列时,它们是线程安全的,而不是单独的,消息保存在队列中而不管结果如何,假设有两个进程正在使用队列,当一个进程写入它时(以消息的形式)并且即将从中读取的另一个进程由于在这种情况下的崩溃或异常情况而死亡或被杀死,该消息仍然存在,另一个进程如果重新启动可以从队列中读取,即没有数据丢失。

这就是两者之间的差异。

答案 2 :(得分:1)

消息队列具有固有的同步开销,以性能为代价保证安全性。 共享内存没有安全措施 - 如果两个线程同时访问它们,它们可能会发生冲突(写入不一致的数据),除非您自己确保线程安全。 如果允许轻微错误(例如,数据转到模拟输出并且某些噪声是可接受的),这可能是微不足道的,因此您可以完全跳过错误检查,并在相当高的性能增益下采用“足够好”的方法。此外,共享内存允许交换大量数据以及通用和持久存储多个应用程序共享的数据,从而节省内存存储空间。消息队列用于降低吞吐量 - 例如,您可以利用它们来保护对共享内存的访问。

答案 3 :(得分:0)

Message Queue和共享内存用于在两个进程之间共享数据。 消息队列要求以特定格式共享数据。两个进程必须就此达成一致并共享消息。内核允许我们读取整个消息或不读取消息队列。 但共享内存需要部分段在两个进程之间共享,两者都可以做一些同步技术并在进程之间共享数据。 由于无需复制数据以共享给其他进程,因此共享内存更快。