1. ホーム
  2. language-agnostic

[解決済み] バッファード IO とアンバッファード IO

2023-03-12 11:39:50

質問

私は、デフォルトでプログラムの I/O がバッファリングされること、つまり、要求するプログラムに一時的なストレージから提供されることを学びました。 私は、バッファリングが IO パフォーマンスを向上させる (おそらくシステム コールを減らすことによって) ことを理解しています。 バッファリングを無効にする例として、次のようなものを見たことがあります。 setvbuf この 2 つのモードの違いは何ですか、また、いつ他よりも 1 つを使用する必要がありますか。

どのように解決するのですか?

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

もうひとつの例は、ロギング ライブラリです。ログメッセージがプロセス内のバッファに保持され、プロセスがコアダンプする場合、出力が決して書き込まれない可能性が非常に高くなります。

さらに、最小化されるのはシステムコールだけでなく、ディスク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                |
+---------------------------------------+