キャッシュ (コンピュータシステム)

キャッシュとは、コンピュータサイエンスで使われる用語です。キャッシュ発音は「キャッシュ」/ˈkæʃ/ KASH)の背後にある考え方は非常に単純です。非常に多くの場合、計算の結果を得ることは非常に時間がかかるので、結果を保存することは一般的に良いアイデアです。2種類の記憶媒体が使われています。1つは通常かなり大きなメディアですが、アクセスは「遅い」もので、もう1つはかなり高速にアクセスできますが、一般的には小さいものです。キャッシングの非常に基本的な考え方は、データのコピーを持つためにアクセスが速いメディアを使うことです。コピーとオリジナルの間に違いはありません。オリジナルのデータにアクセスするには、長い時間がかかるかもしれませんし、コストがかかるかもしれません(例:解くのに時間がかかる難しい問題の結果など)。このような理由から、単純にキャッシュからコピーしたデータを利用する方がはるかに「安い」のです。別の言い方をすれば、キャッシュとは、よく使うデータのコピーを一時的に保管しておく場所のことです。このキャッシュにデータのコピーがあると、元のデータを再取得したり再計算したりするよりも、このコピーを使った方が早いのです。これにより、データにアクセスするのに必要な平均時間が短くなります。新しい値をキャッシュに入れるということは、古い値を置き換える必要があることを意味することが多い。どのように置き換える値を選択するかについては、異なる考え(通常は「戦略」と呼ばれます)があります。

バッファはキャッシュと非常に似ています。バッファ内のデータにアクセスするクライアントはバッファがあることを知っていますが、バッファはアプリケーションによって管理されています。キャッシュの場合、データにアクセスするクライアントはキャッシュがあることを意識する必要はありません。

典型的なコンピュータアプリケーションは、非常に似た方法でデータにアクセスします。データが「ブロック」に構造化されていて、個別にアクセスできるとします。アプリケーションがブロックにアクセスするとき、元のブロックに「近い」ブロックにアクセス(または参照)する可能性が非常に高くなります。これは参照の局所性として知られています。このような「ロカリティ」にはさまざまな種類があります。参照のロカリティは、コンピューティングの多くの分野でキャッシュがうまく機能する理由の一つです。

うまく機能するためには、データ全体の量に比べてキャッシュは小さくしなければなりません。キャッシュが大きければ大きいほど、エントリを検索するのに時間がかかります。また、大きなキャッシュは構築コストが高くなります。

キャッシュの仕組み

キャッシュとは、再利用される可能性の高いデータを保存するためのメモリのブロックのことです。CPUハードドライブは、WebブラウザやWebサーバーと同様にキャッシュを使用することが多いです。

キャッシュはプールと呼ばれる多数のエントリで構成されています。各エントリは、別の場所にあるデータのコピーであるデータム(データのビット)を保持します。キャッシュは通常、バッキングストアと呼ばれるものを使用します。バッキングストアは、キャッシュに比べてアクセスに時間がかかるか、コストがかかります。ディスクキャッシュは、例えばハードディスクをバッキングストアとして使用します。また、各エントリにはタグと呼ばれる小さな情報が添付されています。このタグは、元のデータが保存されている場所を見つけるために使用されます。

読書のためのキャッシュ

クライアント(CPU、ウェブブラウザ、オペレーティングシステム)は、バッキングストアにあると思われるビットデータにアクセスしたい場合、まず、そのデータがキャッシュにあるかどうかをチェックします。データがキャッシュ内にあれば、クライアントはそれを使用することができ、メインメモリを使用する必要はありません。これはキャッシュヒットとして知られています。したがって、例えば、Web ブラウザプログラムは、ディスク上のローカルキャッシュをチェックして、特定の URL に Web ページのコンテンツのローカルコピーがあるかどうかを確認するかもしれません。この例では、URL がタグであり、ウェブページの内容がデータムです。

他に発生する可能性のある状況は、タグを持つデータムがキャッシュ内で見つからないことです。これはキャッシュミスとして知られています。データムはバッキングストアからフェッチする必要があります。通常は、キャッシュにコピーされ、次回からはバッキングストアからデータを取得する必要がなくなります。

キャッシュのサイズには制限があります。以前にキャッシュされなかったエントリのためのスペースを確保するために、別のキャッシュされたエントリをキャッシュから削除する必要があるかもしれません。削除するのに最適なエントリを見つけるために特別なルールが使用されます。これらのルールは通常ヒューリスティックと呼ばれます。エントリを見つけるために使用されるヒューリスティックは置換ポリシーと呼ばれます。使用される非常に単純なルールは Least recently used (または LRU) と呼ばれます。これは単純に、最も長く前に使用されていたエントリを取ります。他のヒューリスティックはキャッシュアルゴリズムに記載されています。

書くためのキャッシュ

キャッシュはデータの書き込みにも使用することができます。この利点は、一度キャッシュに書き込まれたエントリをクライアントが操作を続けることができることです。

