我有一个系统应用程序,它在unix上作为12个进程的集合运行。有一个监控进程,它与其他11个进程交换数据。
IPC的要求是使这11个进程与监视进程进行通信,并以执行效率最高的方式进行设计。你们能不能权衡一下下面两个选项,或者推荐一个更好的。
1)具有UDP套接字通信,这11个进程将定期向监控进程推送数据。监控进程只是监听和捕获信息,这已经足够好了。
或
2)实现共享内存。因此,共有11个共享内存段,其中每个内存段在2个进程(进程ith和监视进程)之间共享。
对于共享内存,它看起来更快,但需要锁定/同步,在udp中,内核将数据从一个进程的内存空间复制到另一个进程。
有人可以提供更多的输入来帮助更好地评估这两种方法吗??谢谢。
发布于 2011-03-03 16:49:30
协调共享内存是一件棘手的事情。父级必须知道何时读取11个共享内存段中每个段的哪一部分,并让子级知道何时读取了数据,以便部分共享内存可以重用,等等。因此,尽管复制可能更快,但协调的其余部分(可能使用信号量集-可能有22个信号量,11个通信通道的每个方向一个)意味着您几乎肯定会发现基于文件描述符的机制更容易编码。select()或poll()或变体系统调用可用于告诉您何时有数据可供主程序读取。内核处理所有令人讨厌的调度和流控制等问题。
因此,请使用Unix域套接字,除非您能真正证明您将从共享内存版本中获得性能优势。但是,如果共享内存实现正确,可能会丢失一些毛发(和一些数据)。(您可以演示在原始的、不正确的同步系统中使用共享内存是否会带来性能上的好处;您可能不会使用一个不正确的同步系统进入生产环境。)
发布于 2011-03-03 10:11:55
这在很大程度上取决于进程之间需要共享多少数据。如果要来回传递大量数据(例如,兆字节或千兆字节),那么共享内存将是更有效的方法。如果只有相对少量的数据(千字节或几兆字节),那么基于套接字的方法可能更可取,因为效率不是很重要,避免共享内存将使您的系统更健壮,更易于开发和调试。
此外,一些内核支持零拷贝网络,在这种情况下,从一个进程向另一个进程发送UDP数据包实际上可能根本不需要内核复制数据,而只是将底层MMU页面重新映射到目标进程。如果是这样的话,套接字方法将为您提供两全其美的效果(效率和健壮性)。
发布于 2011-03-03 16:01:38
UDP中的传输不能得到保证,有时甚至在本地主机通信中也会丢弃数据包。所以MMF可能会更好。
https://stackoverflow.com/questions/5175419
复制相似问题