5

最近の Linux カーネルでは、ファイルまたはファイルのサブセットを別のファイルにコピーする最速の方法は、非常に優れたspliceシステム コールを使用することです。このシステムは、データをユーザーランドのメモリにコピーすることなく、カーネルに (ほぼ) 直接転送を管理させます。

今、私は他のシステム、特に Windows と BSD/MacOS X で同様のものを見つけることに興味があります (未加工の C からアクセスできない API がある可能性は低いので、Obj-C で書かれたコードを入手したいと思っています)。 )。

ありがとう

Windows での最速のフル ファイル コピーはCopyFile. しかし、ファイルの範囲だけをコピーする場合はどうでしょうか?

注: 私は、パフォーマンスに敏感で、さまざまな大容量ストレージ デバイス (つまり、Android スマートフォンから NFS マウントまで) で動作するはずのコードに取り組んでいます。もちろん、私はさまざまな OS 用にさまざまな実装を喜んで作成します。

注:現時点では、spliceLinux/Android、copyfileBSD/Mac OS X、CopyFileWindows で使用し、ファイル内の範囲に対してread/にフォールバックします。write

4

1 に答える 1

5

BSDsendfile()では、宛先ファイル記述子がソケットである限り、この役割を果たします。

すべての POSIX OS で、memmap()ファイル全体をマッピングwrite()し、マッピングされたデータを呼び出すことで、これを実現するために使用できます。プロセスでこのメモリにアクセスすることはないため、ゼロコピー パフォーマンスを維持できます。

ほとんどの場合、このread()/write()組み合わせはうまく機能し、非常に高速です。ゼロコピーはクールですが、ページ サイズが最大 4096 のバッファーを使用すると、ほぼ同じ速度になりますが、誰もが理解できるコードを使用できます。

于 2012-04-26T08:55:16.967 に答える