哪个IPC在这里效率更高?

sbr*_*sbr 5 unix sockets operating-system ipc shared-memory

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

IPC的要求是使这11个过程与监控过程进行通信,并以最有效的方式设计.你们可以权衡以下两个选项,或建议一个更好的选项.

1)具有UDP套接字通信,其中这11个进程将定期将数据推送到监视器进程.监控过程只是监听和捕获足够好的信息.

要么

2)具有共享内存实现.所以有11个共享内存段,每个段在2个进程(进程ith和监视进程)之间共享.

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

任何人都可以提供更多输入来帮助更好地评估这两种方法.?谢谢.

Jon*_*ler 5

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

因此,除非您能够真正证明您将从共享内存版本中获得性能优势,否则请使用Unix域套接字.但是期望丢失一些头发(以及一些数据)以使共享内存实现正确.(您可以证明使用共享内存与原始的,不正确的同步系统是否有性能优势;您可能不会使用粗略的不正确同步系统进行生产.)