我正在阅读各种 IPC 机制。我试图找出我们使用共享内存和使用命名管道 (FIFO) 的场景。
管道: 多个进程可以写入,但只有一个进程可以读取。写操作是原子的。
共享内存: 多个进程可以读写。并且用户需要提供读写互斥。
这就是共享内存和管道应用的唯一区别吗?
最佳答案
本质上,管道——无论是命名的还是匿名的——都像消息传递一样使用。有人向收件人发送一条信息,收件人可以收到。共享内存更像是发布数据——有人将数据放在共享内存中,而读者(可能很多)必须使用同步,例如通过信号量了解有新数据的事实,并且必须知道如何读取内存区域以查找信息。
使用管道,同步很简单,并且内置于管道机制本身 - 当发生有趣的事情时,您的读取和写入将卡住和解冻应用程序。使用共享内存,可以更轻松地异步工作并偶尔检查一次新数据——但代价是代码要复杂得多。另外,您可以获得多对多的通信,但它又需要更多的工作。此外,由于上述原因,调试基于管道的通信比调试共享内存更容易。
一个小的区别是 fifos 在文件系统中是直接可见的,而共享内存区域需要像 ipcs
这样的特殊工具来管理它们,以防万一。创建一个共享内存段,但您的应用程序死机并且不会自行清理(信号量和您可能需要与共享内存一起使用的许多其他同步机制也是如此)。
共享内存还可以让您更好地控制缓冲和资源使用 - 在操作系统允许的限制内,由您决定分配多少内存以及如何使用它。使用管道,操作系统会自动控制一切,因此您再次失去了一些灵 active ,但减轻了很多工作。
最重要的几点总结:用于一对一通信的管道,更少的编码和让操作系统处理事情,多对多的共享内存,更多的手动控制,但代价是更多的工作和更努力调试。
关于linux - 何时使用管道与何时使用共享内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9701757/