web-dev-qa-db-ja.com

バッファとキャッシュの違いは何ですか?

ハードドライブからのデータの読み取り速度とRAM)からのデータの読み取り速度が大きく異なるため、キャッシュを使用してハードドライブからデータを読み取る速度を向上させることを知っています。したがって、インデックスキャッシュミスの量は非常に重要です。

また、ハードドライブやキーボードなどの他のデバイスからの読み取りおよび書き込み中に、バッファ(たとえば、JavaにはBufferedWriterBufferedReaderがあります)があることも知っています。しかし、なぜバッファが必要なのかわかりません。バッファがない場合はどうなりますか?バッファは読み取り速度を向上させるためにもありますか?もしそうなら、バッファとキャッシュの違いは何ですか?

その上、私はキャッシュが読み取り速度を改善することであることを知っていますが、キャッシュはRAMからハードドライブへのデータの書き込み速度を改善できますか?

1
Yves

私が理解していることから、バッファーは、プロデューサーとコンシューマーがデータを最適に生成または消費する速度が異なる場合に最も役立ちます。

たとえば、プログラムは一度に8バイトのデータをファイルに書き込むことができます。書き込まれるディスクの場合、実際に一度に4KiBのデータを書き込むことが最適な場合があります。チャンクが非常に小さい場合、ディスクへの書き込みに伴うオーバーヘッドは、ディスクが実際にデータを書き込むのにかかる時間よりも大きくなる可能性があります(512 * T_8b >> T_4KiB)。したがって、間にバッファを配置すると、4 KiBのデータチャンクを収集し、それらを一度に書き込むと、パフォーマンスが大幅に向上します。たとえば、次を参照してください。 ddに時間がかかりすぎるのはなぜですか? ここで、最も簡単な解決策は、より大きなバッファサイズを使用することです。 (もちろん、ここでの私の数値は純粋に例です。最近のディスクに適した実際の数値は大きく異なる場合があります。)

キャッシュはバッファリングと直交しています。キャッシュとバッファリングの両方は、遅いソース(ディスク、ネットワークなど)の不要な余分なアクセスを防ぐために行われます。ただし、キャッシュは、結果を再利用のために保存して重複した読み取りと書き込みを排除することで機能しますが、バッファーは、繰り返しの連続した読み取りと書き込みをまとめて排除することで機能します。単純化したビュー:

  • 同じ場所をn回読み取ると、最初の場所だけが実際にディスクにヒットし、残りはキャッシュから取得されます
  • 同じ場所にn回書き込むと、実際には最後だけが書き込まれます
3
Olorin