ただし、エントリーはある時点でバッキングストアに書き込まれなければなりません。これが発生するタイミングは、書き込みポリシーによって制御されます。

ライトスルーキャッシュでは、各エントリはキャッシュに格納されるだけでなく、すぐにバッキングストアに書き込まれます。

もう一つの選択肢は、キャッシュへの書き込みのみを行い、後からバッキングストアへの書き込みを行うことです。これは、write-back (またはwrite-behind)キャッシュとして知られています。キャッシュは、まだバッキングストアに書き込まれていないエントリにマークを付けます; 使用されるマークは、しばしばダーティフラグと呼ばれます。エントリがキャッシュから削除される前に、それらのエントリはバッキングストアに書き込まれます。これは遅延書き込みとして知られています。ライトバックキャッシュのミス(ブロックを別のブロックに置き換える必要がある)は、多くの場合、2回のメモリアクセスを必要とします: 1回は必要なデータを取得するためのもので、もう1回はキャッシュからストアに置き換えられたデータを書き込むためのものです。

また、キャッシュポリシーは、特定のデータムをキャッシュに書き込まなければならないと言っているかもしれません。クライアントはキャッシュ内のデータムに多くの変更を加えているかもしれません。それが完了した後、クライアントはキャッシュに明示的にデータを書き戻すように指示することができます。

ノーライトアロケーションとは、リードのみをキャッシュするキャッシュポリシーです。これにより、ライトバックやライトスルーキャッシュの必要性を回避することができます。書き込みは常にバッキングストアに行われます。

クライアントは、バッキングストア内のデータを変更するアプリケーションではありません。バッキングストア内のデータが変更された場合、キャッシュ内のコピーは古くなったり、古くなったりします。あるいは、クライアントがキャッシュ内のデータを更新すると、他のキャッシュ内のそのデータのコピーは陳腐化する。データを意味のあるものに保つためにキャッシュマネージャがお互いに話をすることを可能にする特別な通信プロトコルがあります。これらはコヒーレンシープロトコルとして知られています。

CPUメモリキャッシュの説明図Zoom
CPUメモリキャッシュの説明図

置換するエントリの選択

キャッシュは小さく、ほとんどの場合満杯か、ほぼ満杯になります。そのため、新しい値が追加されると、古い値を削除する必要があります。この選択には様々な方法があります。

  • 先入れ先出し。キャッシュに追加されたエントリを、最も長い時間前に置き換えてください。
  • 最後に使用されたもの。この考え方は上のFIFOと似ていますが、あるエントリが使用されると、そのタイムスタンプ/年齢が更新されます。
  • 最も頻繁に使用されるものではありません。これもFIFOの場合と似ていますが、タイムスタンプを使用する代わりにカウンタを使用します。
  • エントリーをランダムに選ぶ

歴史

キャッシュという言葉がコンピューティングで初めて使われるようになったのは1967年で、IBM Systems Journalに掲載される科学論文が準備されていました。その記事は、Model 85のメモリの新しい改良についてのものでした。モデル85はIBM System/360製品ラインのコンピュータでした。ジャーナルの編集者は、記事の中で使用されている高速バッファのためのより良い言葉を求めていました。彼は何の情報も得られず、「隠す」という意味のフランス語のcacherからcacheを提案しました。記事は1968年初頭に発表され、著者はIBMから表彰されました。彼らの仕事は広く歓迎され、改善されました。キャッシュはすぐにコンピュータの文献で標準的に使われるようになりました。

キャッシュを使用する場所

CPUキャッシュ

CPUチップ上またはその近くにある小さなメモリは、はるかに大きなメインメモリよりも高速にすることができます。1980年代以降のほとんどのCPUは、1つ以上のキャッシュを使用しています。パソコンに搭載されている現代の汎用CPUでは、半ダースものキャッシュを搭載している場合があります。各キャッシュは、プログラムを実行するタスクの異なる部分に特化している場合があります。

ディスクキャッシュ

CPUキャッシュは一般的にハードウェアで全て管理されており、他のキャッシュは別の種類のソフトウェアで管理されています。オペレーティングシステムは通常、メインメモリ内のページキャッシュを管理しています。コンピュータサイエンス以外のユーザーは通常、このキャッシュを仮想メモリと呼んでいます。これはオペレーティングシステムのカーネルによって管理されています。

最近のハードドライブにはディスクバッファがあります。これらは「ディスクキャッシュ」と呼ばれることもありますが、これは誤りです。これらのバッファの主な機能は、ディスクへの書き込みの順序付けと読み出しの管理です。ハードドライブのサイズに比べてバッファが非常に小さいため、キャッシュの繰り返しヒットはまれです。

ローカルハードディスクは、リモートサーバー、ローカルテープドライブ、光学ジュークボックスなどの他のストレージデバイスに比べて高速です。ローカルハードディスクをキャッシュとして使用することは、階層型ストレージ管理の主な概念です。

ウェブキャッシュ

