对于 Mac 上的高带宽数据流,最有效的进程间通信方法是啥?

Posted

技术标签:

【中文标题】对于 Mac 上的高带宽数据流,最有效的进程间通信方法是啥?【英文标题】:What's the most efficient inter-process communication method for a high-bandwidth data stream on a Mac?对于 Mac 上的高带宽数据流,最有效的进程间通信方法是什么? 【发布时间】:2015-02-18 04:19:20 【问题描述】:

我有一个 C++ 程序(在 MacOS/X 下运行)生成高带宽数据流(大约每秒 27 兆字节)。第二个 C++ 程序接收该数据并(软)实时处理它。低延迟和高可靠性都是该系统的目标。由于我无法控制的情况,这两个进程需要保持分开——也就是说,我不能将它们转换为同一个进程中的两个线程。

目前我正在使用 UDP 数据包(由进程 A 发送到进程 B 正在侦听的 127.0.0.1 上的 UDP 端口)来实现此数据传输,并且或多或少的工作方式(以偶尔丢弃的数据包为模),但我想知道这个用例是否没有更有效/更合适的机制。 Unix pipe() 会更有效或更可靠吗?或者我应该将数据写入 mmap() 的共享内存区域,并使用管道/套接字/信号量/等来同步两个进程的写入和读取?还是 UDP-over-the-loopback-device 已经足够高效,切换到另一种方法几乎没有什么好处?

【问题讨论】:

(作为提示,每当您通过环回套接字执行 UDP/TCP 时,标准的 UNIX 文件式套接字应该提供更好的性能)。 【参考方案1】:

如果您可以管理同步,您当然无法击败共享内存。内存中的单个副本,没有其他动作。你唯一的“慢”点将是关于谁可以做什么以及在哪里做的任何争论。

【讨论】:

我支持这个。我已经成功编写了一个程序,该程序可以使用 OS X 上的共享内存将超过 100MB/s 的视频流多路复用到多个下游读取器进程。它在 2011 年的旧 MacBook 上运行良好,没有任何问题。

以上是关于对于 Mac 上的高带宽数据流,最有效的进程间通信方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Ubuntu 上最有效的进程间通信

Mac OS X 上的异步应用程序间通信

进程间通信:管道

谈谈Mac进程间通信--XPC

在 Mac OS X 上进行进程间通信的最佳方式

“松散”的进程间通信