デフォルトでは、プログラム内のI/Oはバッファリングされていることがわかりました。つまり、一時記憶域から要求元のプログラムに配信されます。 私はバッファリングが(システムコールを減らすことによって)IOパフォーマンスを向上させることを理解します。私はCでsetvbuf
のようなバッファリングを無効にする例を見てきました.2つのモードの違いは何ですか?バッファされたものとバッファされていないものIO
答えて
続行する前に出力が書き込まれていることを確認したいときはいつでも、バッファされていない出力が必要です。 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 |
+---------------------------------------+
、およびにしたい:
はバッファリングは、次の例のように、多くの形態をとることができることを覚えておいてください途中の2番目のバッファに余分なコピーを避けてください。
バッファリングされた出力ストリームは、書き込み結果を中間バッファに蓄積し、十分なデータが蓄積された(またはflush()が要求された)ときのみOSファイルシステムに送信します。これにより、ファイルシステムコールの数が減ります。ファイルシステムコールは、ほとんどのプラットフォームでは(短いmemcpyと比較して)高価になる可能性があるため、多数の小さな書き込みを実行する場合、バッファされた出力は正味の勝利です。バッファなしの出力は、送信する大きなバッファを既に持っている方が一般的に優れています。中間バッファにコピーしてもOSコールの数はそれ以上減少せず、追加作業が必要になります。
バッファなしの出力にははありませんデータがディスクに到達することを保証します。その機能はflush()によって提供され、バッファされたストリームとバッファされていないストリームの両方で機能します。バッファリングされていないIO書き込みは、データが物理ディスクに到達したことを保証するものではありません。OSファイルシステムは、データのコピーを無期限に保持し、 flush()を呼び出すと、ディスクにコミットする必要があります。 (close()はあなたの代わりにflush()を呼び出します)。
- 1. バッファされた/バッファされていないチャンネル
- 2. バッファなしのI/OとバッファされたI/Oの比較
- 3. vim - バッファリストにリストされていない、削除されたバッファの再オープン
- 4. LightWeight IP:バッファが解放されない
- 5. バッファにチャネルが書き込まれている間にバッファを書き込もうとしています
- 6. バッファされていないファイルI/Oの結果
- 7. Python Twisted - TelnetやSSHでバッファされた/バッファされない入力を制御する方法は?
- 8. バッファされたライターがファイルに書き込まない
- 9. 割り込み保護されたバッファ
- 10. libjpegでoバッファを書くのにもう少し助けてください。
- 11. 新しいバッファ( "my string"、 "binary")の代わりになるもの
- 12. バッファがフラッシュされているかどうかのテストR
- 13. exeは、最大の宣言されたバッファよりも小さくすることはできますか?
- 14. すべてのVIバッファに開いた多くのバッファ付き
- 15. バッファの長さとバッファのソケット上での送信
- 16. GetPrivateProfileString - バッファの長さ
- 17. FileResultがメモリにバッファされています
- 18. マルチスレッドのためのNAudio:既に再生エラーでキューされているバッファ
- 19. なぜこのバッファはループの内部で定義されていますか?
- 20. このバッファされたリーダーにデータが受信されないのはなぜですか?
- 21. UARTバッファが読み取られない
- 22. デタッチされたスレッドのスタックが一度もリリースされない
- 23. 角度ソケット-IO IOが定義されていない
- 24. Emacs:変更されたバッファを保存していないときにこれらの#ファイルを作成しないでください
- 25. Boost.Python:Pythonで渡されたバッファを書き込んでください
- 26. Pythonに渡されたCバッファへのデータの追加Ctypesコールバック
- 27. アクティブなものではないバッファからラインをヤンクします
- 28. コミット後も更新されたデータが表示されない
- 29. ソケットから単一のバッファにチャンクされたデータを受信
- 30. PresentationCore.dllが参照されていても "using System.Windows.Media"の認識されない
'flush()'を呼び出すと、ディスクに書き込まれることが保証されますか?私はそれがディスクのバッファに渡って渡されると思った。 – jrdioko
書き込みを保証するには 'O_SYNC'が必要です。 – moshbear