21

現在、splice/vmsplice の値を理解しようとしています。IPC の使用例に関して、stackoverflow で次の回答を見つけました: https://stackoverflow.com/a/1350550/1305501

質問: vmsplice を使用して、データをコピーせずに (つまり、ゼロコピーで) メモリ ページをあるプロセスから別のプロセスに転送する方法を教えてください。

上記の答えは、それが可能であると主張しています。ただし、ソースコードは含まれていません。のドキュメントをvmsplice正しく理解していれば、メモリが適切に割り当てられ、整列されていれば、次の関数はメモリ ページをコピーせずにパイプ (カーネル バッファ) に転送します。プレゼンテーションを簡単にするために、エラー処理は省略されています。

// data is aligned to page boundaries,
// and length is a multiple of the page size
void transfer_to_pipe(int pipe_out, char* data, size_t length)
{
    size_t offset = 0;
    while (offset < length) {
        struct iovec iov { data + offset, length - offset };
        offset += vmsplice(pipe_out, &iov, 1, SPLICE_F_GIFT);
    }
}

しかし、コピーせずにユーザー空間からメモリページにアクセスするにはどうすればよいでしょうか? どうやら、次の方法は機能しません。

  • vmsplice:この機能は逆方向にも使用できます。しかし、カーネル ソースのコメントによると、データはコピーされます。
  • read: メモリが適切に配置されている場合、この関数が魔法のように機能することは想像できますが、私はそれを疑っています。
  • mmap: パイプには使用できません。しかし、代わりに使用できるある種の仮想ファイル、つまりsplice仮想ファイルへのメモリページとmmapそれはありますか?
  • ... ?

で全然出来ないのvmsplice

4

1 に答える 1

7

R ..が述べたように、 fdを受信プロセスに渡すだけで、反対側では通常のfdとして使用できます。

編集: 実際には、送信側でvmsplice()を使用してバッファーをパイプにマップし、パイプのもう一方の端で受信側でsplice()を使用する必要があります。こちらの例をご覧ください。

もう1つの選択肢は、共有mmapを使用することです。

于 2012-05-17T16:46:38.160 に答える