web-dev-qa-db-ja.com

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

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

Wikipediaの data buffers に関する記事から:

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

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

実際、バッファとキャッシュにはいくつかの共通の側面があります。ただし、従来の意味でのキャッシュは、通常、データが移動されたときにすべてのデータを格納しない(つまり、CPUキャッシュ)。

cacheの目的は、透過的な方法でデータを格納することです。これにより、十分なデータがキャッシュされ、パフォーマンスを低下させることなく残りのデータを転送できます。このコンテキストでは、キャッシュは少量のデータを「プリフェッチ」するだけです(転送速度、キャッシュサイズなどによって異なります)。

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


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

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

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

12
Breakthrough

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

ただし、実装と使用の両方で確かに大きなオーバーラップがあります。

10
fluffy

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

バッファは一次メモリの一部です。これらは、存在し、プライマリメモリ(RAM)からアクセスされる構造です。

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

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

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

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

3
Rubal

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

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

バッファ:

  • ハンドル順次データへのアクセス(例:ファイルまたはソケットからのデータの読み取り/書き込み)
  • Enables計算と主ストレージ間のインターフェース、adaptsデータプロデューサーとデータコンシューマーの異なるデータ転送パターンを相互に。例えば。計算ではデータの小さなチャンクが書き込まれますが、ディスクドライブは特定のサイズのデータ​​のみを受け入れることができます。したがって、バッファは小さな断片を入力として蓄積し、それらを出力の大きな断片に再グループ化します。
  • つまり、Adapter設計パターンのようなものです。直接相互運用できない2つの相互作用するコンポーネントを結合します。
  • 例:ディスクバッファー、Java言語でのBufferedReader、コンピューターグラフィックスでのダフリング。

キャッシュ:

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