首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >何时使用管道vs.何时使用共享内存

何时使用管道vs.何时使用共享内存
EN

Stack Overflow用户
提问于 2012-03-14 20:14:31
回答 1查看 40K关注 0票数 43

我正在阅读有关各种IPC机制的文章。我正在尝试弄清楚使用共享内存和使用命名管道(FIFO)的场景。

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

共享内存:多进程可读写。此外,用户还需要提供读写互斥。

这是共享内存和管道应用程序的唯一区别吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-14 21:30:04

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

有了管道,同步很简单,而且内置在管道机制本身-当有趣的事情发生时,你的读写将冻结和解冻应用程序。有了共享内存,异步工作和偶尔检查一次新数据变得更容易-但代价是复杂得多的代码。此外,您可以获得多对多通信,但它需要更多的工作。此外,由于上述原因,调试基于管道的通信比调试共享内存更容易。

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

共享内存还为您提供了对缓冲和资源使用的更多控制-在操作系统允许的限制内,由您决定分配多少内存以及如何使用它。有了管道,操作系统可以自动控制,所以你再一次失去了一些灵活性,但减轻了很多工作。

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

票数 66
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9701757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档