哪个IPC在这里效率更高?

时间:2011-03-03 01:01:32

标签: sockets unix operating-system ipc shared-memory

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

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

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

OR

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

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

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

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

在UDP传送中无法保证,有时即使在本地主机通信中也会丢弃数据包。所以MMF可能会更好。