現在、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
?