
コンピュータを購入しているなら、「キャッシュ」という言葉を聞いたことがあるでしょう。最近のコンピューターにはL1キャッシュとL2キャッシュの両方があり、多くのコンピューターにはL3キャッシュもあります。また、善意のある友人からこのトピックに関するアドバイスを受け取っているかもしれません。たとえば、「そのCeleronチップを購入しないでください。キャッシュがありません!」などです。
キャッシングは、すべてのコンピューターにさまざまな形で現れる重要なコンピューターサイエンスプロセスであることがわかりました。メモリキャッシュ、ハードウェアとソフトウェアのディスクキャッシュ、ページキャッシュなどがあります。仮想メモリは、キャッシュの一形態ですらあります。この記事では、キャッシュが非常に重要である理由を理解できるように、キャッシュについて説明します。
- 簡単な例:キャッシュ前
- 簡単な例:キャッシュ後
- コンピュータキャッシュ
- サブシステムのキャッシュ
- キャッシュテクノロジー
- 参照の局所性
簡単な例:キャッシュ前
キャッシングは、コンピュータのメモリサブシステムに基づくテクノロジです。キャッシュの主な目的は、コンピューターの価格を低く抑えながら、コンピューターを高速化することです。キャッシングを使用すると、コンピューターのタスクをより迅速に実行できます。
キャッシュシステムの背後にある基本的な考え方を理解するために、ライブラリアンを使用してキャッシュの概念を示す非常に単純な例から始めましょう。彼の机の後ろにいる司書を想像してみましょう。彼はあなたが求める本をあなたに与えるためにそこにいます。簡単にするために、自分で本を入手できないとしましょう。図書館員に読みたい本を尋ねる必要があります。図書館員は、物置(の図書館)のスタックのセットからそれを取得します。ワシントンDCの議会はこのように設立されました)。まず、キャッシュのない図書館員から始めましょう。
最初の顧客が到着します。彼は本MobyDickを求めています。図書館員は物置に入り、本を手に入れ、カウンターに戻り、顧客に本を渡します。その後、クライアントは本を返すために戻ってきます。図書館員はその本を受け取り、物置に戻します。その後、彼は別の顧客を待ってカウンターに戻ります。次の顧客がMobyDickを要求したとしましょう(あなたはそれが来るのを見ました...)。その後、図書館員は倉庫に戻って、最近扱った本を入手し、クライアントに渡す必要があります。このモデルでは、図書館員は、頻繁に要求される非常に人気のある本でさえ、すべての本を取得するために完全な往復を行う必要があります。司書のパフォーマンスを向上させる方法はありますか?
はい、方法があります-図書館員にキャッシュを置くことができます。次のセクションでは、これと同じ例を見ていきますが、今回は、図書館員がキャッシュシステムを使用します。
簡単な例:キャッシュ後
図書館員に10冊の本を保管できるバックパックを渡してみましょう(コンピューター用語では、図書館員は10冊の本のキャッシュを持っています)。このバックパックでは、クライアントが返す本を最大10冊まで入れます。前の例を使用しましょう。ただし、新しく改良されたキャッシングライブラリアンを使用します。
一日が始まります。司書のバックパックは空です。私たちの最初のクライアントが到着するとを要求白鯨。ここには魔法はありません。図書館員は本を手に入れるために物置に行かなければなりません。彼はそれをクライアントに渡します。その後、クライアントは戻って本を図書館員に返します。図書館員は、本を返却するために物置に戻る代わりに、本をバックパックに入れてそこに立っています(最初にバッグがいっぱいかどうかを確認します。これについては後で詳しく説明します)。別のクライアントが到着するとを要求白鯨。倉庫に行く前に、図書館員はこのタイトルが自分のバックパックに入っているかどうかを確認します。彼はそれを見つけます!彼がしなければならないのは、バックパックから本を取り出してクライアントに渡すことだけです。物置への旅はないので、クライアントはより効率的にサービスを受けられます。
クライアントがキャッシュ(バックパック)にないタイトルを要求した場合はどうなりますか?この場合、図書館員は最初にバックパックで本を探すのに時間がかかるため、キャッシュがある場合はキャッシュがない場合よりも効率が悪くなります。キャッシュ設計の課題の1つは、キャッシュ検索の影響を最小限に抑えることであり、最新のハードウェアはこの時間遅延を実質的にゼロに減らしました。単純な司書の例でも、キャッシュを検索する待ち時間(待機時間)は、物置に戻る時間と比較して非常に短いため、関係ありません。キャッシュは小さく(10冊)、ミスに気付くのにかかる時間は、物置への移動にかかる時間のごく一部にすぎません。
この例から、キャッシュに関するいくつかの重要な事実を確認できます。
- キャッシュテクノロジは、より高速でより小さなメモリタイプを使用して、より低速でより大きなメモリタイプを高速化することです。
- キャッシュを使用する場合は、キャッシュをチェックして、アイテムがそこにあるかどうかを確認する必要があります。そこにある場合、それはキャッシュヒットと呼ばれます。そうでない場合、それはキャッシュミスと呼ばれ、コンピュータはより大きく、より遅いメモリ領域からのラウンドトリップを待つ必要があります。
- キャッシュの最大サイズは、より大きなストレージ領域よりもはるかに小さくなっています。
- キャッシュの複数のレイヤーを持つことが可能です。私たちの司書の例では、小さいが速いメモリタイプはバックパックであり、物置は大きくて遅いメモリタイプを表しています。これは1レベルのキャッシュです。カウンターの後ろに100冊の本を収納できる棚で構成されるキャッシュの別のレイヤーがあるかもしれません。図書館員は、バックパック、棚、物置の順にチェックできます。これは2レベルのキャッシュになります。
コンピュータキャッシュ
コンピュータは、私たちが非常に小さな増分で時間を測定する機械です。場合、マイクロプロセッサは、メインメモリ(アクセスRAMに)、それは約60ナノ秒(第2の1000000000分の60)にそれをしません。これはかなり高速ですが、通常のマイクロプロセッサよりもはるかに低速です。マイクロプロセッサのサイクルタイムは2ナノ秒と短いため、マイクロプロセッサにとって60ナノ秒は永遠のように見えます。
マザーボードに特別なメモリバンクを構築するとどうなりますか?小さいながらも非常に高速です(約30ナノ秒)。これは、メインメモリアクセスよりもすでに2倍高速です。これは、レベル2キャッシュまたはL2キャッシュと呼ばれます。さらに小さいが高速なメモリシステムをマイクロプロセッサのチップに直接組み込むとどうなるでしょうか。そうすれば、このメモリは、メモリバスの速度ではなく、マイクロプロセッサの速度でアクセスされます。これはL1キャッシュであり、233メガヘルツ(MHz)のPentiumでは、メインメモリへのアクセスよりも2倍高速なL2キャッシュよりも3.5倍高速です。
一部のマイクロプロセッサには、チップに2つのレベルのキャッシュが組み込まれています。この場合、マザーボードのキャッシュ(マイクロプロセッサとメインシステムメモリの間に存在するキャッシュ)はレベル3、つまりL3キャッシュになります。
コンピューターには多くのサブシステムがあります。それらの多くの間にキャッシュを配置して、パフォーマンスを向上させることができます。これが例です。我々は持っているマイクロプロセッサ(コンピュータで最速のものを)。次に、ハードディスクやCD-ROMなどのさらに低速の周辺機器のキャッシュとして使用できる(そしてよく使用される)メインメモリをキャッシュするL2キャッシュをキャッシュするL1キャッシュがあります。ハードディスクは、さらに低速のメディア(インターネット接続)をキャッシュするためにも使用されます。
サブシステムのキャッシュ
あなたのインターネット接続は、コンピュータで最も遅いリンクです。そのため、ブラウザ(Internet Explorer、Netscape、Operaなど)はハードディスクを使用してHTMLページを保存し、ディスク上の特別なフォルダに配置します。初めてHTMLページを要求すると、ブラウザがそれをレンダリングし、そのコピーもディスクに保存されます。次にこのページへのアクセスを要求すると、ブラウザはインターネット上のファイルの日付がキャッシュされた日付よりも新しいかどうかを確認します。日付が同じ場合、ブラウザはインターネットからダウンロードする代わりに、ハードディスク上の日付を使用します。この場合、小さくても高速なメモリシステムがハードディスクであり、大きくて低速なメモリシステムがインターネットです。
キャッシュは周辺機器に直接構築することもできます。最新のハードディスクには、約512キロバイトの高速メモリがハードディスクに配線されています。コンピュータはこのメモリを直接使用しません-ハードディスクコントローラは使用します。コンピュータの場合、これらのメモリチップはディスクそのものです。コンピュータがハードディスクからのデータを要求すると、ハードディスクコントローラはハードディスクの機械部品を移動する前にこのメモリにチェックインします(これはメモリに比べて非常に低速です)。コンピュータがキャッシュで要求したデータを見つけると、ディスク自体のデータに実際にアクセスすることなく、キャッシュに保存されているデータを返すため、時間を大幅に節約できます。
これがあなたが試すことができる実験です。コンピュータはフロッピードライブをメインメモリにキャッシュし、実際にそれが起こっているのを見ることができます。フロッピーから大きなファイルにアクセスします。たとえば、テキストエディタで300キロバイトのテキストファイルを開きます。初めて、あなたはあなたのフロッピーのライトが点灯するのを見るでしょう、そしてあなたは待つでしょう。フロッピーディスクは非常に遅いので、ファイルをロードするのに20秒かかります。ここで、エディターを閉じて、同じファイルを再度開きます。 2回目(30分待ったり、2回の試行の間に多くのディスクアクセスを行ったりしないでください)、ライトが点灯するのが見えず、待つこともありません。オペレーティングシステムフロッピーディスクのメモリキャッシュをチェックインし、探しているものを見つけました。したがって、20秒待つ代わりに、データは最初に試したときよりもはるかに速くメモリサブシステムで見つかりました(フロッピーディスクへの1回のアクセスには120ミリ秒かかりますが、メインメモリへの1回のアクセスには約60ナノ秒かかります-これはかなりの量ですもっと早く)。ハードディスクで同じテストを実行することもできますが、フロッピードライブは非常に遅いため、より明確になります。
すべての全体像を把握するために、通常のキャッシュシステムのリストを次に示します。
- L1キャッシュ-フルマイクロプロセッサ速度でのメモリアクセス(10ナノ秒、4キロバイトから16キロバイトのサイズ)
- L2キャッシュ-タイプSRAMのメモリアクセス(約20〜30ナノ秒、サイズが128キロバイト〜512キロバイト)
- メインメモリ-タイプRAMのメモリアクセス(約60ナノ秒、サイズが32メガバイトから128メガバイト)
- ハードディスク-機械的、低速(約12ミリ秒、サイズが1ギガバイトから10ギガバイト)
- インターネット-信じられないほど遅い(1秒から3日の間、無制限のサイズ)
ご覧のとおり、L1キャッシュはL2キャッシュをキャッシュし、メインメモリはディスクサブシステムのキャッシュに使用できます。
キャッシュテクノロジー
この時点でよく寄せられる質問の1つは、「コンピュータのすべてのメモリをL1キャッシュと同じ速度で実行して、キャッシュを必要としないのはなぜですか?」です。それはうまくいくでしょうが、それは信じられないほど高価になるでしょう。キャッシングの背後にある考え方は、少量の高価なメモリを使用して、低速で安価な大量のメモリを高速化することです。
コンピュータの設計における目標は、マイクロプロセッサを可能な限り安価にフルスピードで実行できるようにすることです。500 MHzチップは、1秒間に5億サイクル(2ナノ秒ごとに1サイクル)を通過します。L1およびL2キャッシュがない場合、メインメモリへのアクセスには60ナノ秒、つまりメモリへのアクセスに約30の無駄なサイクルがかかります。
あなたがそれについて考えるとき、そのような比較的少量のメモリがはるかに大量のメモリの使用を最大化できることは一種の信じられないほどです。64メガバイトのRAMをキャッシュする256キロバイトのL2キャッシュについて考えてみてください。この場合、256,000バイトは64,000,000バイトを効率的にキャッシュします。なぜそれが機能するのですか?
コンピュータサイエンスでは、参照の局所性と呼ばれる理論的概念があります。これは、かなり大規模なプログラムでは、一度に使用されるのはごく一部であることを意味します。奇妙に思われるかもしれませんが、参照の局所性は大多数のプログラムで機能します。実行可能ファイルのサイズが10メガバイトであっても、そのプログラムのほんの一握りのバイトしか一度に使用されておらず、その繰り返し率は非常に高くなっています。次のページでは、参照の局所性について詳しく学習します。
参照の局所性
次の擬似コードを見て、参照の局所性が機能する理由を確認しましょう(Cプログラミングが実際に機能する方法を参照してください)。
画面への出力«1から100までの数字を入力» ユーザーからの入力を読み取る ユーザーからの値を変数Xに入れます 変数Yに値100を入れます 変数Zに値1を入れます ループY回 ZをXで割る 除算の余り= 0の場合 次に、出力«ZはXの倍数です» Zに1を追加 ループに戻る 終わり
この小さなプログラムは、ユーザーに1から100までの数値を入力するように要求します。ユーザーが入力した値を読み取ります。次に、プログラムは1から100までのすべての数値をユーザーが入力した数値で除算します。余りが0(モジュロ除算)かどうかをチェックします。その場合、プログラムは、1から100までのすべての数値に対して、「ZはXの倍数です」(たとえば、12は6の倍数)を出力します。その後、プログラムは終了します。
コンピュータプログラミングのことをよく知らなくても、このプログラムの11行でループ部分(7行目から9行目)が100回実行されていることは容易に理解できます。他のすべての行は1回だけ実行されます。7行目から9行目は、キャッシュがあるため、大幅に高速に実行されます。
このプログラムは非常に小さく、最小のL1キャッシュに完全に簡単に収まりますが、このプログラムが巨大であるとしましょう。結果は同じままです。プログラムすると、ループ内で多くのアクションが発生します。ワードプロセッサは、入力を待って画面に表示する時間の95%を費やします。ワードプロセッサプログラムのこの部分はキャッシュにあります。
この95%対5%の比率(およそ)は、参照の局所性と呼ばれるものであり、キャッシュが非常に効率的に機能するのはそのためです。これは、そのような小さなキャッシュがそのような大きなメモリシステムを効率的にキャッシュできる理由でもあります。どこでも最速のメモリを搭載したコンピュータを構築する価値がない理由がわかります。この効果の95%をわずかなコストで実現できます。
キャッシュと関連トピックの詳細については、次のページのリンクを確認してください。