首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在这里,哪个IPC更高效?

在这里,哪个IPC更高效?
EN

Stack Overflow用户
提问于 2011-03-03 09:01:32
回答 3查看 3.4K关注 0票数 5

我有一个系统应用程序,它在unix上作为12个进程的集合运行。有一个监控进程,它与其他11个进程交换数据。

IPC的要求是使这11个进程与监视进程进行通信,并以执行效率最高的方式进行设计。你们能不能权衡一下下面两个选项,或者推荐一个更好的。

1)具有UDP套接字通信,这11个进程将定期向监控进程推送数据。监控进程只是监听和捕获信息,这已经足够好了。

2)实现共享内存。因此,共有11个共享内存段,其中每个内存段在2个进程(进程ith和监视进程)之间共享。

对于共享内存,它看起来更快,但需要锁定/同步,在udp中,内核将数据从一个进程的内存空间复制到另一个进程。

有人可以提供更多的输入来帮助更好地评估这两种方法吗??谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-03 16:49:30

协调共享内存是一件棘手的事情。父级必须知道何时读取11个共享内存段中每个段的哪一部分,并让子级知道何时读取了数据,以便部分共享内存可以重用,等等。因此,尽管复制可能更快,但协调的其余部分(可能使用信号量集-可能有22个信号量,11个通信通道的每个方向一个)意味着您几乎肯定会发现基于文件描述符的机制更容易编码。select()poll()或变体系统调用可用于告诉您何时有数据可供主程序读取。内核处理所有令人讨厌的调度和流控制等问题。

因此,请使用Unix域套接字,除非您能真正证明您将从共享内存版本中获得性能优势。但是,如果共享内存实现正确,可能会丢失一些毛发(和一些数据)。(您可以演示在原始的、不正确的同步系统中使用共享内存是否会带来性能上的好处;您可能不会使用一个不正确的同步系统进入生产环境。)

票数 5
EN

Stack Overflow用户

发布于 2011-03-03 10:11:55

这在很大程度上取决于进程之间需要共享多少数据。如果要来回传递大量数据(例如,兆字节或千兆字节),那么共享内存将是更有效的方法。如果只有相对少量的数据(千字节或几兆字节),那么基于套接字的方法可能更可取,因为效率不是很重要,避免共享内存将使您的系统更健壮,更易于开发和调试。

此外,一些内核支持零拷贝网络,在这种情况下,从一个进程向另一个进程发送UDP数据包实际上可能根本不需要内核复制数据,而只是将底层MMU页面重新映射到目标进程。如果是这样的话,套接字方法将为您提供两全其美的效果(效率和健壮性)。

票数 2
EN

Stack Overflow用户

发布于 2011-03-03 16:01:38

UDP中的传输不能得到保证,有时甚至在本地主机通信中也会丢弃数据包。所以MMF可能会更好。

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

https://stackoverflow.com/questions/5175419

复制
相关文章

相似问题

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