
vmsplice(4)
this と一緒に使用すると、SPLICE_F_GIFT
私のプロセスは私が提供するメインページを変更しないと約束します。私が知る限り、一般的なワークフローは次のとおりです。
/*pseudo code don't kill me*/
void* page = memmap();
vmsplice(page, SPLICE_F_GIFT);
free(page);
ただし、これを行うには、ページを提供するたびにTLBを無効にする必要があります。これは、データをコピーしないことによって得られるパフォーマンス上の利点を無効にします。
では、カーネルが次のようになるかどうかはどうすればわかりますか?完璧私のページに?私は簡単にできるいいえページを公開しますか?
次のユースケースがあるとします。
vmsplice -> pipe -> splice -> tcpsocket
SEND
カーネルがバッファを空にし、私のページが再び私のページになる応答を待ちますか?
答え1
では、カーネルが自分のページを完成したかどうかはどうすればわかりますか?なぜなら、ページをまったく解放できないからです。そうですか?
中心のためのギフト。アプリケーションはこのメモリを変更しないでください。一度そうしないと、ページキャッシュとディスクのデータが異なる可能性があります。
vmsplice - >パイプ - >ジャンクション - > tcpsocket
カーネルが転送バッファをフラッシュし、私のページが再び私のページになる応答を待ちますか?
いいえ
返信を待つ使用中の契約ですべての無料ページの受信を確認してください。。そうすればカーネルがわかるでしょう。持つすべてのギフトページの転送バッファをフラッシュします。
(ところで、ページの内容が保存されるとは思いません。内部でIPSec暗号化が可能だと思います。)
明らかに、「ソケット転送キュー内の転送されていないデータの量」を取得することも可能であるため、これは別のアプローチです。 https://stackoverflow.com/questions/6421771/vmsplice-and-tcp (もちろん、このリンクをたどってゼロになるのを待つ必要はありません。各ページが安全になったら再利用できます。)カーネル転送キューを埋めない場合は、ポーリングする必要があります。 (そうであれば、両方を再確認してください。選択する()epoll()は、データを書き込むスペースがさらにあることを示します。
答え2
意図された用途は、vmspliceがmmapされたページを提供することです。 vmspliceの後、これらのページを変更することはできませんが、munmapすることはできます。