GIFT経由でvmspliceに送信されたページをいつ修正できますか?

GIFT経由でvmspliceに送信されたページをいつ修正できますか?

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()は、データを書き込むスペースがさらにあることを示します。

おすすめ記事