3

vmspliceシステム コールにより、「SPLICE_F_GIFT」フラグを使用して、一連のユーザー レベル ページからパイプへのゼロ コピー送信を実装できます。私の質問は、逆の操作があるかどうかです。たとえば、パイプのもう一方の端で、パイプを単純に処理するのではなくread()aio_read()パイプされたデータをアドレス空間にマップするだけの処理を実行できますか? これは最終的に、メモリ マッピングをコピーせずに送信側プロセスから受信側プロセスに転送 (移動) することを意味します。これは可能ですか?

編集:私のユースケースは次のようになります。A と B の 2 つのプロセスがあります。A はデータ (> メガバイト) を生成し、それを B に渡してさらに処理し、終了します。コピーを避けて、カーネルに「ここにこれらのページがあり、もう必要ないことを確認してください。それらを B のアドレス空間に添付して、処理を完了してください。

共有メモリまたは一時ファイルで動作する特定のメモリ アロケータを使用するように A を制限しない限り、A によって送信されたメモリはそのアドレス空間のどこにでもある可能性があるため、単純な共有メモリは機能しません。

4

2 に答える 2

3

と を探していると思いprocess_vm_readvますprocess_vm_writev

これらのシステム コールは、呼び出しプロセス (「ローカル プロセス」) のアドレス空間と pid で識別されるプロセス (「リモート プロセス」) の間でデータを転送します。データは、カーネル空間を通過せずに、2 つのプロセスのアドレス空間の間を直接移動します。

詳細については、man ページを参照してください。

于 2013-04-17T14:54:47.623 に答える