在两个流程之间交换大量数据的最有效方法是什么?

lil*_*ind 4 linux

最近我正在为DVR构建软件.

它将安装在插有2个或更多PCIE x4视频编码器卡的x86 pc服务器上.

我们有2个分离的过程,一个必须从这些编码器卡获取编码的视频数据,另一个必须将这些数据保存到硬盘驱动器.为什么我们有两个过程?一些历史问题.

那么,我们应该使用什么样的IPC?套接字,管道或共享内存?

目前我们正在使用socket.

caf*_*caf 11

使用Linux上的管道,您可以使用该splice功能将数据从一个进程零移动到另一个进程.例如,发送进程使用vmsplice()with SPICE_F_GIFT将数据提供给管道,然后接收进程使用splice()with SPLICE_F_MOVE将数据从管道直接移动到磁盘文件中而不触及它.请注意,围绕此自然存在一些对齐和长度限制.

根据编码器卡的驱动程序的工作方式,您可能会安排从驱动程序到磁盘的零拷贝 - 编码器卡DMA进入内存,磁盘将其DMA备份,而不需要CPU看一下(在这种情况下,您将splice()数据从编码器卡插入管道,然后splice()从管道返回到磁盘文件).