我有一个系统应用程序,它作为 UNIX 上 12 个进程的集合运行。有一个监视进程,它与其他 11 个进程交换数据。
IPC的要求是让这11个进程与监控进程进行通信,其设计方式在执行方面是最高效的。你们能否权衡以下两种选择,或者提出更好的选择。
1) 有UDP套接字通信,这11个进程将定期将数据推送到监视器进程。监控进程只是监听和捕获信息,这已经足够了。
或者
2) 有一个共享内存实现。因此有 11 个共享内存段,每个共享内存段在 2 个进程(进程 i 和监视进程)之间共享。
对于共享内存,它看起来更快,但需要锁定/同步,就像在 udp 中一样,内核将数据从一个进程的内存空间复制到另一个进程。
任何人都可以提供更多信息来帮助更好地评估这两种方法。 ?谢谢。
最佳答案
协调共享内存很棘手。父进程必须知道何时读取 11 个共享内存段中每个共享内存段的哪一部分,并让子进程知道数据何时被读取,以便可以重用部分共享内存等。因此,虽然复制可能是更快,其余的协调(可能使用信号量集 - 可能有 22 个信号量,11 个通信 channel 的每个方向一个信号量)意味着您几乎肯定会发现基于文件描述符的机制更容易编码。 select()
或 poll()
或变体系统调用可用于告诉您何时有数据可供 master 读取。内核处理调度和流量控制等所有棘手的问题。
因此,请使用 Unix 域套接字,除非您能够真正证明您将从共享内存版本中获得性能优势。但如果共享内存实现正确的话,可能会损失一些头发(和一些数据)。 (您可以证明在粗略的、不正确同步的系统中使用共享内存是否会带来性能优势;您可能不会使用粗略的、不正确同步的系统投入生产。)
关于sockets - 哪个IPC更高效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5175419/