仮想メモリ
各プロセスに、専用の連続したアドレス空間があるように見せる。
何が可能になるか#
| 効果 | 内容 |
|---|---|
| 隔離 | 他プロセスのメモリに触れない |
| 単純化 | どのプロセスも同じ配置を仮定できる |
| 物理メモリより大きく使える | 使わないページをディスクへ |
| 共有 | 同じライブラリの物理ページを共有 |
| コピーオンライト | fork を安く実装できる |
ページング#
アドレス空間を固定長のページ(通常 4 KB)に分け、 ページ単位で物理フレームに対応づける。
仮想アドレス = [ ページ番号 | ページ内オフセット ]
↓ ページテーブルを引く
物理アドレス = [ フレーム番号 | ページ内オフセット ]64 ビット空間のページテーブルは巨大になるため、 多段のページテーブル(x86-64 で 4〜5 段)にして 使っていない領域の表を作らずに済ませる。
TLB#
ページテーブルを毎回引くとメモリアクセスが数回増える。 最近の変換結果をキャッシュするのが TLB。
ヒット率が性能を左右する。 大きな配列をランダムアクセスすると TLB ミスが多発して遅くなる。 ヒュージページ(2 MB、1 GB)はこれへの対処。
ページフォルト#
対応する物理ページが無いときに発生する例外。
| 種類 | 対応 |
|---|---|
| 未割り当て | 物理ページを割り当てる(初回アクセス) |
| ディスクにある | 読み込む(スワップイン) |
| 不正なアクセス | SIGSEGV。プロセスを落とす |
mmap でファイルを読むのも、
実行ファイルのロードも、
この仕組みの上に成り立っている。
スラッシング#
物理メモリが足りず、 スワップイン・アウトばかりで処理が進まない状態。 ディスクは 5〜6 桁遅いので、 実質的にシステムが停止する。
参考文献#
- Remzi H. Arpaci-Dusseau, Andrea C. Arpaci-Dusseau. Operating Systems: Three Easy Pieces. Arpaci-Dusseau Books, 2018.(全文公開) https://pages.cs.wisc.edu/~remzi/OSTEP/
- Randal E. Bryant, David R. O’Hallaron. Computer Systems: A Programmer’s Perspective, 3rd ed. Pearson, 2016. https://csapp.cs.cmu.edu/
- Abhishek Bhattacharjee, Daniel Lustig. Architectural and Operating System Support for Virtual Memory. Morgan & Claypool, 2017. https://doi.org/10.1007/978-3-031-01757-5