メモリアーキテクチャとは?半導体メモリ・キャッシュ・記憶階層を基礎から理解しよう
はじめに
CPUがどれだけ高速でも、必要なデータをメモリから取得するのに時間がかかってしまえば、CPUはその間待つことになります。
CPU
│
│「データください!」
↓
メモリ
│
│ データを取得
↓
CPU
そこでコンピュータでは、
- 高速なメモリをCPUの近くに置く
- よく使うデータをキャッシュする
- 複数のメモリへ並行してアクセスする
など、さまざまな工夫が行われています。
この記事では、
半導体メモリ
↓
記憶階層
↓
キャッシュメモリ
↓
実効アクセス時間
↓
キャッシュへの割付
↓
データの整合性
↓
メモリインタリーブ
という流れで、メモリアーキテクチャを学んでいきましょう。
1. 半導体メモリとは
**半導体メモリ(Semiconductor Memory)**とは、
半導体を利用してデータを記憶する装置
です。
大きく、
半導体メモリ
│
├─ 揮発性メモリ
│ ├─ SRAM
│ └─ DRAM
│
└─ 不揮発性メモリ
├─ フラッシュメモリ
└─ FeRAM
に分類できます。
最初に覚えたいのが、
揮発性か不揮発性か
という違いです。
2. 揮発性メモリ
**揮発性メモリ(Volatile Memory)**とは、
電源を切ると記憶していたデータが失われるメモリ
です。
代表的なものが、
- SRAM
- DRAM
です。
PCの電源を切ったときに、メインメモリ上の作業中データが消えるのもこのためです。
3. SRAM
**SRAM(Static Random Access Memory)**とは、
フリップフロップ回路などを利用してデータを保持する高速な半導体メモリ
です。
SRAMの特徴は、
- 高速
- リフレッシュ不要
- 消費電力や回路面積が大きくなりやすい
- DRAMより高価
- 大容量化には向きにくい
などです。
高速であるため、主に、
CPUのキャッシュメモリ
などで利用されます。
CPU
↓
キャッシュメモリ
SRAM
↓
主記憶
DRAM
4. DRAM
**DRAM(Dynamic Random Access Memory)**とは、
コンデンサに電荷を蓄えることでデータを保持する半導体メモリ
です。
SRAMと比べると、
- 低速
- 安価
- 高集積化しやすい
- 大容量化しやすい
という特徴があります。
そのため、主に、
コンピュータの主記憶
として利用されています。
5. DRAMではリフレッシュが必要
DRAMのコンデンサに蓄えられた電荷は、時間が経過すると少しずつ失われます。
そのため、
一定時間ごとにデータを読み出して、再び書き込む
必要があります。
これを、
リフレッシュ(Refresh)
といいます。
DRAM
↓
電荷が少しずつ減る
↓
リフレッシュ
↓
データを保持
一方、SRAMではこのようなリフレッシュ処理は必要ありません。
6. SRAMとDRAMの違い
| 項目 | SRAM | DRAM |
|---|---|---|
| 正式名称 | Static RAM | Dynamic RAM |
| 揮発性 | あり | あり |
| 速度 | 高速 | SRAMより低速 |
| リフレッシュ | 不要 | 必要 |
| 集積度 | 低め | 高い |
| 価格 | 高い | 安い |
| 主な用途 | キャッシュ | 主記憶 |
🍯 「S=SpeedのSRAMはキャッシュ」「D=大容量のDRAMは主記憶」くらいのイメージから入ると覚えやすいです。
7. 不揮発性メモリ
**不揮発性メモリ(Non-Volatile Memory)**とは、
電源を切ってもデータを保持できるメモリ
です。
代表的なものとして、
- フラッシュメモリ
- FeRAM
などがあります。
8. フラッシュメモリ
**フラッシュメモリ(Flash Memory)**とは、
電気的にデータの書き込みや消去ができ、電源を切ってもデータを保持できる半導体メモリ
です。
例えば、
- SSD
- USBメモリ
- SDカード
- スマートフォンのストレージ
などで利用されています。
電源ON
→ データ保持
電源OFF
→ データ保持
というのがDRAMとの大きな違いです。
9. FeRAM
**FeRAM(Ferroelectric Random Access Memory)**は、
強誘電体の性質を利用してデータを記憶する不揮発性メモリ
です。
特徴として、
- 不揮発性
- 高速な書き込み
- 書換え耐性が高い
- 比較的低消費電力
などがあります。
ICカードや組込み機器などで利用されることがあります。
10. 半導体メモリを整理しよう
| メモリ | 揮発性 | 特徴 | 主な用途 |
|---|---|---|---|
| SRAM | ○ | 高速・リフレッシュ不要 | キャッシュ |
| DRAM | ○ | 大容量化しやすい・リフレッシュ必要 | 主記憶 |
| フラッシュメモリ | × | 電源OFFでも保持 | SSD、USBメモリなど |
| FeRAM | × | 高速書込み・高書換え耐性・低消費電力 | 組込み機器など |
11. 記憶階層
理想的なメモリは、
ものすごく高速
+
ものすごく大容量
+
ものすごく安い
ものです。
しかし現実には、
高速なメモリほど容量当たりの価格が高く、大容量化しにくい
というトレードオフがあります。
そこで使われる考え方が、
記憶階層(Memory Hierarchy)
です。
12. 記憶の階層化
記憶装置を、
高速・小容量
↑
┌────────┐
│レジスタ│
├────────┤
│キャッシュ│
├────────┤
│ 主記憶 │
├────────┤
│SSD/HDD │
└────────┘
↓
低速・大容量
のように階層化します。
CPUに近いほど、
- 高速
- 小容量
- 容量当たりの価格が高い
傾向があります。
逆に下へ行くほど、
- 低速
- 大容量
- 容量当たりの価格が安い
傾向があります。
13. なぜキャッシュメモリが必要なのか
CPUは非常に高速です。
一方、主記憶であるDRAMはCPUより遅いため、
CPU:データ欲しい!
主記憶:ちょっと待ってください……
CPU:……
という待ち時間が発生します。
そこでCPUと主記憶の間に、
キャッシュメモリ(Cache Memory)
を配置します。
CPU
↓
キャッシュ
↓
主記憶
よく利用するデータを高速なキャッシュに置いておくことで、CPUの待ち時間を短縮できます。
14. キャッシュヒットとキャッシュミス
CPUが必要とするデータがキャッシュに存在することを、
キャッシュヒット(Cache Hit)
といいます。
CPU
↓
キャッシュ
↓
あった!
反対に、キャッシュに存在しないことを、
キャッシュミス(Cache Miss)
といいます。
CPU
↓
キャッシュ
↓
ない!
↓
主記憶へアクセス
15. ヒット率
キャッシュへアクセスしたうち、目的のデータがキャッシュに存在した割合を、
ヒット率(Hit Ratio)
といいます。
例えば100回アクセスして、
90回 → キャッシュヒット
10回 → キャッシュミス
なら、
ヒット率 = 90%
です。
キャッシュが有効に働くほど、CPUが低速な主記憶へアクセスする回数を減らせます。
16. 実効アクセス時間
キャッシュメモリがある場合、
実際には平均してどのくらいの時間でデータへアクセスできるのか
を考える必要があります。
これを、
実効アクセス時間
といいます。
応用情報でも計算問題として重要なポイントです。
17. 実効アクセス時間を計算してみよう
例えば、
キャッシュアクセス時間:10ns
主記憶アクセス時間:100ns
ヒット率:90%
とします。
「ヒット時は10ns、ミス時はキャッシュ確認後に主記憶へアクセスする」と考える場合、
実効アクセス時間
= 10 × 0.9
+ (10 + 100) × 0.1
です。
計算すると、
= 9 + 11
= 20ns
となります。
主記憶だけなら100nsかかるところを、平均20nsまで短縮できています。
18. 実効アクセス時間の式には注意
問題によって、
主記憶アクセス時間にキャッシュを確認する時間まで含めているか
が異なる場合があります。
そのため、問題文の条件を確認する必要があります。
例えば、
ヒット時:Tc
ミス時:Tc + Tm
なら、
実効アクセス時間
= hTc + (1-h)(Tc+Tm)
です。
一方で、問題が「ヒット時はTc、ミス時はTm」と定義しているなら、
実効アクセス時間
= hTc + (1-h)Tm
として計算します。
🍯 式を丸暗記するより「ヒットしたとき何ns? ミスしたとき何ns?」をそれぞれ考えて加重平均すると安全です。
19. 主記憶への書き込み
キャッシュを利用していると、読み込みだけでなく書き込みも考える必要があります。
例えばCPUが、
A = 100
という変更を行ったとします。
キャッシュだけを書き換えるのか、それとも主記憶も同時に書き換えるのか。
代表的な方式が、
- ライトスルー方式
- ライトバック方式
です。
20. ライトスルー方式
**ライトスルー方式(Write Through)**とは、
キャッシュへ書き込むと同時に主記憶にも書き込む方式
です。
CPU
↓ 書込み
キャッシュ
↓ 同時に反映
主記憶
そのため、
キャッシュ:100
主記憶 :100
のように、内容を一致させやすくなります。
メリット
- キャッシュと主記憶の整合性を保ちやすい
- 制御が比較的単純
デメリット
- 書込みのたびに主記憶へのアクセスが発生しやすい
21. ライトバック方式
**ライトバック方式(Write Back)**とは、
まずキャッシュだけを書き換え、必要になったタイミングで主記憶へ反映する方式
です。
CPU
↓
キャッシュを書換え
↓
しばらく主記憶には書かない
↓
キャッシュから追い出すときなど
↓
主記憶へ書込み
メリット
- 主記憶への書込み回数を減らせる
- 高速化しやすい
デメリット
- 一時的にキャッシュと主記憶の内容が異なる
- 制御が複雑になる
22. ライトスルーとライトバック
| 項目 | ライトスルー | ライトバック |
|---|---|---|
| キャッシュ | 書き換える | 書き換える |
| 主記憶 | 同時に書き換える | 後で書き換える |
| 整合性 | 保ちやすい | 管理が必要 |
| 主記憶への書込み | 多くなりやすい | 減らせる |
| 制御 | 比較的単純 | 複雑 |
🍯 「Through=そのまま主記憶まで通す」「Back=あとから主記憶へ戻す」と考えると覚えやすいです。
23. マルチプロセッサとデータ整合性
マルチプロセッサでは、さらに問題が発生します。
例えば、
CPU1 → キャッシュ1
CPU2 → キャッシュ2
↓
主記憶
という構成を考えます。
CPU1とCPU2が同じデータ A をキャッシュしているとします。
キャッシュ1:A = 10
キャッシュ2:A = 10
主記憶 :A = 10
CPU1が、
A = 20
へ変更したらどうなるでしょうか。
適切な制御がなければ、
キャッシュ1:A = 20
キャッシュ2:A = 10 ← 古い!
主記憶 :A = ?
となる可能性があります。
24. キャッシュコヒーレンシ
複数のキャッシュに存在する同じデータについて、内容の整合性を保つことを、
キャッシュコヒーレンシ(Cache Coherence)
といいます。
例えばCPU1がデータを書き換えた場合、
CPU1
↓
Aを書換え
↓
他のCPUへ通知
↓
古いキャッシュを無効化
するなどの仕組みが利用されます。
マルチプロセッサでは、
自分のキャッシュだけ正しければよいわけではない
という点が重要です。
25. キャッシュメモリの割付方式
主記憶のデータをキャッシュへ保存するとき、
キャッシュのどこに置くのか
を決める必要があります。
代表的な方式が、
- ダイレクトマッピング方式
- フルアソシアティブ方式
- セットアソシアティブ方式
です。
26. ダイレクトマッピング方式
**ダイレクトマッピング方式(Direct Mapping)**では、
主記憶の各ブロックを格納できるキャッシュ位置が一つに決められています。
例えば、
主記憶ブロック0 → キャッシュ0
主記憶ブロック1 → キャッシュ1
主記憶ブロック2 → キャッシュ2
主記憶ブロック3 → キャッシュ3
主記憶ブロック4 → キャッシュ0
のように対応させます。
一般的には、
キャッシュ位置
= 主記憶ブロック番号 mod キャッシュライン数
のように決定できます。
メリット
- 仕組みが単純
- 高速に判定できる
デメリット
同じ位置へ割り当てられるデータ同士が頻繁に入れ替わる、
競合ミス
が起こりやすくなります。
27. フルアソシアティブ方式
**フルアソシアティブ方式(Fully Associative Mapping)**では、
主記憶のブロックをキャッシュ内のどこにでも配置できます。
主記憶ブロックA
↓
┌───────────┐
│ どこでもOK │
│ │
│ │
│ │
└───────────┘
キャッシュ
配置の自由度が高いため、ダイレクトマッピングのような競合を減らせます。
一方、
キャッシュ内のどこに目的のデータがあるか
を調べる必要があるため、ハードウェアが複雑になります。
28. セットアソシアティブ方式
**セットアソシアティブ方式(Set Associative Mapping)**は、
キャッシュを複数のセットに分け、対応するセットの中なら複数の場所へ配置できる方式
です。
例えば2ウェイセットアソシアティブなら、
キャッシュ
セット0
├─ Way 0
└─ Way 1
セット1
├─ Way 0
└─ Way 1
セット2
├─ Way 0
└─ Way 1
のようになります。
主記憶のブロックから格納先のセットは決まりますが、そのセット内のどのWayへ置くかには選択肢があります。
29. 3つの割付方式を比較
| 方式 | 配置場所 | 特徴 |
|---|---|---|
| ダイレクト | 1か所だけ | 単純・高速 |
| フルアソシアティブ | どこでも可能 | 柔軟だが複雑 |
| セットアソシアティブ | 特定セット内の複数箇所 | 両者の中間 |
イメージすると、
ダイレクト
「あなたの席はここ!」
フルアソシアティブ
「空いてる席ならどこでも!」
セットアソシアティブ
「このテーブルの中ならどこでも!」
という違いです。
🍯 キャッシュの割付方式は「指定席・自由席・指定エリア内自由席」で覚えるとかなり整理しやすいです。
30. メモリインタリーブ
CPUが主記憶へ連続してアクセスすると、メモリのアクセス完了を待つ時間が発生します。
そこで利用される高速化技術の一つが、
メモリインタリーブ(Memory Interleaving)
です。
メモリインタリーブとは、
主記憶を複数の独立したバンクに分け、並行してアクセスできるようにすることで高速化する技術
です。
31. メモリを複数のバンクへ分ける
例えば主記憶を4つのバンクへ分割します。
主記憶
Bank 0
Bank 1
Bank 2
Bank 3
連続したアドレスを、
アドレス0 → Bank 0
アドレス1 → Bank 1
アドレス2 → Bank 2
アドレス3 → Bank 3
アドレス4 → Bank 0
アドレス5 → Bank 1
...
のように分散させます。
すると、
Bank 0が処理中
↓
Bank 1へアクセス
Bank 1が処理中
↓
Bank 2へアクセス
というように、各バンクの処理を重ね合わせることができます。
32. メモリインタリーブのイメージ
1つのメモリだけなら、
データ1 → 完了
↓
データ2 → 完了
↓
データ3 → 完了
となります。
複数バンクを利用すれば、
Bank0:データ1 ─────→
Bank1: データ2 ─────→
Bank2: データ3 ─────→
Bank3: データ4 ─────→
のように処理を重ねられます。
考え方としては、前の記事で学んだパイプライン処理にも少し似ています。
一つのメモリ自体を速くするというより、
複数のメモリバンクを並行動作させて、全体としてデータ転送を高速化する
技術です。
33. メモリアーキテクチャの全体像
今回の内容をまとめると、
メモリアーキテクチャ
│
├─ 半導体メモリ
│ ├─ 揮発性
│ │ ├─ SRAM → キャッシュ
│ │ └─ DRAM → 主記憶
│ │
│ └─ 不揮発性
│ ├─ フラッシュメモリ
│ └─ FeRAM
│
├─ 記憶階層
│ ├─ レジスタ
│ ├─ キャッシュ
│ ├─ 主記憶
│ └─ SSD・HDD
│
├─ キャッシュ
│ ├─ ヒット率
│ ├─ 実効アクセス時間
│ ├─ ライトスルー
│ └─ ライトバック
│
├─ マルチプロセッサ
│ └─ キャッシュコヒーレンシ
│
├─ キャッシュ割付
│ ├─ ダイレクトマッピング
│ ├─ フルアソシアティブ
│ └─ セットアソシアティブ
│
└─ 主記憶高速化
└─ メモリインタリーブ
すべてに共通しているのは、
CPUをなるべく待たせない
という考え方です。
CPUに近いところへ高速なメモリを置き、よく使うデータをキャッシュし、さらに主記憶自体も複数バンクで並行動作させる。
こうした複数の工夫によって、コンピュータ全体の性能を高めています。
まとめ
この記事で覚えること
- 揮発性メモリは電源を切るとデータが失われる
- 不揮発性メモリは電源を切ってもデータを保持できる
- SRAMは高速でリフレッシュ不要のためキャッシュなどに利用される
- DRAMは大容量化しやすく、リフレッシュが必要で主記憶などに利用される
- フラッシュメモリはSSDやUSBメモリなどで利用される不揮発性メモリ
- FeRAMは強誘電体を利用する不揮発性メモリ
- 記憶階層ではCPUに近いほど高速・小容量になる傾向がある
- キャッシュヒットは目的データがキャッシュに存在すること
- 実効アクセス時間はヒット時とミス時のアクセス時間を確率で重み付けして求める
- ライトスルーはキャッシュと主記憶を同時に更新する
- ライトバックはまずキャッシュを更新し、後から主記憶へ反映する
- マルチプロセッサではキャッシュ間のデータ整合性が重要
- キャッシュコヒーレンシは複数キャッシュの同じデータについて整合性を保つ考え方
- ダイレクトマッピングでは格納場所が一つに決まる
- フルアソシアティブではキャッシュ内のどこにでも格納できる
- セットアソシアティブでは指定されたセット内の複数の場所から選択できる
- メモリインタリーブは主記憶を複数バンクに分けて並行動作させる
🍯 はちみつメモ
メモリアーキテクチャの目的は「CPUを待たせない」こと。SRAMをキャッシュ、DRAMを主記憶として階層化し、よく使うデータをCPUの近くへ置く。キャッシュの計算問題では公式を丸暗記するより、「ヒットした場合」と「ミスした場合」に何nsかかるかを分けて考えよう!