ヒット率とは
ヒット率とは、CPUが必要とするデータが、目的の高速なメモリ(主にキャッシュメモリ)の中に存在していた確率のことです。ヒット率が高ければ高いほど、低速なメインメモリ(主記憶装置)にデータを読みに行く回数が減るため、システム全体の処理速度が向上します。逆に、必要なデータがキャッシュメモリに見つからない確率を「ミス率」と呼び、ヒット率とミス率を足すと1(つまり100%)になります。このヒット率を用いて、キャッシュメモリとメインメモリの両方にアクセスする時間を考慮した平均的なアクセス時間を「実効アクセス時間」と呼びます。
具体例
例えば、あなたが勉強中によく使う公式をまとめた「単語帳」を手元に置いているとします。調べたい公式が10回のうち9回、その単語帳に載っていた場合、ヒット率は90%(0.9)になります。残りの1回は本棚にある分厚い教科書を調べる必要があり、これがミス率10%(0.1)になります。このときの実効アクセス時間の計算式は以下のようになります。
実効アクセス時間
= (キャッシュメモリの速度 × ヒット率) + (メインメモリの速度 × ミス率)
= (2ナノ秒 × 0.9) + (50ナノ秒 × 0.1)
= 1.8 + 5.0
= 6.8ナノ秒
もう少し詳しく
ヒット率は、キャッシュメモリやディスクキャッシュなど、階層化された記憶システムにおいて、そのシステムの効率の良さを示す最も重要な指標です。ヒット率が1(100%)に近づくほど、CPUは高速なキャッシュメモリの速度だけで動作しているかのように振る舞うことができます。
ヒット率を向上させるための工夫として、コンピュータの内部では様々なアルゴリズムやハードウェアの仕組みが実装されています。前述した「空間的局所性」を利用し、CPUが要求したデータ単体だけでなく、その周囲の隣接するデータもまとめて(ブロック単位で)キャッシュメモリに読み込んでおく「先読み」の手法が代表的です。また、キャッシュメモリがいっぱいになった際に、どのデータを追い出して新しいデータを入れるかという「書き換えアルゴリズム(置換アルゴリズム)」もヒット率に大きく影響します。よく使われるアルゴリズムとして、最も過去に利用されたきり使われていないデータを追い出す「LRU(Least Recently Used)」方式や、最初に入ってきたデータから順番に押し出す「FIFO(First In First Out)」方式などがあります。
注意すべき点として、実効アクセス時間の計算において、キャッシュにデータが無かった場合(キャッシュミス時)のハードウェアの動作仕様によって、計算式が微妙に変わるケースがあります。最も一般的な計算モデルは、キャッシュにアクセスして無いことが分かった後で主記憶装置にアクセスに行く「逐次アクセス方式」に近い考え方ですが、試験問題によっては「キャッシュメモリと主記憶装置に同時にアクセスを開始する」という前提条件が付けられることがあります。その場合は、ミス時のアクセス時間は主記憶装置へのアクセス時間のみで計算されるなど、問題文の条件を正確に読み取ることが求められます。
試験でのポイント
基本情報技術者試験では、ヒット率を用いた「実効アクセス時間」の算出問題がほぼ毎回のように出題される計算問題の定番です。
基本的な計算式は以下の通りです。
実効アクセス時間 = (キャッシュのアクセス時間 × ヒット率) + (主記憶のアクセス時間 × (1 - ヒット率))
試験では単純に数値を当てはめて計算させる問題のほか、少し応用を利かせた問題も出題されます。例えば、「実効アクセス時間を特定の時間以下にするためには、ヒット率を最低何%以上にしなければならないか」という逆算を求める問題や、「ヒット率が0%のときと100%のときの実効アクセス時間はそれぞれいくらか」という極端なケースを考えさせる問題などです。
計算の際に間違いやすいポイントとして、ミス率は「1 - ヒット率」で求められること、そして単位(ナノ秒など)を揃えて計算することが挙げられます。また、問題文の指示で「キャッシュミスが発生した場合は、主記憶アクセス時間に加えてキャッシュのペナルティ時間がかかる」といった特殊な条件が付加されていないか、問題を注意深く読む習慣をつけてください。
関連する用語
ヒット率の概念と不可分な用語として、速度差を埋めるために用いられるキャッシュメモリや、平均的な読み書き時間を表す実効アクセス時間、そしてキャッシュがいっぱいになった時にどのデータを捨てるかを決めるLRU方式などの置換アルゴリズムが関連します。