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

时间:2009-08-29 03:31:53

标签: linux

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

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

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

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

目前我们正在使用socket。

2 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:-1)

使用IPC:

  • 一个共享内存区域:两个进程之间的低开销共享缓冲区(请参阅shmat())。
  • 一个信号量:它的计数器是可用的帧数(见semop())。从摄像机泵送视频数据的过程会将帧放在共享内存区域中,并将()放在信号量上。将帧记录到磁盘的进程将在信号量上获取(),并且帧将位于共享内存中。

这有点像使用semphore作为计数器实现队列。