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