Ada*_*iss 31
共享内存和消息队列都可用于在进程之间交换信息.所不同的是在如何使用它们.
共享内存正是您的想法:它是一个可以由多个进程读取和写入的存储区域.它没有提供固有的同步; 换句话说,由程序员来确保一个进程不会破坏另一个进程的数据.但它在吞吐量方面效率很高:读写操作相对较快.
甲消息队列是一个单向管:一个进程写入到队列中,而另一个在读出它被写直到数据结束-的条件发生的顺序的数据.创建队列时,将设置消息大小(每个消息的字节数,通常相当小)和队列长度(最大未决消息数).访问速度比共享内存慢,因为每次读/写操作通常都是单个消息.但是队列保证每个操作都将成功处理整个消息,或者在不更改队列的情况下失败.因此,在仅编写部分消息之后,作者永远不会失败,并且读者将要么检索完整的消息,要么根本不检索任何消息.
消息队列具有固有的同步开销,以性能为代价来保证安全。共享内存没有保护措施 - 如果两个线程同时访问它,它们可能会发生冲突(写入不一致的数据),除非您自己确保线程安全。如果允许出现小错误(例如,数据进入模拟输出并且一些噪声是可以接受的),这可能是微不足道的,因此您可以完全跳过错误检查,并以相当高的性能增益采用“足够好”的方法。此外,共享内存允许交换大块数据以及多个应用程序共用的数据的公共和持久存储,从而节省内存存储。消息队列用于较低的吞吐量 - 例如,您可以利用它们来保护对共享内存的访问。
当使用共享内存时,要考虑到可能的竞争条件,即一个进程向其中写入数据,而另一个进程从中读取数据,需要记住这一点。使用前者存在相关风险,假设两个进程正在使用它,一个进程写入它,另一个进程读取它,正在写入的进程由于异常情况而死亡,读取它的进程可能会挂起或崩溃。
共享内存可以被认为比队列更快(开销低,数据传递量大)。但另一方面,队列需要高开销(使队列永久化的设置等)和低数据量。
共享内存的责任是您必须实现同步才能保证线程安全。看看Beej关于 IPC 的优秀文章。
使用队列时,它们是线程安全的,不仅如此,无论结果如何,消息都保存在队列中,假设两个进程正在使用队列,当一个进程向队列写入(以消息的形式)并且在这种情况下,即将从中读取数据的其他进程会由于崩溃或异常情况而死亡或被终止,该消息仍然存在,如果重新启动,其他进程可以从队列中读取数据,即没有数据丢失。
这就是两者的区别。