何时使用pipe道与何时使用共享内存

我正在阅读各种IPC机制。 我试图找出场景,我们使用共享内存和我们使用命名pipe道(FIFO)的地方。

pipe道:多个进程可以写入,但只有一个进程可以读取。 写操作是primefaces的。

共享内存:多个进程可以读写。 而且用户需要提供互斥的读写。

这是共享内存和pipe道的唯一区别吗?

本质上,管道 – 无论是有名的还是匿名的 – 都像消息传递一样使用。 有人发送一条信息给收件人,收件人可以收到。 共享内存更像是发布数据 – 有人将数据放在共享内存中,读者(可能是许多人)必须使用同步,例如通过信号来了解有新数据的事实,并且必须知道如何读取内存区域来查找信息。

通过管道,同步过程非常简单,并且内置于管道机制本身 – 当有趣的事情发生时,读取和写入操作将冻结并解冻应用程序。 使用共享内存,异步工作更容易,只需要一次就可以检查新数据 – 但代价是更复杂的代码。 另外,您可以获得多对多的沟通,但需要再次进行更多的工作。 另外,由于上述原因,调试基于管道的通信比调试共享内存更容易。

一个小小的区别是,fifos可以直接在文件系统中看到,而共享内存区域需要像ipcs这样的特殊工具来管理它们,例如创建一个共享内存段,但是你的应用程序死了,并且不会自行清理(信号量也一样和许多其他同步机制,您可能需要与共享内存一起使用)。

共享内存还可以让您更好地控制缓冲区和资源的使用 – 在操作系统允许的范围内,决定分配多少内存以及如何使用它。 使用管道,操作系统自动控制事情,所以再一次你松了一些灵活性,但松了许多工作。

总结最重要的一点:一对一沟通的管道,较少的编码和让操作系统处理事情,共享内存多对多,手动控制的东西,但代价是更多的工作和更难的调试。