コラム: なぜページサイズは4KBなのか
読了時間: 5分
4KBの起源: Intel 386
1985年、Intel 80386プロセッサが登場しました。このプロセッサで初めて本格的な仮想メモリがx86アーキテクチャに導入され、ページサイズは 4KB(4,096バイト) に決定されました。
なぜ4KBだったのでしょうか?
当時のトレードオフ
ページサイズの決定には、2つの相反する要素がありました。
┌─────────────────────────────────────────────────────────────────────┐
│ ページサイズのジレンマ │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 小さいページ(例: 1KB) │
│ ├── メリット: 内部フラグメンテーションが少ない │
│ └── デメリット: ページテーブルが巨大になる │
│ │
│ 大きいページ(例: 64KB) │
│ ├── メリット: ページテーブルが小さい、TLB効率が良い │
│ └── デメリット: メモリの無駄が多い │
│ │
└─────────────────────────────────────────────────────────────────────┘
1985年当時の状況
- メモリ: 1〜4MB程度が一般的
- ディスク: 20〜40MB程度
- メモリは非常に高価
この時代、メモリの無駄は致命的でした。64KBページでは、小さなプログラムでも大量のメモリを消費してしまいます。
なぜ「4KB」という数字なのか
2のべき乗
4KB = 4,096 = 2^12
コンピュータは2進数で動作するため、2のべき乗はアドレス計算が効率的です。
仮想アドレス(32ビット):
┌────────────────────┬────────────────────┐
│ 上位20ビット │ 下位12ビット │
│ ページ番号 │ ページ内オフセット │
└────────────────────┴────────────────────┘
12ビット = 4,096 通り = 4KB
ディスクセクタとの相性
当時のハードディスクは512バイトセクタが標準でした。
4KB = 512バイト × 8セクタ
ページサイズがセクタサイズの倍数であることで、ディスクI/Oが効率的になります。
ページテーブルのサイズ
32ビットアドレス空間(4GB)を4KBページで管理する場合:
4GB ÷ 4KB = 1,048,576 ページ
= 約100万エントリ
1エントリ = 4バイトとすると
ページテーブル = 4MB
これは当時のメモリ量からすると大きいですが、階層化ページテーブルで解決できる範囲でした。
40年後の今、なぜ変わらないのか
386から40年経った今でも、多くのシステムが4KBページを使い続けています。
互換性の壁
┌─────────────────────────────────────────────────────────────────────┐
│ 4KBに依存するもの │
├───────────────────────────────────────────── ────────────────────────┤
│ │
│ ・アプリケーション(mmap のアライメント前提) │
│ ・共有ライブラリ(ELFのセクションアライメント) │
│ ・ファイルシステム(ブロックサイズ) │
│ ・データベース(ページサイズ) │
│ ・仮想化ソフトウェア │
│ ・無数のシステムコール │
│ │
└─────────────────────────────────────────────────────────────────────┘
この膨大なエコシステムを変更するコストは計り知れません。
Huge Pages という妥協案
Linuxは完全移行ではなく、Huge Pages という仕組みを導入しました。
通常ページ: 4KB
Huge Pages: 2MB または 1GB
大量のメモリを使うアプリケーション(データベース、JVMなど)は、明示的にHuge Pagesを使うことでTLB効率を改善できます。
# Huge Pages の確認
$ cat /proc/meminfo | grep Huge
HugePages_Total: 0
HugePages_Free: 0
Hugepagesize: 2048 kB