仮想メモリ

仮想メモリ

執筆済 コンピュータOS

各プロセスに、専用の連続したアドレス空間があるように見せる。

仮想アドレス MMU 物理アドレス

何が可能になるか#

効果 内容
隔離 他プロセスのメモリに触れない
単純化 どのプロセスも同じ配置を仮定できる
物理メモリより大きく使える 使わないページをディスクへ
共有 同じライブラリの物理ページを共有
コピーオンライト fork を安く実装できる

ページング#

アドレス空間を固定長のページ(通常 4 KB)に分け、 ページ単位で物理フレームに対応づける。

仮想アドレス = [ ページ番号 | ページ内オフセット ]
                    ↓ ページテーブルを引く
物理アドレス = [ フレーム番号 | ページ内オフセット ]

64 ビット空間のページテーブルは巨大になるため、 多段のページテーブル(x86-64 で 4〜5 段)にして 使っていない領域の表を作らずに済ませる。

TLB#

ページテーブルを毎回引くとメモリアクセスが数回増える。 最近の変換結果をキャッシュするのが TLB。

ヒット率が性能を左右する。 大きな配列をランダムアクセスすると TLB ミスが多発して遅くなる。 ヒュージページ(2 MB、1 GB)はこれへの対処。

ページフォルト#

対応する物理ページが無いときに発生する例外。

種類 対応
未割り当て 物理ページを割り当てる(初回アクセス)
ディスクにある 読み込む(スワップイン)
不正なアクセス SIGSEGV。プロセスを落とす

mmap でファイルを読むのも、 実行ファイルのロードも、 この仕組みの上に成り立っている。

スラッシング#

物理メモリが足りず、 スワップイン・アウトばかりで処理が進まない状態。 ディスクは 5〜6 桁遅いので、 実質的にシステムが停止する。

参考文献#

ノート一覧を閉じる