コンピューターサイエンス:アルゴリズム / OS / ネットワーク / DB

メモリ階層(レジスタ→キャッシュ→RAM→ディスク)

生田 陸人
LuaGate エンジニア / 現役エンジニア
編集 LuaGate編集部

メモリ階層(レジスタ→キャッシュ→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 万倍 の速度差があります。

図解

diagram (will load when visible)

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 つができることを確認しましょう。

  1. メモリ階層 の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. メモリ階層 とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン