CPUがプログラムを実行するためには、 少なくともCPUがそのコードを主記憶中から読み込もうとする 瞬間には、そのプログラムコードが主記憶中に置かれている 必要があります。 近年、プログラマが 「プログラムコードが現在主記憶にあるかどうか」 を気にすることなるプログラムを書けるのは 「OSのメモリ管理機構」のおかげなのです。
OSの「メモリ管理 (memory management)」は 「使わない情報は低速なメモリに置き、必要に応じて高速な メモリに持ってくる」という動作を行います。
メモリ管理方式
『ページング』とは 「主記憶と2次記憶のメモリがあたかもランダムアクセス可能な1つの主記憶 であるかのように見せる技術」のことです。
プログラムは局所性原理にしたがう性質をもっていますので、プログラムの 流れが変化するまで、ある特定のページの集合(ワーキングセット, working set) だけが参照されやすくなります。 使用する可能性の高いページアドレスを高速に変換するために、 高速なハードウェアによるページ検索テーブル、 「アドレス変換バッファ(TLB, Translation Look-aside buffer)」 を用います。
使う可能性が高い項目を保持しているという点では、TLBはキャッシュと 非常によく似たふるまいをします。
「仮想ページアドレスを実ページアドレスに変換する」方法には 次の種類があります。
ページサイズとTLBサイズの積は、TLBで直接扱えるメモリの量となります。 たとえば、ページサイズ4Kbyte, TLBが256エントリの場合、1Mbyteの メモリを直接扱うことができる)。 ページサイズはOSによってさまざまな値(64byte〜512Kbyte)をとりますが、 一般に 4Kbyte や 8Kbyteなどがよく使われているようです。
ページサイズが小さい場合は次のような特徴を持ちます。
参照したページが主記憶内に無い場合 (= TLBにも主記憶用のページテーブルにもない場合)は、 ページフォールト (page fault)が起きます。 ページフォールトでは、 読み込まれるページ(=参照するページ)は ディスクメモリ用ページテーブルを使ってディスクメモリの 中から探されます。 ページを読み込むときに主記憶内に空いている空間が なければ、使われていないページをまず主記憶から 取り除いてから読み込みます。
「主記憶から取り除くページ」を選ぶ方法が『置換アルゴリズム』です。 置換アルゴリズムは、キャッシュ・システムとページング・システム では大きく異なっています(TLBとキャッシュシステムは似ているが)。 キャッシュでは高速性が重要なのでハードウェアで実現していました。 ページング・システムでは、主記憶用のページ テーブルに含まれる多数のページ (TLBのページは最近使ったものなので取り除く対象からはずす) を扱う必要があるので、ハードウェアとソフトウェアの組合わせで 実現しています。
使用状況に基づいて置換を行うためには、いつページが参照された か、変更されたかどうかを記録しておく必要があります。 このためページごとに「使用ビット」や「修正ビット」を持たせておきます。
取り除くページを決める置換アルゴリズムには次のようなものが あります。
仮想記憶とキャッシュを用いるシステムでは、TLB (仮想アドレスから実アドレスへの変換をする)を
CPU --- キャッシュ --- メモリ
のうち「CPUとキャッシュの間」と「キャッシュとメモリの間」
のどちらにいれるかが問題になります。
[問題1]
ページングシステムにおいて、ページが次の順で参照されるとします。
12, 14, 2, 34, 56, 23, 14, 56, 34, 12
主記憶には4ページしか入らないと仮定します。
置換アルゴリズムとして
[解答1]
以下のようにページが置換されるので最終状態では、
FIFOの場合は「56,23,14,12」、LRUの場合は「14,56,34,12」の
ページが主記憶内にあります。
| 参照ページ | 主記憶内のページ | |
| FIFOの場合 | LRU場合 | |
| 12 | 12 | 12 |
| 14 | 12,14 | 12,14 |
| 2 | 12,14,2 | 12,14,2 |
| 34 | 12,14,2,34 | 12,14,2,34 |
| 56 | 14,2,34,56 | 14,2,34,56 |
| 23 | 2,34,56,23 | 2,34,56,23 |
| 14 | 34,56,23,14 | 34,56,23,14 |
| 56 | 34,56,23,14 | 34,23,14,56 |
| 34 | 34,56,23,14 | 23,14,56,34 |
| 12 | 56,23,14,12 | 14,56,34,12 |
[問題2]
実アドレスキャッシュを用いたシステムがあり、
このシステムの動作時間が以下のように与えられているとします。
| TLB変換時間 | 25ns |
| キャッシュにその場所があるかどうかを判断する時間 | 25ns |
| キャッシュにあるときデータをフェッチする時間 | 25ns |
| 主記憶を読む時間 | 200ns |
| TLBのヒット率 | 0.9 |
| キャッシュのヒット率 | 0.95 |
[解答2]
実アドレスキャッシュなので、TLBは「CPUとキャッシュの間」に
置かれています。
実ページアドレスが『TLB or キャッシュ or 主記憶』のどれか
にあり、データは『キャッシュ or 主記憶』のどれかにあるわけです。
この組合せは6通りあり、それぞれのアクセス時間と確率は以下の
表のように計算できます。
| 実アドレス の在処 | データ の在処 | アクセス時間 (ns) | 確率 |
| TLB | キャッシュ | 25+25+25=75 | 0.9×0.95=0.855 |
| TLB | 主記憶 | 25+25+200=250 | 0.9×0.05=0.045 |
| キャッシュ | キャッシュ | 25+25+25+25+25=125 | 0.1×0.95×0.95=0.09025 |
| キャッシュ | 主記憶 | 25+25+25+25+200=300 | 0.1×0.95×0.05=0.00475 |
| 主記憶 | キャッシュ | 25+25+200+25+25=300 | 0.1×0.05×0.95=0.00475 |
| 主記憶 | 主記憶 | 25+25+200+25+200=475 | 0.1×0.05×0.05=0.00025 |
| 平均アクセス時間 | = 75 × 0.855 + 250 × 0.045 + 125 × 0.09025 + 300 × 0.00475 + 300 × 0.00475 + 475 × 0.00025 |
| = 89.625 ns |