2009-08-29 24 views
3

最近、DVRのソフトウェアをビルドしています。これは、プラグイン2以上のPCIE×4ビデオエンコーダーカードでのx86 PCサーバにインストールされます大量のデータを2つのプロセス間で交換する最も効率的な方法は何ですか?

我々は他にはあり、1は、これらのエンコーダカードからのビデオ符号化データを取得する必要があり、プロセスへの2区切られていますこれらのデータをハードドライバーに保存します。なぜ我々は2つのプロセスを持っていますか?ヒストロイ問題。

私たちはどんな種類のIPCを使うべきですか?ソケット、パイプ、または共有メモリ?

現在、私たちはソケットを使用しています。

+2

共有メモリに投票するのは、オーバーヘッドが最も少ないからです。あなたは何らかの種類の循環バッファを実装しなければなりません(私が思うように)。 – Eugene

答えて

0

使用IPC:

  • つの共有メモリ領域:低オーバーヘッドは、2つのプロセス間のバッファを共有し()(にshmat参照)。
  • 1つのセマフォー:そのカウンターは使用可能なフレーム数です(semop()を参照)。カメラからのビデオデータをポンピングするプロセスは、共有メモリ領域にフレームを置き、セマフォにput()をかけます。ディスクにフレームを記録するプロセスは、セマフォ上でget()され、フレームは共有メモリに格納されます。

カウンタとしてセマフォを持つキューを実装するのと同じです。

11

Linux上のパイプでは、splice機能を使用して、あるプロセスから別のプロセスへのデータのゼロコピー移動を得ることができます。たとえば、送信プロセスではとvmsplice()を使用してデータをパイプに贈ります。受信プロセスではsplice()SPLICE_F_MOVEを使用して、データをパイプからディスクファイルに直接移動させます。当然のことながら、整列と長さの制限があります。

エンコーダカードのドライバの仕方によっては、ドライバからディスクにゼロコピーされる可能性があります。エンコーダカードはメモリにDMAされ、ディスクはそれをDMAします。 CPUはこれを見る必要があります(この場合は、splice()のデータをエンコーダカードからパイプに送り、splice()をパイプからディスクファイルに戻します)。

+1

素晴らしい、コメントなしのdownvotes。あなたが答えを理解していなければ、ただそれにしてください。 – caf

+0

私はドライバーがそれをサポートしていないことを知っているので、私はDMAを考慮しませんでした。 – lilyonwind

+0

それにもかかわらず、ディスクはほぼ確実に動作するので、まだ勝つだろう。より良いコピーは少なくなります。 – caf

関連する問題