我正在阅读各种IPC机制。我试图弄清楚使用共享内存和使用命名管道(FIFO)的方案。
管道:可以写入多个进程,但是只能读取一个进程。写操作是原子的。
共享内存:可以读写多个进程。用户还需要提供读写互斥功能。
这是共享内存和管道应用程序的唯一区别吗?
本质上,管道(无论是命名管道还是匿名管道)都像消息传递一样使用。有人将一条信息发送给收件人,收件人可以接收它。共享内存更像是发布数据- 有人将数据放入共享内存中,并且读取器(可能有很多)必须使用同步,例如通过信号量来了解存在新数据的事实,并且必须知道如何读取内存区域以查找信息。
使用管道,同步很简单,并且内置在管道机制中- 当发生有趣的事情时,您的读写将冻结和取消冻结应用程序。使用共享内存,可以更轻松地进行异步工作,并偶尔仅检查一次新数据- 但以更复杂的代码为代价。另外,您可以获得多对多的交流,但又需要更多的工作。同样,由于上述原因,基于管道的通信的调试比调试共享内存更容易。
微小的区别是fifos在文件系统中直接可见,而共享内存区域需要特殊的工具ipcs来进行管理,以防您例如创建共享内存段,但您的应用程序死了并且自身无法清除(信号灯和许多其他同步机制,您可能需要与共享内存一起使用)。
ipcs
共享内存还使您能够更好地控制缓冲和资源使用- 在操作系统允许的范围内,由您决定分配多少内存以及如何使用它。使用管道,操作系统可以自动控制事物,因此您再次失去了一些灵活性,但省去了很多工作。
最重要的要点摘要:用于一对一通信的管道,更少的编码和让OS处理的事情,用于多对多的共享内存,对事物的更多手动控制,但以更多的工作和更困难的调试为代价。