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

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

キャッシュは特別な種類のバッファだというのは正しいでしょうか? どちらも同様の機能を実行しますが、私が見逃している根本的な違いがあるのでしょうか?

答え1

Wikipediaの記事よりデータバッファ:

バッファは、ある場所から別の場所に移動されるデータを一時的に保持するために使用される物理メモリストレージの領域です。

バッファ最終的には、1 つのストレージ場所から別のストレージ場所に送信されるすべてのデータを循環して保持することになります (オーディオ処理で循環バッファを使用する場合など)。バッファは、まさにそれを可能にします。つまり、データ ストリーム内の現在の位置の前後のデータの「バッファ」です。

確かに、バッファとキャッシュには共通点がいくつかあります。しかし、従来の意味でのキャッシュは通常、ないデータが場所から場所へ移動されるときにすべてのデータを保存します (つまり、CPU キャッシュ)。

の目的はキャッシュデータを透過的に保存し、パフォーマンスの低下なしに残りのデータを転送できるように、必要なデータだけをキャッシュします。このコンテキストでは、キャッシュは少量のデータのみを「プリフェッチ」します (転送速度、キャッシュ サイズなどによって異なります)。

主な違いは、バッファは最終的にすべてのデータを保持することです。逆に、キャッシュは、設計に応じて、すべてのデータ、一部のデータ、またはまったくデータを保持しない場合があります。ただし、キャッシュは、最初にデータに直接アクセスしているかのようにアクセスされます。つまり、キャッシュされる内容は、キャッシュの「ユーザー」にとって透過的です。


違いはインターフェースキャッシュを使用してデータソースにアクセスする場合、キャッシュがデータソース - キャッシュを通じてデータソースのあらゆる部分にアクセスできます。キャッシュは、データがどこから来るのか(キャッシュ自体、またはソース)を決定します。キャッシュ自体は、データのどの部分をプリロードするかを決定します(通常は先頭だけですが、すべての場合もあります)。キャッシュ置換アルゴリズム使用中のキャッシュは、いつ何がキャッシュから削除されるかを決定します。この最良の例は、CPUキャッシュそれ自体はプリフェッチャー/先読みどちらも、最もよく使用されると思われるデータ部分をメモリに読み込み、キャッシュされていないデータがある場合はハードドライブに戻します。

逆に、新しい部分がすでにバッファに移動されていない限り、バッファを使用してデータ ストリーム内の位置を瞬時に移動することはできません。これを行うには、バッファを再配置する必要があり (新しい位置がバッファの長さを超える場合)、実質的に新しい位置からバッファを「再起動」する必要があります。この最も良い例は、YouTube ビデオのスライダーを移動することです。

バッファのもう 1 つの良い例は、Winamp でオーディオを再生することです。オーディオ ファイルは CPU によってデコードされる必要があるため、曲が読み込まれてからオーディオが処理され、サウンド カードに送信されるまでに時間がかかります。Winamp はオーディオ データの一部をバッファリングするため、処理済みのオーディオ データは十分にあり、ロックアップを回避できます (つまり、CPU は常に数百ミリ秒で聞こえるオーディオを準備しており、リアルタイムではありません。聞こえるのはバッファから来ており、これは CPU が過去に準備したものです)。

答え2

キャッシュはバッファの特定の使用パターンであり、同じデータを複数回使用することを意味する、と言う方が正確でしょう。バッファの使用のほとんどは、データが 1 回の使用後に排出または破棄されることを意味します (必ずしもそうとは限りませんが)。一方、キャッシュは、データが複数回再利用されることを意味します。また、キャッシュは、データが同時に使用されるときに保存されることを意味することもよくありますが、必ずしもそうとは限りません (プリフェッチなどの場合)。一方、バッファリングは、データが後で使用するために保存されることを意味します。

ただし、実装と使用法の両方において、確かに大きな重複があります。

答え3

キャッシュとバッファの重要な違いは次のとおりです。

バッファは主記憶の一部です。主記憶 (RAM) 上に存在し、そこからアクセスされる構造体です。

一方、キャッシュは、コンピューターのメモリ階層内の別の物理メモリです。

バッファは、バッファ キャッシュと呼ばれることもあります。この名前は、バッファの使用法がキャッシュの使用法、つまりデータの保存に似ていることを強調しています。違いは、その使用法のコンテキストにあります。

バッファは、データが 1 つのオブジェクトから別のオブジェクトに移動される間、データを一時的に保存するために使用されます。例: ビデオが表示用にインターネットから PC に移動されると、バッファは次に表示されるビデオのフレームを保存するために使用されます。(バッファリング プロセスが成功するとビデオがスムーズに実行されるため、QoS が向上します。) 例: 別の例として、ファイルにデータを書き込むシナリオがあります。新しく書き込まれたデータは、セカンダリ メモリに即座にコピーされません。行われた変更はバッファに保存され、設計されたポリシーに従って、セカンダリ メモリ (ハード ディスク) のファイルに反映されます。

一方、キャッシュは、RAM とプロセッサの実行速度のギャップを埋めるために、プライマリ メモリとプロセッサの間で使用されます。また、最も頻繁にアクセスされるデータは、RAM へのアクセスを減らすためにキャッシュに保存されます。

答え4

共通点: どちらも、計算と「メイン」ストレージ間の中間データ ストレージ コンポーネント (ソフトウェアまたはハードウェア) です。

私にとっての違いは次のとおりです。

バッファ:

  • ハンドル一連データへのアクセス(例:ファイルまたはソケットからのデータの読み取り/書き込み)
  • 有効にする計算と主記憶装置間のインターフェース、適応するデータ プロデューサーとデータ コンシューマーの異なるデータ転送パターンを相互に関連付けます。たとえば、コンピューティングでは小さなデータ チャンクが書き込まれますが、ディスク ドライブは特定のサイズのデータ​​ ピースしか受け入れることができません。そのため、バッファーは小さなピースを入力として蓄積し、出力の大きなピースに再グループ化します。
  • つまり、それはアダプタデザイン パターン。直接相互運用できない 2 つの相互作用するコンポーネントを結合します。
  • 例: ディスク バッファー、Java 言語の BufferedReader、コンピューター グラフィックスのダッファリング。

キャッシュ:

  • ハンドルランダムデータへのアクセス (例: CPU キャッシュは、順番に必要のないメモリ行をキャッシュします)。
  • 最適化メインストレージへのアクセスが高速化されます。たとえば、CPU キャッシュはメモリへのアクセスを回避するため、CPU コマンドが高速化されます。
  • それはまるでデコレーターデザイン パターン。原理的には直接相互運用できる 2 つの相互作用するコンポーネントを (多くの場合は透過的に) 結合し、相互作用を高速化します。
  • 例: CPU キャッシュ、ページ キャッシュ、Web プロキシ、ブラウザ キャッシュ。

関連情報