WebブラウザやWebプロキシサーバーは、WebページなどのWebサーバーからの過去の応答を保存するためにキャッシュを使用しています。ウェブキャッシュは、ネットワークを介して送信する必要のある情報量を減らします。以前にキャッシュに保存された情報は、多くの場合、再利用することができます。これにより、ウェブサーバーの帯域幅や処理要件が削減され、ウェブのユーザーの応答性を向上させることができます。

最近のウェブブラウザは内蔵のウェブキャッシュを使用していますが、インターネットサービスプロバイダや組織によっては、キャッシングプロキシサーバを使用している場合もあります。これは、そのネットワークのすべてのユーザー間で共有されるウェブキャッシュです。

また、検索エンジンは、インデックスされたウェブページをキャッシュから利用できるようにすることもよくあります。例えば、Googleは各検索結果の横に「キャッシュされた」リンクを用意しています。これは、ウェブページがウェブサーバーから一時的にアクセスできない場合に便利です。

信頼性の低いネットワークでのキャッシング

書き込みスルー動作は、信頼性の低いネットワーク(イーサネットLANのようなもの)では一般的です。このような場合、複数の書き込みキャッシュが使用されている場合に、書き込みキャッシュ内のデータが意味のあるものであることを確認するために使用されるプロトコルは非常に複雑です。

例えば、ウェブページキャッシュやクライアント側のネットワークファイルシステムキャッシュ(NFSやSMBのようなもの)は、ネットワークプロトコルをシンプルで信頼性の高いものにするために、一般的に読み取り専用または書き込み専用になっています。

バッファとキャッシュの違い

バッファとキャッシュは相互に排他的なものではなく、一緒に使われることも多いです。しかし、これらが使用される理由は異なります。バッファは、CPU命令が周辺機器に保存されているデータを直接アドレス指定できないため、従来から使用されているメモリ内の場所です。コンピュータのメモリは、中間ストアとして使用されます。

さらに、このようなバッファは、(ストレージデバイスによって要求されるように)大規模なデータブロックが組み立てられたり分解されたりする場合や、データが生成された順序とは異なる順序で配信される場合に実行可能であるかもしれません。また、データのバッファ全体は通常、順次転送される(例えばハードディスクへの転送)ので、バッファリング自体が転送性能を向上させることもあります。これらの利点は、バッファリングされたデータが一度バッファに書き込まれ、一度バッファから読み出された場合でも存在します。

キャッシュは転送性能も向上させます。増加の一部は、複数の小さな転送が1つの大きなブロックに結合される可能性に由来しています。しかし、主な性能向上は、同じデータがキャッシュから何度か読み込まれるか、書き込まれたデータがすぐに読み込まれる可能性が高いために発生します。キャッシュの唯一の目的は、基礎となるより遅いストレージへのアクセスを減らすことです。また、キャッシュは通常、隣接するレイヤーからは見えないように設計された抽象化レイヤーでもあります。そうすれば、アプリケーションやクライアントはキャッシュがあることに気づかないかもしれません。

質問と回答

Q: キャッシュとは何ですか?


A: キャッシュとは、コンピュータサイエンスで使用される用語で、頻繁に使用されるデータのコピーを保存して、元のデータを再取得または再計算するよりも高速にアクセスできるようにすることを指します。

Q: キャッシングはどのように機能するのですか?


A: キャッシュは2種類の記憶媒体を使うことで機能します。1つは通常かなり大きいがアクセスに時間がかかるもの、もう1つはより速くアクセスできるが一般に小さいものです。キャッシュの背後にある考え方は、データのコピーを保存するために高速なメディアを使用することで、元のデータへのアクセスにかかる時間やコストを削減することです。

Q: バッファとは何ですか?


A: バッファは、より速いアクセスのためにデータのコピーを保存するという点でキャッシュと似ていますが、バッファでは、データにアクセスするクライアントはバッファがあることを知り、それがアプリケーションによって管理されるのに対し、キャッシュではクライアントはキャッシュがあることを意識する必要がありません。

Q:参照の局所性とは何ですか?


A:参照の局所性とは、アプリケーションが構造化されたデータの特定のブロックにアクセスするとき、最初にアクセスしたブロックに近い他のブロックにもアクセスする可能性があることを意味します。キャッシュは通常、利用可能なすべてのデータと比較して小さいので、これはキャッシュをうまく機能させるのに役立ちます。

Q:なぜ大きなキャッシュは、エントリーの検索に時間がかかるのですか?


A:キャッシュが大きいと時間がかかるのは、より多くの情報が格納されているため、検索に時間がかかるからです。また、ストレージに多くのリソースを必要とするため、より高価になります。

Q:局所性は、キャッシュをより良く機能させるのに役立ちますか?


A: ロカリティはキャッシュをより良く動作させるのに役立ちます。なぜなら、アプリケーションが構造化データの特定のブロックにアクセスするとき、その近くの他のブロックも必要になる可能性が高く、その場合、他の場所から取得したり再計算したりする代わりに、キャッシュから迅速に取得することができます。

AlegsaOnline.com - 2020 / 2023 - License CC3