コンピューターサイエンス:アルゴリズム / OS / ネットワーク / DB
メモリ階層(レジスタ→キャッシュ→RAM→ディスク)
メモリ階層(レジスタ→キャッシュ→RAM→ディスク)
このレッスンで分かること
- 現代のコンピューターは「速いが小さい」記憶と「大きいが遅い」記憶を 階層的に組み合わせ て性能を稼ぎます
- レジスタ→L1→L2→L3 キャッシュ→RAM→SSD→HDD と進むほど 桁違いに容量が増え、桁違いに遅くなります
- プログラマは キャッシュフレンドリ な書き方をするだけで体感性能が大きく変わります
メモリ階層 とは
メモリ階層(レジスタ→キャッシュ→RAM→ディスク)。本レッスンでは、メモリ階層 の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。
なぜ階層構造なのか
理想は「速くて、大容量で、安い」記憶ですが、現実はトレードオフです。SRAM は速いが密度が低く高価、DRAM は安いが遅い、SSD は不揮発で大容量だがさらに遅い――というように物理的な制約があります。そこで「よく使うデータは近くに、それ以外は遠くに」と階層化し、人工的に 速さと容量を両立 させています。
階層と速度感
| 階層 | 容量目安 | アクセス時間目安 | 1 秒に何回アクセスできるか |
|---|---|---|---|
| レジスタ | 数十バイト | 1 ns 未満 | 数 G 回 |
| L1 キャッシュ | 数十 KB | 約 1 ns | 約 10 億回 |
| L2 キャッシュ | 数百 KB | 約 3 ns | 約 3 億回 |
| L3 キャッシュ | 数 MB ~ 数十 MB | 約 10 ns | 約 1 億回 |
| RAM (DRAM) | 数 GB ~ 数百 GB | 約 100 ns | 約 1000 万回 |
| NVMe SSD | 数百 GB ~ 数 TB | 約 0.1 ms | 約 1 万回 |
| HDD | 数 TB | 約 10 ms | 約 100 回 |
| ネットワーク (LAN) | ∞ | 約 0.5 ms | 約 2000 回 |
レジスタと HDD の間には 約 1000 万倍 の速度差があります。
図解
CPU は最も近いレジスタ/キャッシュにあるデータを優先して扱い、見つからなければ次の層に問い合わせます。これを キャッシュミス と呼び、ミスが重なるとプログラムは桁違いに遅くなります。
局所性の原理
階層が機能する根拠は 局所性 という経験則です。
- 時間的局所性 同じデータが短時間に何度もアクセスされる傾向
- 空間的局所性 近くのアドレスが続けて参照される傾向
ループの中で同じ変数を更新したり、配列を順番に走査したりするコードは局所性が高く、キャッシュを有効に使えます。
具体例
Python
import time
N = 1024
matrix = [[0]*N for _ in range(N)]
# 行優先(キャッシュフレンドリ)
t0 = time.time()
for i in range(N):
for j in range(N):
matrix[i][j] = 1
print("row first:", time.time() - t0)
# 列優先(キャッシュ不利)
t0 = time.time()
for j in range(N):
for i in range(N):
matrix[i][j] = 1
print("col first:", time.time() - t0)同じ要素数を更新しているのに、アクセス順によって性能差が生じます。ただし Python の list-of-list は各行が独立したヒープ領域に確保されるため、この効果は小さめです。数倍〜十数倍の差が顕著に現れるのは、連続メモリを持つ NumPy 配列(np.zeros((N,N)) など)や C/C++ の二次元配列です。配列のレイアウトとアクセス順を合わせるのは「無料でできる最適化」です。
トレードオフ
- キャッシュは「最近使われたデータ」を保持するため、巨大データを 1 周走査するだけだと L3 にすら載らない ケースが多く、性能は RAM 速度で頭打ちになります
- HDD と SSD の速度差は実測で 100 倍以上あり、データベースのレスポンスを語る上で外せません
よくある誤解
- 「メモリが多ければ速い」は半分正解で、RAM の容量が増えても アクセスレイテンシは変わりません。速くなるのは「スワップが減る」効果です
- 「SSD なら HDD と同じ感覚で扱える」も誤解で、SSD は書き込み回数の上限(耐久性)やランダム書き込みのパターンで寿命が変わります
やってみよう
lscpu (Linux)や sysctl -a | grep cache(macOS)を実行し、自分の CPU の L1 / L2 / L3 キャッシュサイズを確認してみてください。普段使っているマシンの「机の上に何が乗っているか」が見えてきます。
よくある質問
Q. このトピックは実務でどう役立ちますか?
A. DB のクエリ最適化、API 設計、データ構造の選択など、設計判断の根拠になります。表面的にライブラリを使うだけでなく「なぜそれが速いのか」を理解できると、性能問題を未然に防げます。コーディング面接でも頻出のテーマです。
Q. 計算量はどう求めれば良いですか?
A. ループのネストごとに掛け算する、再帰なら漸化式から解く、というのが基本です。Big-O 表記は定数倍と低次の項を無視するため、n の指数(n²、n log n など)に注目してください。最悪・平均・最良の 3 つを意識すると説得力が増します。
Q. 覚えるべき定番アルゴリズムは何ですか?
A. 二分探索、クイックソート/マージソート、BFS/DFS、ダイクストラ、DP の基本問題(フィボナッチ・ナップサック)が必修です。これらを「白紙から書ける」状態にすると、応用問題が一気に解けるようになります。
次のレッスン
次は 仮想メモリ で、メモリ階層(レジスタ→キャッシュ→RAM→ディスク) を学びます。
事前確認 — 進む前に次の 3 つができることを確認しましょう。
- メモリ階層 の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. メモリ階層 とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン