1

スプライスを使用すると、すべてがカーネルにとどまることができます。しかし、パイプに渡されるのがデータなのか居場所情報なのかはわかりません。

編集 1: @vinayak に感謝します。これで、パイプ バッファーとの間で実際にデータ コピーが行われることがわかりました。しかし、なぜ居場所と長さの情報をパイプに渡すことができないのでしょうか?

  • 単一のプロセス内では、アドレス空間は同じです
  • 異なるプロセス間では、パイプ バッファーが線形マップされている場合にも機能します。そうでない場合は、DMA アドレスを使用できます。
4

1 に答える 1

3

ここを参照

splice() は、ユーザー空間から/へのコピーを行わずに、カーネル空間内のあるファイルから別のファイルへの I/O を実行するシステム コール メカニズムです。これは、I/O パフォーマンスを向上させる方法です。splice システム コールは、ユーザー空間からカーネル空間へ、およびその逆へのすべてのデータ コピーを回避します。入力ファイルから指定されたオフセットから読み取り、カーネル空間のパイプに書き込みます。ユーザー空間へのデータのコピーはありません。次に、指定された/現在のオフセットでパイプから出力ファイルにデータを書き込むために呼び出すことができます。

splice() は、パイプ バッファ メカニズムを使用してデータ ソースのファイル記述子とデータ シンクの別のファイル記述子を開き、 splice() を使用して 2 つを結合することによって機能します。つまり、splice() は、ユーザーが制御できるカーネル バッファーで動作し、データをバッファーとの間で任意のファイル記述子との間で移動します。パイプでオフセットを指定すると、いつものようにエラーになります。入出力ファイル記述子でオフセットが指定されていない場合、現在のオフセットは指定されたオフセットであると見なされます。現在、ファイル記述子の 1 つはパイプである必要があります。そうでない場合はエラーになります。

于 2013-06-24T10:54:47.383 に答える