sockets - 哪个IPC更高效?

标签 sockets unix operating-system ipc shared-memory

我有一个系统应用程序,它作为 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/

相关文章:

linux - bash shell中 "{}"的作用是什么?

fonts - 操作系统中的字符集和字体有什么区别?

linux - 进程组必须有一个正在运行的领导进程吗?

c - 通过套接字发送图像

python - 通过 Python 套接字/WebSocket 客户端发送/接收 WebSocket 消息

具有两个挂起监听器的 Java 套接字应用程序

java - Java 服务器上使用 Socket.IO 的“访问控制允许来源”

c++ - 如何检查端口是否处于 TIME_WAIT 状态或已被另一个应用程序占用

python - 通过 git grep 查找同时包含两个指定术语的文件

file - Lua 文件 :read unexpected behavior