2009-09-20 13 views
56

デフォルトでは、プログラム内のI/Oはバッファリングされていることがわかりました。つまり、一時記憶域から要求元のプログラムに配信されます。 私はバッファリングが(システムコールを減らすことによって)IOパフォーマンスを向上させることを理解します。私はCでsetvbufのようなバッファリングを無効にする例を見てきました.2つのモードの違いは何ですか?バッファされたものとバッファされていないものIO

答えて

90

続行する前に出力が書き込まれていることを確認したいときはいつでも、バッファされていない出力が必要です。 1つの例はCランタイムライブラリの標準エラーです。これは通常デフォルトではバッファリングされません。エラーは(うまくいけば)まれなので、すぐにそれらについて知りたいと思う。一方、標準出力のは、より多くのデータが通過すると想定されているので、単にバッファされたです。

もう1つの例はロギングライブラリです。ログメッセージがプロセス内のバッファ内に保持され、プロセスがコアダンプする場合、出力は決して書き込まれません。

さらに、システムコールだけでなく最小化されたディスクI/Oもあります。プログラムが一度に1バイトずつファイルを読み込むとしましょう。バッファリングされていない入力では、おそらくブロック全体で読み込む必要があるにもかかわらず、すべてのバイトについて(比較的遅い)ディスクに出ます(ディスクハードウェア自体にバッファがあるかもしれませんが、ディスクコントローラメモリ内アクセスよりも遅くなります)。

バッファリングすると、ブロック全体が一度にバッファに読み込まれ、個々のバイトが(メモリ内の、信じられないほど速い)バッファ領域から配信されます。すでにディスクに書き込む準備ができたバイトの大規模な配列を有するときは、バッファリングされていない出力をしたい

+-------------------+-------------------+ 
| Process A   | Process B   | 
+-------------------+-------------------+ 
| C runtime library | C runtime library | C RTL buffers 
+-------------------+-------------------+ 
|    OS caches    | Operating system buffers 
+---------------------------------------+ 
|  Disk controller hardware cache | Disk hardware buffers 
+---------------------------------------+ 
|     Disk    | 
+---------------------------------------+ 
21

、およびにしたい:

はバッファリングは、次の例のように、多くの形態をとることができることを覚えておいてください途中の2番目のバッファに余分なコピーを避けてください。

バッファリングされた出力ストリームは、書き込み結果を中間バッファに蓄積し、十分なデータが蓄積された(またはflush()が要求された)ときのみOSファイルシステムに送信します。これにより、ファイルシステムコールの数が減ります。ファイルシステムコールは、ほとんどのプラットフォームでは(短いmemcpyと比較して)高価になる可能性があるため、多数の小さな書き込みを実行する場合、バッファされた出力は正味の勝利です。バッファなしの出力は、送信する大きなバッファを既に持っている方が一般的に優れています。中間バッファにコピーしてもOSコールの数はそれ以上減少せず、追加作業が必要になります。

バッファなしの出力にははありませんデータがディスクに到達することを保証します。その機能はflush()によって提供され、バッファされたストリームとバッファされていないストリームの両方で機能します。バッファリングされていないIO書き込みは、データが物理ディスクに到達したことを保証するものではありません。OSファイルシステムは、データのコピーを無期限に保持し、 flush()を呼び出すと、ディスクにコミットする必要があります。 (close()はあなたの代わりにflush()を呼び出します)。

+0

'flush()'を呼び出すと、ディスクに書き込まれることが保証されますか?私はそれがディスクのバッファに渡って渡されると思った。 – jrdioko

+2

書き込みを保証するには 'O_SYNC'が必要です。 – moshbear

関連する問題