ストレージピラミッド -- なぜこれほど多くの層に分けるのか

なぜパソコンには「メモリ」と「ハードディスク」の両方があるのか、考えたことはありますか?なぜすべてのデータを最速の場所に置かないのでしょうか?

答えはコンピュータのストレージシステムの設計に隠されています——ストレージピラミッド。この講義では、アーキテクトにとって最も核心的なトレードオフの知恵を徹底的に理解します。


身近な例え:キッチン vs スーパーの倉庫

料理をするときの食材の配置を使って、まず直感的なイメージを掴みましょう。

あなたが料理をしているところを想像してください。

塩と醤油はコンロのそばに置いて、手を伸ばせば届く——これらはコンピュータのレジスタとL1キャッシュ。

冷蔵庫の中の食材は、数歩歩いて取りに行く必要がある——これはメモリ(RAM)。

地下室に備蓄した米や麺、油などの食料は、わざわざ取りに行かなければならない——これはソリッドステートドライブ(SSD)。

そしてスーパーの倉庫にある在庫は、家に置くことすらしない——それはハードディスクドライブ(HDD)とクラウドストレージです。

これは素朴な原則を明らかにしています:よく使うものほど近い場所に置くが、近い場所はスペースが限られていて高価でもある;あまり使わないものは遠くに置き、容量が大きくより安価である。

コンピュータのストレージシステムは、まさにこの素朴な原則に従って設計されています。


ストレージピラミッド:速度と容量のトレードオフ

コンピュータ内部では、ストレージデバイスが「速度-容量-コスト」の段階的な関係に従って、ピラミッド構造を形成しています。

サンプル ストレージピラミッド図 — diagram-design 仕様 SVG:紙色の背景 + ヘアラインの層分割、錆赤のアクセントは最上層のレジスタのみをマーク
背景のドットパターン 第1層:レジスタ — 最上層、アクセント強調(唯一の焦点) レジスタ ~1 KB · 0.3 ns 第2層:L1キャッシュ L1キャッシュ ~64 KB · 1 ns 第3層:L2キャッシュ L2キャッシュ ~256 KB · 4 ns 第4層:L3キャッシュ L3キャッシュ ~8 MB · 12 ns 第5層:メモリ RAM メモリ RAM ~16 GB · 100 ns 第6層:ソリッドステートドライブ SSD ソリッドステートドライブ SSD ~1 TB · 100 μs 第7層:ハードディスクドライブ HDD — 最下層、最も広い ハードディスクドライブ HDD ~10 TB · 10 ms 左右両側のラベル(Geist Mono 小文字) より高速 ↑ より低速 ↓ 容量はより小さい 容量はより大きい マウスホバー時の詳細オーバーレイ

ストレージピラミッド模式図:上に行くほど速く小さく、下に行くほど遅く大きい。台形にマウスをホバーすると各層の詳細を確認できます。

核心となる原則

このピラミッド図は、ハードウェア設計における鉄則を明らかにしています:

  • 速いほど高価で、小さい:レジスタはCPU内部にあり、最速のトランジスタで作られていますが、わずか数キロバイトしかありません。チップ面積が非常に高価だからです。
  • 遅いほど安価で、大きい:ハードディスクドライブは磁気ヘッドと回転するプラッタを使用し、コストが極めて低く、数十TBのデータを格納できます。
  • ピラミッド構造の目的:「小さく速い + 大きく遅い」の組み合わせにより、合理的なコストで最速ストレージに近い体験を実現することです。

もしパソコンのストレージをすべてレジスタで作ったら、価格は天文学的な額になるだけでなく、チップ面積も大きくなりすぎて製造できなくなります。

逆に、すべてハードディスクドライブにしたら、パソコンは使えないほど遅くなります——どのプログラムを開くにも数百ミリ秒待たなければなりません。


各層の詳細な比較

7層のストレージの主要な属性を1つの表にまとめ、横方向の比較を容易にします。

階層代表的な容量アクセスレイテンシ相対速度物理的な位置製造コスト
レジスタ~1 KB~0.3 ns1x(基準)CPUコア内極めて高い
L1キャッシュ~64 KB~1 nsレジスタより3倍遅いCPUコア内部極めて高い
L2キャッシュ~256 KB~4 ns13倍遅いCPUコア内部非常に高い
L3キャッシュ~8 MB~12 ns40倍遅いCPUチップ上、マルチコアで共有高
メモリ (RAM)~16 GB~100 ns333倍遅いマザーボード上(独立したチップ)中程度
ソリッドステートドライブ (SSD)~1 TB~100 μs333,333倍遅い筐体内部(独立したデバイス)比較的低い
ハードディスクドライブ (HDD)~10 TB~10 ms33,333,333倍遅い筐体内部(独立したデバイス)低

