仮想メモリ
カーネルは、プロセスの生成時や、プロセスから動的なメモリ確保を要求された際に、メモリ割り当てを行う。この時、物理メモリ (RAM) のアドレスを直接割り当てると、以下のような問題がある。
メモリの断片化
空きが合計300byteあっても、バラバラに空いていたら300byteの大きさのメモリ確保ができない
プログラム側が、割り当て可能なメモリ量を意識してコードを書く必要が生じてしまう
別用途のメモリへのアクセス
プロセスが別プロセスのメモリにアクセスできてしまい、それらを壊してしまう恐れがある
マルチプロセスの扱いが困難
プログラムがコードやデータのメモリアドレスを直指定していると、他プロセスと割り当てを被せないよう意識する必要がある
そこで、仮想メモリによって問題を解決する。仮想メモリとは、物理メモリとプロセスの間の中間層と捉えられる。プロセスが直接物理メモリにアクセスすることはできず、必ず仮想メモリを介して物理メモリにアクセスする。仮想メモリの特徴としては、以下が挙げられる。
ページテーブル
仮想メモリ > 物理メモリのマッピング表
ページ という単位で区切られており、これが Mach-O フォーマットのページと同様の概念。サイズも同一 仮想メモリアドレスへのアクセス時に問題が発生した場合に、CPU 上で発生する
発生後は、カーネル上でページフォールトハンドラが処理を行う
例えば、仮想メモリアドレスが物理メモリアドレスにマッピングされていなかった場合や、書き込み権限のないページに書き込もうとした場合などに発生する
ファイルマップ, File backed pages
ファイルに仮想メモリ経由でアクセスする方法
ファイルをメモリ上に展開し、そのアドレスを仮想メモリにマッピングする
プロセスはメモリアクセスと同様にファイルにアクセスできるようになる
所定の時間後、メモリ上での変更がファイルに書き戻される
C だと mmap で実現できる
頻繁にファイルにアクセスする必要がある場合、ディスク I/O が頻発することを防ぐことができる
複数のプロセスがページテーブル上の同一のページを共有している中、あるプロセスがそのページに書き込みを行おうとした際に発生する
カーネルによって書き込み対象のページがコピーされ、各プロセスが別々のページを参照するようになり、その時点で初めて書き込みが可能になる
物理 RAM 上でもコピーされる
問題: clean or dirty page
コピーされたページは dirty page と見なされる
dirty page は、それを保持するプロセス固有の情報を含む
clean page は、必要とあらばディスク読み込み等によってカーネルが後ほど同じものを再生成できる
参考