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

Operating system 消息队列和共享内存之间的区别?,operating-system,Operating System,我读了很多关于消息队列和共享内存之间区别的文章。 但仍不清楚哪一种方法有利于取得良好的绩效 与共享内存一样,它们也被认为是优于队列的,但在同步它时也存在性能问题。消息队列具有固有的同步开销,以性能为代价保证安全。 共享内存没有保护措施-如果两个线程同时访问它,它们可能会发生冲突(写入不一致的数据),除非您自己确保线程安全。 如果允许出现小错误(例如,数据进入模拟输出,一些噪声是可以接受的),这可能无关紧要,因此您可以完全跳过错误检查,并在相当高的性能增益下采用“足够好”的方法。此外,共享内存允许

我读了很多关于消息队列和共享内存之间区别的文章。 但仍不清楚哪一种方法有利于取得良好的绩效


与共享内存一样,它们也被认为是优于队列的,但在同步它时也存在性能问题。

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

共享内存和消息队列都可以用于在进程之间交换信息。区别在于它们是如何使用的

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


消息队列是一个单向管道:一个进程写入队列,另一个进程按照写入顺序读取数据,直到出现数据结束的情况。创建队列时,将设置消息大小(每条消息的字节数,通常相当小)和队列长度(挂起消息的最大数量)。访问速度比共享内存慢,因为每个读/写操作通常是一条消息。但是队列保证每个操作要么成功地处理整个消息,要么在不改变队列的情况下失败。因此,编写器在只编写部分消息后永远不会失败,而读取器将要么检索完整消息,要么什么也不检索。

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

共享内存可以被认为比队列更快(低开销、高数据传输量)。但另一方面,队列需要高开销(将队列设置为永久性队列等)和低数据量

共享内存的责任在于,为了线程安全,您必须实现同步。看看IPC上的优秀文章

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


这就是两者之间的区别。

消息队列和共享内存用于在两个进程之间共享数据。 消息队列要求以特定格式共享数据。两个进程必须对此达成一致并共享消息。内核允许我们读取整个消息或不读取消息队列中的任何内容。 但共享内存要求部分段在两个进程之间共享,这两个进程都可以执行一些同步技术并在进程之间共享数据。
由于不需要复制数据以共享到其他进程,共享内存更快。

复制而不是复制。一个是关于管道,一个是关于shm。我看到链接“beej”过时了?你能发布一个最新的链接吗?thanks@Sriram修复了链接,一点也不陈旧。仍然在同一个站点上。;)