現在、splice/vmspliceの値を理解しようとしています。 https://stackoverflow.com/a/1350550/1305501Linuxゼロコピー:vmspliceで2つのプロセス間でメモリページを転送する
質問:データをコピーせずにvmspliceを使用して他のプロセスに一つのプロセスからメモリページを転送する方法(すなわち、ゼロコピー)IPCのユースケースについては、私はstackoverflowの上、以下の答えにつまずきましたか?
上記の回答は可能です。ただし、ソースコードは含まれていません。 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
:この機能は逆方向にも使用できます。しかし、kernel sourcesのコメントによれば、データはコピーされます。read
私は、メモリが正しく整列されていれば、この機能はいくつかの魔法をしますが、私はそれを疑っています。mmap
:パイプでは不可能です。しかし、代わりに使用できる仮想ファイルがあります。すなわち、splice
仮想ファイルのメモリページとmmap
です。- ...?
vmsplice
と全く同じですか?
"send()"という名前の非静的関数を作成することはお勧めできません。 – wildplasser
実際、これはPOSIXで未定義の動作を引き起こしています。 –
私はあなたの 'vmsplice'への' receive'の呼び出しが意味をなさないと思います。これは、書き込むべきではなく、読み込まないようにするための呼び出しです... –