COMPUTER ARCHITECTURE / CACHE / MEMORY HIERARCHY
メモリの仕組みを回路から理解する|SRAM・DRAM・フラッシュ・キャッシュ制御と実効アクセス時間
公開日:2026-10-14
スマートフォンでアプリを開くとき、CPUは必要な値を何度も読み出しています。しかし、CPUの計算が速くても、データを取りに行く時間が長いと待ち時間が発生します。その待ち時間を減らすための仕組みがキャッシュメモリです。まず「よく使う資料を机に置く」例から仕組みを理解し、最後に平均アクセス時間を自分で計算できるようにします。
身近な例 → CPUと記憶装置 → 階層ノード図 → ヒットとミス → 局所性 → 実効アクセス時間 → 計算モデルの違い → L1/L2/L3 → キャッシュの設計 → 操作ラボ
01|なぜCPUにはキャッシュが必要なのでしょうか
資料を使って仕事をするとき、すべての資料を遠くの書庫へ取りに行くのは大変です。よく使う資料を机の上へ置いておけば、必要なときにすぐ取り出せます。この机の上の資料に相当するものがキャッシュです。
作業者
計算の仕事を進めるCPUです
机の上
よく使う資料を置くキャッシュです
書庫
多くの資料を保存する主記憶です
CPUは演算する速度が非常に速いため、主記憶を毎回待っていると処理が進みにくくなります。そこで、使いそうなデータを容量は小さいものの高速なキャッシュに置いておくのです。
02|CPU・レジスタ・主記憶の役割を整理します
CPUは命令を実行し、レジスタはCPUが今扱っている値を保持します。主記憶(メインメモリ、通常はDRAM)は、実行中のプログラムやデータを大量に保持します。これらの間に複数段のキャッシュを置くことで、CPUから見た平均の読出し待ち時間を短くします。
概念図です。容量や速度の実際の関係は製品やアーキテクチャによって異なります。
03|キャッシュが見つかるとき・見つからないとき
CPUが要求したデータがキャッシュにあればキャッシュヒット、なければキャッシュミスと呼びます。ヒットなら速く処理でき、ミスなら下位の記憶階層を確認します。
| 用語 | 意味 | 具体例 |
|---|---|---|
| ヒット | 必要なデータがキャッシュにあります | 机の上に資料が置いてあります |
| ミス | 必要なデータがキャッシュにありません | 書庫へ取りに行きます |
| ヒット率 | 全アクセスのうちヒットした割合です | 100回中95回ヒットなら95%です |
| ミス率 | 全アクセスのうちミスした割合です | ヒット率95%ならミス率5%です |
04|なぜ同じデータがまた使われるのでしょうか
プログラムのアクセス先には偏りがあります。これを参照の局所性といいます。例えば、ゲームで毎フレーム同じプレイヤー情報を読んだり、配列を先頭から順番に処理したりする場合です。
| 局所性 | 意味 | 身近な例 |
|---|---|---|
| 時間的局所性 | 最近使ったデータを近いうちにまた使いやすいです | 毎回同じ設定値を確認します |
| 空間的局所性 | ある場所を使った後、その近くの場所も使いやすいです | 配列の隣の要素を順番に読みます |
キャッシュは通常、データをキャッシュラインというまとまりで保存します。このため隣接するデータへのアクセスにも対応できます。局所性が高い処理ではヒット率が上がりやすくなります。
05|平均アクセス時間は『速いときと遅いときの平均』です
例えば100回の読出しのうち95回が高速、5回が低速なら、すべてを高速時間で計算することはできません。速い場合と遅い場合の時間をそれぞれの発生割合で重み付けして平均します。
100回アクセス
CPUがデータを要求します
95回ヒット
速い経路で取得します
5回ミス
遅い経路で取得します
加重平均とは、単純に2つの時間を足して2で割るのではなく、95%と5%という確率を掛け合わせて計算する方法です。
06|基本の実効アクセス時間を計算しましょう
まず、ヒット時はキャッシュのアクセス時間、ミス時は主記憶のアクセス時間とみなすモデルを考えます。これはヒット時とミス時の所要時間を排他的に選ぶ基本的な加重平均です。
実効アクセス時間 T
= ヒット率 × キャッシュの時間
+ ミス率 × 主記憶の時間
T = h × Tc + (1 − h) × Tm主記憶の時間を1とし、キャッシュ時間がその1/30、ヒット率が95%なら、次のようになります。
h = 0.95
1 − h = 0.05
Tc = 1 / 30
Tm = 1
T = 0.95 × (1 / 30) + 0.05 × 1
= 0.031666... + 0.05
= 0.081666...
≒ 0.08(主記憶時間を1とした比)計算結果
約 0.08 倍
このモデルでは、主記憶だけで毎回アクセスする場合と比べて、平均待ち時間が大幅に短くなります。
07|公式が違って見える理由:キャッシュ確認の時間
技術書でAMAT(Average Memory Access Time)を調べると、次の別の公式を見ることがあります。式が異なる理由は「ミスしたとき、キャッシュ確認にかかった時間を含むのか」という前提が違うためです。
| モデル | ミス時にかかる時間 | 平均式 |
|---|---|---|
| 二者択一の加重平均 | 主記憶時間 Tm とみなします | hTc + (1−h)Tm |
| キャッシュを先に確認する逐次モデル | キャッシュ確認時間 Tc に、追加のミスペナルティ P がかかります | Tc + (1−h)P |
例えばキャッシュ確認1ns、ミス後の追加読出し30nsであれば、逐次モデルの平均は 1 + 0.05×30 = 2.5ns です。同じ30nsを「ミス時の全所要時間」と定義した場合には、この2.5nsとは別の数値になります。公式を選ぶ前に、ミス時間の定義を確認することが大切です。
08|L1・L2・L3キャッシュの役割
現代のCPUには複数のキャッシュ階層があることが一般的です。L1は小容量で高速、L2はその次、L3は複数コアで共有される構成もあります。実際の配置・共有の有無・性能はCPUによって異なります。
CPU → L1
まず近くの高速キャッシュを確認します
L2 → L3
ミスなら下位のキャッシュを確認します
DRAM
それでもなければ主記憶から取得します
多段キャッシュでは、ローカルヒット率とグローバルヒット率を区別します。L2のローカルヒット率は「L1でミスしてL2へ到達したアクセスのうち、L2でヒットした割合」です。全CPUアクセスに占める割合ではありません。
09|2段キャッシュの平均時間を具体的に計算します
L1ヒット時間を1ns、L1ミス率を10%、L2確認に4ns、L2ローカルミス率を20%、主記憶へ到達したときの追加時間を60nsとします。各時間は前段での確認時間を含まない追加時間とします。
AMAT = tL1 + mL1 × (tL2 + mL2 × Pmem)
= 1 + 0.10 × (4 + 0.20 × 60)
= 1 + 0.10 × 16
= 2.6 ns10回のうち1回しかL2へ進まず、L2へ進んだうち5回に1回だけ主記憶へ進むため、主記憶アクセスの遅さが平均全体へ与える影響を抑えられます。
10|キャッシュミスにも種類があります
| 分類 | 何が起きるのか | 対策の考え方 |
|---|---|---|
| 初回ミス(compulsory) | 初めて参照するデータがまだありません | 先読みなどを検討します |
| 容量ミス(capacity) | 必要なデータがキャッシュ容量に収まりません | キャッシュ容量や作業集合を見直します |
| 競合ミス(conflict) | 配置先の制約でデータが追い出されます | 連想度や配置方法を工夫します |
キャッシュの配置方式には、ダイレクトマップ、セットアソシアティブ、フルアソシアティブなどがあります。置き場所が限定されるほどハードウェアは比較的単純になりますが、競合が起きる場合があります。
11|タグ・インデックス・オフセットとは何でしょうか
キャッシュはメモリアドレスを手掛かりに、目的のラインが存在するかを調べます。単純な構成では、アドレスをタグ・インデックス・オフセットに分けます。インデックスで候補となる場所を選び、タグを比較し、オフセットでライン内の位置を指定します。
タグ
このラインが目的のものか照合します
インデックス
候補のセットを選びます
オフセット
ライン内のデータ位置を選びます
12|書込みと置換にもルールがあります
キャッシュを理解するには読出しだけでなく書込みの扱いも重要です。ライトスルーは書込み時に下位の記憶階層にも反映する考え方です。ライトバックはキャッシュ内で変更を保持し、必要なときに下位へ反映します。また、ラインの置換にはLRUを近似した方式などが使われます。
| 方式 | 考え方 | 注意点 |
|---|---|---|
| ライトスルー | 書込みを下位階層にも反映します | 書込みトラフィックが増えることがあります |
| ライトバック | 変更したラインを後で書き戻します | ダーティビットなどで変更状態を管理します |
| LRU型の置換 | 最近使っていないラインを追い出す考え方です | 完全なLRUは実装コストがかかる場合があります |
13|操作ラボ:ヒット率と時間の関係を確かめます
ヒット率を変更しながら、基本の加重平均モデルと逐次確認モデルの違いを比べてください。さらに20回のアクセスを進めると、理論平均と有限回の観測値が一致しない場合があることも体験できます。
INTERACTIVE LAB / MEMORY ACCESS
ヒット率と平均待ち時間を動かして確かめましょう
スライダーを動かすと、CPUがデータを取り出す平均時間が変わります。まず「基本例」を選び、ヒット率を95%から下げてみてください。下部のタイムラインでは個々のアクセスを進められます。
平均アクセス時間
2.45 ns
ヒット/ミスを加重平均します
主記憶に対する比率
0.082 倍
主記憶時間を1とした割合です
主記憶のみとの速度比
12.245 倍
平均時間を比較した理想化モデルです
CALCULATION
ヒット率 h = 95/100 = 0.95
ミス率 1 − h = 0.05
T = h × Tc + (1 − h) × Tm
= 0.95 × 1 + 0.05 × 30
= 2.45 ns
20回のアクセスを1回ずつ進める
青い枠はヒット、橙色はミスを表します。各マスをクリックするとヒットとミスを切り替えられます。ヒット率スライダーは理論平均、下の20回は操作できる個別のサンプルです。
処理済み 0 回/ミス 0 回/合計 0 ns/実測平均 —
この20回の実測平均は、上のヒット率から求めた理論平均と必ずしも一致しません。
14|混同しやすい用語を整理します
| 用語 | 意味 | 関連する視点 |
|---|---|---|
| レイテンシ | 1回のアクセスが完了するまでの時間です | 待ち時間を短くしたいです |
| スループット | 単位時間あたりに処理できるアクセス数です | 同時実行や帯域幅も影響します |
| ヒット率 | 目的のデータがキャッシュにある割合です | 高くてもヒット時間が長ければ不利な場合があります |
| AMAT | 階層構造を含めた平均アクセス時間です | 時間の定義と確率に注意します |
| TLB | 仮想アドレスの変換結果をキャッシュする仕組みです | データキャッシュとは目的が異なります |
15|まとめ:速いメモリを『よく使う場所』へ置きます
キャッシュは、CPUと主記憶の速度差を埋めるために、よく使うデータを高速な記憶領域へ置く仕組みです。効率のよさを左右するのはヒット時間・ミス率・ミスによる追加時間です。
まず「100回中何回ヒットするか」で直感的に平均を考え、次に加重平均の式へ進むと理解しやすくなります。多段キャッシュを扱う場合は、その場でのヒット率と追加でかかる時間を区別すると、計算を間違えにくくなります。
16|記憶回路の入口:NOR・NANDから理解します
CPUが計算するだけなら、ANDやORなどで入力から出力を決められます。しかし「前回の結果を残す」には、出力を回路へ戻す帰還(フィードバック)が必要です。身近な例では、照明スイッチが現在のON/OFF状態を保持するイメージです。入力を組み合わせる回路と、過去の状態を覚える回路を分けて考えましょう。
| 入力 A, B | NOR = NOT(A OR B) | NAND = NOT(A AND B) |
|---|---|---|
| 0, 0 | 1 | 1 |
| 0, 1 | 0 | 1 |
| 1, 0 | 0 | 1 |
| 1, 1 | 0 | 0 |
NOR型SRラッチは出力を互いの入力へ戻す帰還によって、入力が変わった後も状態を保ちます。図は相互接続の概念を簡略化したもので、セット・リセット端子の定義と禁止入力は以下の表で確認してください。
NORとNANDは、いずれも組み合わせ次第でほかの論理ゲートを構成できる万能ゲートです。2つを交差結合すると記憶するラッチを構成できます。NOR型SRラッチは、S=1でセット(Q=1)、R=1でリセット(Q=0)し、S=R=0で保持します。S=R=1は通常の記憶用途では禁止条件です。
| S | R | NOR型SRラッチのQ |
|---|---|---|
| 0 | 0 | 直前の値を保持します |
| 1 | 0 | 1をセットします |
| 0 | 1 | 0へリセットします |
| 1 | 1 | 禁止条件です。解除後の状態を保証できません |
17|ラッチとフリップフロップ:いつ値が変わるのか
ラッチは一般にレベル感度で、イネーブルが有効な間は入力の変化を反映します。一方、典型的なDフリップフロップはクロックの立上りまたは立下りの瞬間に値を取り込み、その後は保持します。CPUでは処理段階を切り替えるタイミングをそろえる用途で重要です。
入力D
次に保持したい1ビットです
クロックの有効エッジ
値を取り込むタイミングです
Dフリップフロップ
次のエッジまでQを保持します
パイプラインレジスタ
命令処理の中間結果を同期します
ここでのDフリップフロップは動作の概念図です。実回路にはマスタ・スレーブ方式などがあります。
| 部品 | 主な特徴 | 身近な対応 |
|---|---|---|
| ラッチ | イネーブルレベルで透過/保持を切り替えます | 開いている間は内容が見える窓です |
| Dフリップフロップ | クロックエッジで取り込みます | 定時に撮影するカメラです |
| レジスタ | 複数ビットの状態を保持します | CPU内の作業用メモです |
| SRAMセル | 相互帰還で電源中に値を保持します | 小さな記憶セルの集合です |
18|SRAMの回路:キャッシュに使いやすい理由
SRAMはStatic RAMの略で、代表的な6Tセルは2つのCMOSインバータの相互帰還と、2つのアクセス用トランジスタから成り立ちます。1ビットを記憶するための回路が比較的大きい一方、読み書きが高速で、電源がある限り周期的なリフレッシュを必要としません。
図は配線と構成を簡略化した学習用概念図です。左右のインバータがそれぞれ2トランジスタで計4個、ビット線へのアクセス用が2個で合計6個です。電源供給中はセルの状態を保持できます。
行アドレス
ワード線WLを選択します
アクセスTr
BL・BL̅へセルをつなぎます
センスアンプ
ビット線の差を読み取ります
CPU側へ
値を届けます
SRAMは通常L1/L2/L3キャッシュなどで利用されます。高速ですが、同じ容量ならDRAMより回路面積が大きくなりやすいです。
19|DRAMの回路:主記憶の容量を増やせる理由
DRAMはDynamic RAMの略で、代表的なセルはトランジスタ1個とコンデンサ1個(1T1C)です。小さなセルを高密度に並べやすいので、大容量の主記憶に向いています。ただし、コンデンサの電荷は少しずつ漏れるため、一定周期で内容を回復させるリフレッシュが必要です。
これは1トランジスタ+1コンデンサ(1T1C)の概念図です。電荷が自然に失われるのでリフレッシュが必要です。読出し時にセルの電荷状態が変わるため、通常はセンスアンプで増幅して書き戻します。
| 視点 | SRAM | DRAM |
|---|---|---|
| セルの基本構成 | 6T型が代表的です | 1T1C型が代表的です |
| データの保持 | 電源中は基本的にリフレッシュ不要です | 周期的なリフレッシュが必要です |
| 密度とコスト | セルが大きく、同容量で高価になりやすいです | 高密度で大容量化しやすいです |
| 主な用途 | CPUキャッシュなどです | 主記憶(メインメモリ)などです |
| 揮発性 | あります | あります |
20|フラッシュメモリ:電源を切っても残る理由
フラッシュメモリは電源を切っても情報が残る不揮発性メモリです。データを記憶するには、電荷を閉じ込めるフローティングゲートや電荷捕獲層を使い、トランジスタのしきい値電圧を変化させます。RAMのように自由な小単位で上書きするのではなく、消去と書込みに制約があります。
書込み
記憶層へ電荷状態を作ります
電源OFF
電荷状態を保ちます
読出し
しきい値の違いを判定します
データを復元
保存したビット列を得ます
実際のNANDフラッシュはページ単位の読出し・書込み、ブロック単位の消去などの制約があります。
| 比較 | NORフラッシュ | NANDフラッシュ |
|---|---|---|
| セルの接続 | 並列的な接続が基本です | 複数セルの直列接続が基本です |
| 得意なアクセス | 細かなランダム読出しや直接実行(XIP)などです | 高密度なデータ保存、連続転送などです |
| 用途 | ファームウェアの保存などです | SSD・USBメモリ・SDカードなどです |
| 注意 | NAND/NORゲートとの名前の関係はありますが、単純な論理ゲートの集まりという意味ではありません | 消去・書換え回数には制限があり、ウェアレベリングやECCを利用します |
21|記憶装置を一つの地図で整理します
レジスタ
フリップフロップなどの高速な状態保持
CPUキャッシュ
主にSRAMを使って高速化
主記憶
主にDRAMで大容量化
SSD・フラッシュ
NAND型などで不揮発化
一般的な階層を模式化しています。各装置の材料や内部構造は製品によって異なります。
速度、容量、コスト、不揮発性はトレードオフになります。例えばCPUが同じデータを何度も使うとき、高速なSRAMキャッシュにコピーを置けば、DRAMへ毎回取りに行く時間を減らせます。一方、SSDに保存した内容をCPUが直接同じ速度で利用できるわけではありません。
22|キャッシュの割付方式:住所をどこへ置くのでしょうか
キャッシュは通常、データをキャッシュライン単位で保存します。メモリアドレスは大まかに「タグ・インデックス・オフセット」に分けて扱います。例えばキャッシュラインを16バイト、セットを4つとすると、アドレス80のライン番号は5、セット番号は5 mod 4 = 1、ライン内の位置は80 mod 16 = 0です。
アドレス80
CPUがアクセスする番地です
ライン番号 5
floor(80 / 16) = 5
セット番号 1
5 mod 4 = 1
オフセット 0
80 mod 16 = 0
セット番号の算出は、セット数が2のべき乗である典型的な方式の例です。
| 方式 | 格納先の決め方 | 長所・短所 |
|---|---|---|
| ダイレクトマップ | 1つのラインは1つのセットだけへ入ります | 回路が単純ですが競合ミスが増えやすいです |
| フルアソシアティブ | 空いている任意のラインへ入れられます | 柔軟ですが探索回路・比較器が複雑になりやすいです |
| nウェイ・セットアソシアティブ | 決まったセットのn本のうち1本へ入れます | 速度・コスト・ミス率のバランスを取れます |
例えばアドレス0と64は、ラインサイズ16B・4セットの場合、ライン番号0と4なので、どちらもセット0へ向かいます。ダイレクトマップでは互いを追い出しますが、2ウェイなら同じセットに同時に保存できる可能性があります。
23|ライン置換:満杯なら何を追い出しますか
セットが満杯の場合、別のラインを入れるために既存のラインを置換する必要があります。LRUは最近最も長く使われていないラインを優先し、FIFOは古く入ったラインを、Randomはランダムに選びます。完全なLRUはウェイ数が増えると管理が複雑になるため、実装によって近似LRUを使います。
| 方式 | 選び方 | 覚え方 |
|---|---|---|
| LRU | 最後の使用が最も古いラインです | 最近使っていないものから入れ替えます |
| FIFO | 最も早く格納されたラインです | 先に入れたものから出します |
| Random | 候補からランダムに選びます | 履歴管理を単純化できます |
キャッシュにないときでも「なぜないのか」に違いがあります。初回のアクセスで発生する強制ミス、入れられる場所が衝突する競合ミス、容量が足りない容量ミスを区別すると、割付方式やキャッシュサイズの効果を理解しやすくなります。
24|ライトスルーとライトバック:更新をいつ主記憶へ反映しますか
レジスタからキャッシュへ書き込むだけでは、主記憶が古い値のままになることがあります。ライトスルーは書込み時に下位階層へも反映し、ライトバックはキャッシュの変更内容をダーティビットで管理して、追い出すときなどにまとめて書き戻します。
CPUが更新
値を変更します
キャッシュ更新
新しい値を保持します
下位階層も更新
書込みが下位へ伝わります
書込みバッファなどによりCPUが下位階層の完了を待たずに進む実装もあります。
CPUが更新
値を変更します
ダーティ=1
キャッシュに変更済みを記録します
置換などのタイミング
必要時に下位階層へ書き戻します
この方式ではキャッシュだけに最新値が残る時間があります。マルチコアでは一貫性維持の仕組みも重要です。
| 方式 | 書込みヒット時 | メリット・留意点 |
|---|---|---|
| ライトスルー | キャッシュと下位階層へ書き込みます | 管理しやすい一方、書込みトラフィックが増えます |
| ライトバック | キャッシュを更新しダーティにします | 下位への書込みを減らせますが、追出し時に追加処理が要ります |
| ライトアロケート | 書込みミスでラインをキャッシュへ取り込みます | ライトバックと組み合わせることが多いです |
| ノーライトアロケート | 書込みミスでは通常キャッシュに取り込みません | ライトスルーと組み合わせることが多いです |
25|メモリインタリーブ:複数のバンクで待ち時間を重ねます
メモリインタリーブは、連続するアドレスを複数のメモリバンクへ分散させ、アクセスを重ね合わせやすくする技術です。例えば4バンクなら、連続する単位の番地0、1、2、3をバンク0、1、2、3へ順に割り振れます。1回のアクセスの遅延そのものを4分の1にするわけではなく、主に連続アクセス時の処理量(帯域幅)を改善する発想です。
アドレス0
バンク0へ
アドレス1
バンク1へ
アドレス2
バンク2へ
アドレス3
バンク3へ
図は連続する転送単位ごとの配分です。実機のバンク・チャネル・行アドレスの割付方式はメモリコントローラによって異なります。
連続アクセスに強い割付でも、同一バンクへ集中するパターンでは競合が起こりえます。CPUキャッシュのセットへの割付と、DRAMのバンクへの割付は、似たような剰余演算を使って説明できますが、解決したい問題は異なります。
26|実効時間の式と回路技術を結びつけます
SRAMキャッシュが速いのは、主に小さく高速な記憶階層をCPUに近づけられるためです。DRAMは大容量ですが、行やバンクの操作を伴います。両者を組み合わせることで、平均アクセス時間を短縮できます。
主記憶の時間を 1 とします。
キャッシュの時間は 1/30 です。
平均 = 0.95 × (1/30) + 0.05 × 1
≒ 0.0817 ≒ 0.0827|実践ラボ:論理ゲート・割付方式・書込み・バンクを操作します
NOR/NANDの出力、アドレスからセット番号を出す計算、ダイレクトと2ウェイの競合、ライトバックのダーティ状態、4バンクへの振分けを操作できます。先に回路のイメージをつかみ、次にキャッシュの住所計算を試してみてください。
MEMORY ARCHITECTURE LAB
回路からキャッシュ制御まで試してみましょう
① NOR・NANDを切り替えます
出力の違いを確認してください。NOR/NANDを交差結合するとラッチの基本回路になります。
② キャッシュ割付・書込みを再現します
ラインサイズ16バイト、4セットです。アドレス0・64を交互に読み、ダイレクトと2ウェイを切り替えてください。各セットの置換候補はLRU方式(最後に使ったラインを末尾)です。
アドレス0から始め、64も入れてみてください。どちらもセット0へ向かいます。
ヒット
0
ミス
0
書戻し
0
下位への書込み
0
セット 0
空き
セット 1
空き
セット 2
空き
セット 3
空き
シミュレーターは読出し・書込みミスともラインを取り込む簡略的なライトアロケート方式です。実機の書込みバッファやキャッシュ一貫性は省略しています。
③ メモリインタリーブを可視化します
番号0
Bank 0
番号1
Bank 1
番号2
Bank 2
番号3
Bank 3
番号4
Bank 0
番号5
Bank 1
番号6
Bank 2
番号7
Bank 3
番号8
Bank 0
番号9
Bank 1
番号10
Bank 2
番号11
Bank 3
番号12
Bank 0
番号13
Bank 1
番号14
Bank 2
番号15
Bank 3
例は連続する転送単位を単純に番号 mod バンク数で割り振る低位インタリーブです。実際のアドレスマッピングは製品依存です。