桁の飛躍に注目してください:メモリはL1キャッシュより100倍遅く、SSDはメモリよりさらに1000倍遅く、HDDはSSDよりさらに100倍遅いです。各層間の速度差は桁違いです。

なぜSSDはHDDよりこれほど速いのか?

重要な違いは機械部品の有無です。

SSDはフラッシュメモリチップを使用し、純粋に電子的に読み取るため、機械部品がありません。

HDDは回転するプラッタと移動する磁気ヘッドを使用します——データを読み取るには、磁気ヘッドがまず正しいトラックに移動し(シーク時間、約5-10ms)、その後プラッタが正しい位置に回転するのを待つ必要があります(回転レイテンシ、約2-4ms)。

この機械的な移動プロセスこそ、HDDがSSDより100倍以上遅い根本的な原因です。


インタラクティブデモ:多層ストレージのアクセス時間をシミュレーション

Pythonコードを使用して、同じアドレスを7層のストレージからそれぞれ読み取る際のレイテンシの違いをシミュレーションします。

実例

"""
ストレージピラミッドアクセスレイテンシシミュレーター (サンプル デモ)
異なる階層から同じサイズのデータブロックを読み取ることをシミュレーションし、各層の速度差を直感的に比較します
"""


class StorageHierarchy:
    """コンピュータのストレージ階層構造をシミュレーションする"""

    def __init__(self):
        # 各層のストレージのシミュレーションレイテンシ(単位:ナノ秒)と代表的な容量
        self.layers = {
            'Register':  {'latency_ns': 0.3,  'capacity': '~1 KB',   'color': 'red'},
            'L1 Cache':  {'latency_ns': 1,    'capacity': '~64 KB',  'color': 'orange'},
            'L2 Cache':  {'latency_ns': 4,    'capacity': '~256 KB', 'color': 'gold'},
            'L3 Cache':  {'latency_ns': 12,   'capacity': '~8 MB',   'color': 'yellow'},
            'RAM':       {'latency_ns': 100,  'capacity': '~16 GB',  'color': 'green'},
            'SSD':       {'latency_ns': 100000, 'capacity': '~1 TB', 'color': 'blue'},
            'HDD':       {'latency_ns': 10000000, 'capacity': '~10 TB', 'color': 'purple'},
        }

    def read(self, layer_name, address):
        """
指定した層からデータを読み取ることをシミュレーション
シミュレーションされたデータ値を返す
        """

        value = f"DATA_FROM_{layer_name.upper()}_{address}"
        return value

    def compare_access(self, address, num_accesses=3):
        """同じアドレスを各層から読み取る速度を比較する"""
        print("=" * 65)
        print(f"ストレージ階層アクセスレイテンシ比較(アドレス: {address})")
        print("=" * 65)
        print(f"{'階層':<12} {'レイテンシ(ナノ秒)':>12} {'容量':<12} {'レジスタ比':>12}")
        print("-" * 65)

        baseline = self.layers['Register']['latency_ns']

        for name, info in self.layers.items():
            lat_ns = info['latency_ns']
            ratio = lat_ns / baseline
            cap = info['capacity']
            print(f"{name:<12} {lat_ns:>10,.1f} ns {cap:<12} {ratio:>10,.0f}x")


# デモを実行
print("サンプル ストレージシステム講座: ストレージピラミッドアクセスレイテンシ比較")
print()

store = StorageHierarchy()
store.compare_access("0x7FFF1234")

print()
print("=" * 65)
print("結論分析:")
print("=" * 65)

# 主要な比率を計算
register_lat = 0.3          # ns
ram_lat = 100               # ns
ssd_lat = 100000            # ns
hdd_lat = 10000000          # ns

print(f"1. メモリ(RAM) は レジスタ より {ram_lat / register_lat:,.0f} 倍遅い")
print(f"2. SSD は メモリ(RAM) より {ssd_lat / ram_lat:,.0f} 倍遅い")
print(f"3. HDD は メモリ(RAM) より {hdd_lat / ram_lat:,.0f} 倍遅い")
print(f"4. HDD は レジスタ より {hdd_lat / register_lat:,.0f} 倍遅い")
print()
print("レジスタがデータにアクセスするのに1秒かかるとすると:")
print(f" - L1キャッシュから取得するには {1/register_lat:.0f} 秒")
print(f" - メモリから取得するには {ram_lat/register_lat:,.0f} 秒(約 {ram_lat/register_lat/60:.0f} 分)")
print(f" - HDDから取得するには {hdd_lat/register_lat:,.0f} 秒(約 {hdd_lat/register_lat/3600:,.0f} 時間)")

