記憶階層とキャッシュメモリ
記憶装置の速さの順番、キャッシュメモリの目的と書込み方式、メモリインタリーブの定義を見分けられるようになる。実効アクセス時間とヒット率を、式を立てて計算できるようになる。
CPU は速いのに主記憶は遅い、というズレを埋める工夫は、科目Aで毎回のように出ます。特に「ヒット率から実効アクセス時間を出す」「実効アクセス時間からヒット率を逆算する」計算は、式を1本覚えれば確実に取れる得点源です。
このレッスンで稽古する(用語チェック・過去問)結論:速い順に並べると
記憶装置は速いものほど小さくて高いので、速さの違う装置を何段か重ねて使います。これを記憶階層と呼びます。速い順に並べると次のとおりです。
レジスタ → キャッシュメモリ(1次 → 2次) → 主記憶 → 磁気ディスク
flowchart LR
R["レジスタ(CPU内部・最速・極小)"] --> L1["1次キャッシュ"]
L1 --> L2["2次キャッシュ"]
L2 --> M["主記憶(メインメモリ)"]
M --> D["磁気ディスク(最も遅い・大容量)"]
たとえるなら、レジスタは手に持っている書類、キャッシュは机の上、主記憶は部屋の本棚、磁気ディスクは別棟の倉庫です。いま使う物ほど手元に置けば、取りに行く時間が短くなります。
「アクセス時間の最も短い記憶装置はどれか」と聞かれたら、答えはレジスタです。選択肢の「2次キャッシュ」は「キャッシュ=最速」という思い込みを狙ったひっかけです。
キャッシュメモリの目的と、ミスしたときの動き
キャッシュメモリは、CPU と主記憶のあいだに置く小さくて速いメモリです。目的はプロセッサの処理速度と主記憶のアクセス速度の差を埋めることです。
一度主記憶から読んだデータをキャッシュに残しておけば、次に同じデータを読むときは主記憶まで行かずに済みます。求めるデータがキャッシュにあることをヒット、無いことを**ミス(ミスヒット)**と呼びます。
ミスしたときは、キャッシュ制御装置(ハードウェア)が主記憶から必要なデータをブロック単位で転送し、キャッシュに読み込みます。誤りの選択肢によく出る次の3つを覚えておきましょう。
- 「割込みが起きて、プログラムが転送する」→ 誤り。転送はハードウェアが行う
- 「磁気ディスクから読み込む」→ 誤り。キャッシュの1段下は主記憶
- 「ミスするとキャッシュ全体を一括消去する」→ 誤り。入れ替えるのは必要なブロックだけ
目的を問う問題では、よく似た別の仕組みが選択肢に並びます。
| 選択肢の言い回し | 正体 |
|---|---|
| 主記憶とプロセッサの速度差を埋める | キャッシュメモリ(正解) |
| 仮想記憶のアドレス変換を速くする | TLB(仮想記憶側の仕組み) |
| 実記憶と仮想記憶の容量差を埋める | 仮想記憶の説明。キャッシュではない |
| よく使うプログラムを常駐させる | RAM ディスクなど、別の仕組み |
| キャッシュ上で命令をデコード・実行する/命令を並列処理する | キャッシュにそんな働きはない |
参照の局所性:キャッシュが効く理由
プログラムには「同じ場所をすぐまた使う(時間的局所性)」「近くの場所を続けて使う(空間的局所性)」というクセがあります。これを参照の局所性と呼び、キャッシュが効くのはこのクセがあるからです。
キャッシュは、命令を入れる命令キャッシュと、データを入れるデータキャッシュに分けられることがあります。命令キャッシュをよく効かせるには、頻繁に実行する処理部分を1か所にまとめるのが正解です。
ひっかけは「アクセスする作業領域(データ)をまとめる」です。これはデータキャッシュ向けの工夫なので、命令キャッシュを問われたら選びません。「全体を平均的に実行/アクセスする」は局所性を壊すので常に誤りです。
書込み方式:ライトスルーとライトバック
CPU がデータを書き込むとき、キャッシュと主記憶のどちらを、いつ書き換えるかで2つの方式があります。出題回数が多いので、表で区別しましょう。
| ライトスルー | ライトバック | |
|---|---|---|
| 書込みのしかた | キャッシュと主記憶に同時に書く | キャッシュだけに書く |
| 主記憶はいつ更新? | 毎回すぐ | そのデータがキャッシュから追い出されるとき(置換え時) |
| 主記憶への書込み回数 | 多い | 少ない(これがライトバックの目的) |
| キャッシュと主記憶の一致(コヒーレンシ) | 常に一致しているので保ちやすい | 一時的にずれるので管理が複雑 |
| 回路 | 単純 | 複雑 |
覚え方は名前のとおりです。スルー=主記憶まで素通しで書く、バック=あとで書き戻す。
「ライトバックを使う目的は?」と聞かれたら答えは主記憶への書込み頻度を減らすことです。「一貫性を保ちながら書き込む」「回路が簡単」はライトスルーの性質なので、ライトバックの目的としては誤りです。
多段キャッシュ(1次・2次)
主記憶と CPU の速度差が大きいときは、キャッシュを1次(L1)・2次(L2)…と多段にすると、実効アクセス時間(平均するとどれくらいで読めるか)を短くできます。1次は最も速く小さく、2次は1次より遅いが大きい、という関係です。
誤りの選択肢には「キャッシュは汎用レジスタと同じ働きをする」「転送ブロックを仮想記憶のページと同じ大きさにすると効率が上がる」が出ます。キャッシュはレジスタでも仮想記憶でもない、と切り分ければ消せます。
実効アクセス時間の計算
キャッシュがあるときの平均の読み出し時間は、次の1本の式で出します。h はヒット率(0〜1 の小数)です。
実効アクセス時間 = h × キャッシュのアクセス時間 + (1 − h) × 主記憶のアクセス時間
ヒットした割合ぶんはキャッシュの時間、ミスした割合 (1 − h) ぶんは主記憶の時間がかかる、という加重平均です。ヒット率が下がると実効アクセス時間は長くなります。逆に「キャッシュのアクセス時間の減少」「ミス率の低下」「ミスペナルティ(ミスしたときの追加時間)の減少」は、どれも時間を短くする要因です。
注意点は、キャッシュありが常に速いとは限らないことです。ヒット率が低く主記憶が遅い構成は、キャッシュなしの速い主記憶に負けることがあります(下の例題で確認します)。
ヒット率の逆算(最頻出)
実効アクセス時間やほかの条件が分かっていて、ヒット率 h を求める問題が最も多く出ています。使う式は上と同じで、h を未知数にして方程式を解くだけです。
手順は3つです。①式に数値を入れる、②(1 − h) を展開して h の1次方程式にする、③h について解く。
「2種類の CPU の処理時間が等しかった」という形の問題は、それぞれの実効アクセス時間を式にして、イコールで結ぶだけです。
選択肢には、h と 1 − h を取り違えた値(0.9 が正解なら 0.1)が入っていることがあります。ただし 2024年の問題(選択肢 0.75/0.90/0.95/0.96)のように 0.1 が無い問題もあるので、選択肢に頼らず式に戻して確かめるのが確実です。h はキャッシュ側の時間に掛ける、と覚えておけば取り違えません。
メモリインタリーブ(出題回数トップ)
メモリインタリーブは、主記憶を独立して動く複数のバンク(グループ)に分け、各バンクに並列(交互)にアクセスして高速化する方式です。1つのバンクが前のアクセスの後処理をしている間に、別のバンクへ次のアクセスを始められます。
たとえるなら、レジが1台だと会計が終わるまで次の人が待ちますが、レジを4台にして順番に振り分ければ待ち時間が減る、というイメージです。キャッシュのように「速いメモリを足す」のではなく、主記憶そのものを分けて同時に動かす点が違います。
選択肢には、ほかの高速化技術の説明が並びます。キーワードで見分けましょう。
| 選択肢のキーワード | 正体 |
|---|---|
| 主記憶を複数のバンク/独立したグループに分け、並列・交互にアクセス | メモリインタリーブ(正解) |
| 主記憶の一部をキャッシュにコピーして速度差を縮める/高速小容量メモリを置く | キャッシュメモリ |
| キャッシュと主記憶に同時に書く | ライトスルー |
| キャッシュに書き、あふれた(追い出す)ときに主記憶へ書く | ライトバック |
| CPU を経由せず主記憶と入出力装置が直接やり取り | DMA |
| CPU と磁気ディスクの間に半導体メモリのバッファ | ディスクキャッシュ |
| キャッシュを命令用とデータ用に分離 | キャッシュの分離(ハーバード型の構成) |
| アクセスが終わってから次へ移る | 並列化していないので逆の説明 |
「バンク」「分割して並列」の2語があればインタリーブ、と決めて構いません。
実効アクセス時間を比べて並べる(A〜D)
| キャッシュメモリ 有無 | キャッシュメモリ アクセス時間(ナノ秒) | キャッシュメモリ ヒット率(%) | 主記憶 アクセス時間(ナノ秒) | |
|---|---|---|---|---|
| A | なし | − | − | 15 |
| B | なし | − | − | 30 |
| C | あり | 20 | 60 | 70 |
| D | あり | 10 | 90 | 80 |
ア A, B, C, D
イ A, D, B, C
ウ C, D, A, B
エ D, C, A, B
解き方と答えを見る
- 式:実効アクセス時間 = h × キャッシュ時間 + (1 − h) × 主記憶時間
- A:キャッシュなし → 主記憶の 15 ナノ秒そのまま
- B:キャッシュなし → 主記憶の 30 ナノ秒そのまま
- C:h = 0.6 → 0.6 × 20 + 0.4 × 70 = 12 + 28 = 40 ナノ秒
- D:h = 0.9 → 0.9 × 10 + 0.1 × 80 = 9 + 8 = 17 ナノ秒
- 短い順に並べる:A(15) → D(17) → B(30) → C(40)
- C はキャッシュありなのに、ヒット率が低く主記憶が遅いので、キャッシュなしの B より遅い
答え:A, D, B, C の順で、正解はイ(2014h26a_am#11 も同じ数値・同じ答え)
実効アクセス時間 15 ナノ秒からヒット率を逆算する
ア 0.1
イ 0.17
ウ 0.83
エ 0.9
解き方と答えを見る
- 分かっている値:キャッシュ 10 ナノ秒、主記憶 60 ナノ秒、実効 15 ナノ秒。ヒット率を h とおく
- 式を立てる:10h + 60(1 − h) = 15
- 展開する:10h + 60 − 60h = 15
- まとめる:60 − 50h = 15
- 移項する:50h = 45
- 解く:h = 45 ÷ 50 = 0.9
- 検算:0.9 × 10 + 0.1 × 60 = 9 + 6 = 15 で一致
答え:ヒット率は 0.9 で、正解はエ(0.1 はミス率と取り違えた値)
2つの CPU の処理時間が等しいときのヒット率
| CPU X | CPU Y | |
|---|---|---|
| キャッシュメモリ | 40 | 20 |
| 主記憶 | 400 | 580 |
ア 0.75
イ 0.90
ウ 0.95
エ 0.96
出典:令和6年度 基本情報技術者試験 科目A 公開問題 問3
解き方と答えを見る
- ヒット率を h とおく(他の条件は同じなので、実効アクセス時間が等しければ処理時間も等しい)
- CPU X:40h + 400(1 − h) = 40h + 400 − 400h = 400 − 360h
- CPU Y:20h + 580(1 − h) = 20h + 580 − 580h = 580 − 560h
- 等しいとおく:400 − 360h = 580 − 560h
- 移項する:560h − 360h = 580 − 400 → 200h = 180
- 解く:h = 180 ÷ 200 = 0.9
- 検算:X = 400 − 324 = 76、Y = 580 − 504 = 76 で一致
答え:ヒット率は 0.90 で、正解はイ(図のキャッシュ容量 256k バイト・主記憶 256M バイトは計算に使わない)
要点(試験直前に読む)
- 速い順は レジスタ → キャッシュ(1次→2次) → 主記憶 → 磁気ディスク。最速はレジスタ。
- キャッシュの目的は、プロセッサと主記憶の速度差を埋めること。ミスしたら制御装置が主記憶からブロック転送する。
- ライトスルー=キャッシュと主記憶に同時に書く。ライトバック=キャッシュだけに書き、追い出し時に主記憶へ。ライトバックの目的は主記憶への書込み頻度を減らすこと。
- 実効アクセス時間 = h × キャッシュ時間 + (1 − h) × 主記憶時間。ヒット率の逆算も同じ式で h を解くだけ。
- メモリインタリーブ=主記憶を複数のバンクに分けて並列(交互)にアクセスする方式。
ひっかけ
- 「アクセス時間が最も短い」に2次キャッシュを選ばせる。CPU 内部のレジスタのほうが速い。
- ヒット率の計算で h と 1 − h を取り違える。選択肢にその値(0.9 が正解なら 0.1)が入っていることがあるが、無い問題もある(2024年は 0.75/0.90/0.95/0.96)。h はキャッシュ側の時間に掛けると覚え、検算で確かめる。
- 「キャッシュありは必ず速い」と思わせる。ヒット率が低いと、キャッシュなしの速い主記憶より遅くなることがある(2019年の C)。
- ライトバックの目的に「一貫性(コヒーレンシ)を保つ」「回路が簡単」を混ぜる。どちらもライトスルーの性質。
- メモリインタリーブの選択肢に DMA(CPU を経由しない)、ライトバック(あふれたら主記憶へ)、キャッシュ(一部をコピー)、ディスクキャッシュの説明を並べる。「バンクに分けて並列・交互」だけが正解。
用語(17)
速くて小さい記憶装置から遅くて大きい記憶装置までを段々に重ねて、速さと容量を両立させる構成。
CPU の内部にある、演算中の値を置く最も速くて最も小さい記憶装置。
⚠ キャッシュメモリと混同しやすい。CPU 内部で最速なのはレジスタで、キャッシュはその次。
CPU と主記憶のあいだに置き、一度使ったデータを残して処理速度とアクセス速度の差を埋める高速・小容量のメモリ。
⚠ ディスクキャッシュは主記憶と磁気ディスクの間に置くもので別物。
実行中のプログラムとデータを置くメインメモリで、キャッシュより遅く磁気ディスクより速い。
多段にしたキャッシュで、1次が最も速く小さく、2次は1次より遅いが大きい。
⚠ 多段にする目的は実効アクセス時間の短縮。
読み出したいデータがキャッシュに見つかった割合で、実効アクセス時間の式ではキャッシュ側の時間に掛ける。
⚠ ミス率(1 − ヒット率)と取り違えやすい。0.9 と 0.1 を逆にしない。
キャッシュにデータが無かったときに、主記憶から取ってくるために余分にかかる時間。
⚠ 減少すると実効アクセス時間は短くなる。増加の原因として選ばない。
ヒットとミスを平均した実際の読み出し時間で、h × キャッシュ時間 + (1 − h) × 主記憶時間で求める。
同じ場所をすぐまた使う(時間的)、近くの場所を続けて使う(空間的)というプログラムのクセで、キャッシュが効く理由になる。
⚠ 命令キャッシュには「よく実行する処理をまとめる」、データキャッシュには「作業領域をまとめる」が効く。
キャッシュミスのとき、キャッシュ制御装置が主記憶から必要なデータをまとまった単位で転送すること。
⚠ 転送元は主記憶で磁気ディスクではない。割込みやプログラムで転送するのでもない。
書込みのたびにキャッシュと主記憶を同時に書き換える方式。
⚠ ライトバックとの違いは主記憶を書くタイミング。スルー=毎回すぐ、バック=追い出されるとき。
キャッシュだけを書き換え、そのデータがキャッシュから追い出されるときに主記憶へ書き戻す方式で、主記憶への書込み回数を減らせる。
⚠ 一貫性を保ちやすい・回路が単純なのはライトスルーのほう。
キャッシュと主記憶など、同じデータの複数のコピーの内容が一致している状態。
⚠ 保ちやすいのはライトスルー。ライトバックの目的ではない。
主記憶を独立して動く複数のバンクに分け、各バンクに並列(交互)にアクセスして高速化する方式。
⚠ キャッシュ(速いメモリを足す)とは違い、主記憶そのものを分ける。キーワードは「バンク」「並列・交互」。
CPU を経由せずに、主記憶と入出力装置などのあいだで直接データを転送する方式。
⚠ メモリインタリーブの選択肢に紛れ込む。「CPU 経由でなく」とあれば DMA。
CPU(主記憶)と磁気ディスクのあいだに半導体メモリを置き、ディスクの読み書きを速くする仕組み。
⚠ キャッシュメモリ(CPU と主記憶のあいだ)と置き場所が違う。
仮想記憶の仮想アドレスから実アドレスへの変換結果を保持して、アドレス変換を速くするバッファ。
⚠ 「アドレス変換を高速に行う」はキャッシュメモリの目的ではなく TLB の説明。
このレッスンの過去問
- 記憶階層のアクセス速度順序基本情報技術者試験 科目A免除 修了試験 20260125 実施分 問9
- キャッシュメモリの使用目的(速度差の緩和)平成28年度 春期 基本情報技術者試験 午前 問11
- キャッシュメモリの参照局所性(命令の局所性)平成22年度 春期 基本情報技術者試験 午前 問11
- キャッシュミス時の動作(主記憶からブロック転送)平成25年度 秋期 基本情報技術者試験 午前 問10
- キャッシュメモリの書込み方式(ライトスルー・ライトバック)平成30年度 春期 基本情報技術者試験 午前 問11
- キャッシュメモリの多段構成平成24年度 春期 基本情報技術者試験 午前 問13
- キャッシュ付き主記憶の実効アクセス時間の計算平成31年度 春期 基本情報技術者試験 午前 問10
- キャッシュヒット率の逆算(実効アクセス時間から)令和6年度 基本情報技術者試験 科目A 公開問題 問3
- メモリインタリーブの定義令和5年度 基本情報技術者試験 科目A 公開問題 問3