実行結果:

サンプル 存储系统教学: 存储金字塔访问延迟对比

=================================================================
存储层次访问延迟对比(地址: 0x7FFF1234)
=================================================================
层级                 延迟(纳秒) 容量                  相对寄存器
-----------------------------------------------------------------
Register            0.3 ns ~1 KB                 1x
L1 Cache            1.0 ns ~64 KB                3x
L2 Cache            4.0 ns ~256 KB              13x
L3 Cache           12.0 ns ~8 MB                40x
RAM               100.0 ns ~16 GB              333x
SSD           100,000.0 ns ~1 TB           333,333x
HDD          10,000,000.0 ns ~10 TB       33,333,333x

=================================================================
结论分析:
=================================================================
1. 内存(RAM) 比 寄存器 慢 333 倍
2. SSD 比 内存(RAM) 慢 1,000 倍
3. HDD 比 内存(RAM) 慢 100,000 倍
4. HDD 比 寄存器 慢 33,333,333 倍

如果寄存器访问数据需要 1 秒,那么:
  - 从 L1 缓存获取需要 3 秒
  - 从内存获取需要 333 秒(约 6 分钟)
  - 从 HDD 获取需要 33,333,333 秒(约 9,259 小时)

インタラクティブデモ:各層のアクセスレイテンシ対数比較グラフ

下の図は対数座標の棒グラフで、横軸の隣り合う2目盛りは10倍の差があります。柱にホバーすると容量とレイテンシの詳細を確認できます。

サンプル ストレージ階層レイテンシ比較 — Plotly 対数座標の横向き棒グラフ(仕様による選定:対数座標系には Plotly を使用)

ピラミッドはどのように機能するか:層ごとのキャッシュ戦略

ピラミッドは静的ではない——そこには自動的に機能するデータの流れの仕組みがある。

データの流れのルール

  1. CPUがデータを必要とするとき:まず最速のL1キャッシュを探し、見つからなければL2へ、さらに見つからなければL3へ、メインメモリに至るまで。
  2. 遅い階層からデータを読み取った後:データをCPUに渡すだけでなく、より高速な階層にもコピーを保存する。そうすれば次回使うとき速い。
  3. 高速な階層がいっぱいになったらどうするか:一定の戦略(LRU——最も長く使われていないものを追い出す)に従って、使用頻度の低いデータを低速階層に戻し、新しいデータのための場所を空ける。

このプロセスはプログラマにとって完全に透過的である——プログラムを書くときにどのキャッシュを手動で管理する必要はなく、ハードウェアとOSが自動的にすべて行う。

現実世界の例

あなたがビデオファイルを編集中だとしよう:

  • ビデオファイルはHDDまたはSSDに存在する(最下層)。
  • ファイルを開くと、OSはその一部をメモリ(RAM)に読み込む。
  • 再生を開始すると、CPUは現在処理中の数フレームのデータをL3/L2/L1キャッシュにコピーする。
  • ALUによって計算中のピクセル値は、レジスタに存在する。

編集ソフトウェアで「とてもスムーズ」と感じるのは、ほとんどの場合CPUが必要なデータをキャッシュ内で見つけられるからである。


歴史的背景:ピラミッドはなぜこのような形なのか

ピラミッドの階層数は、CPUとメモリの速度差が拡大し続けた歴史的産物である。

1980年代には、CPUとメモリの速度差は大きくなかった。しかし半導体プロセスの進歩により、CPUの速度は年間約60%の割合で増加した一方、メモリの速度は年間約10%しか増加しなかった。

この拡大し続ける差は、「メモリウォール」(Memory Wall)と呼ばれる。

メモリピラミッドは、エンジニアたちが「メモリウォール」に対して取った対策である——多段階キャッシュでCPUとメインメモリの間の速度ギャップを緩和する。

年代CPUクロック周波数メモリレイテンシ速度差キャッシュ階層
1980s~10 MHz~200 ns約2倍なしまたは1階層
1990s~200 MHz~70 ns約14倍L1 + L2
2000s~3 GHz~50 ns約150倍L1 + L2 + L3
2020s~5 GHz~80 ns約400倍L1 + L2 + L3

メモリレイテンシは40年間で本質的にほとんど変わっていないことに注目!メモリが進歩していないのではなく、CPUの進歩があまりにも速すぎるのだ。メモリの物理的限界(コンデンサの充放電速度)により、そのレイテンシは大幅に短縮することが難しい。

その他の拡張