When it’s ready.

出来るまで出来ない

OSのforkというか、メモリ管理について理解が進んできた。

forkを調べていたら、メモリ管理に行き着いた。

頭の整理もかねて、今の理解を晒してみる。
fork時に何が起こっているのかを理解するには、CPUと仮想メモリと物理メモリの3つの挙動を考えれば、最低限の理解は出来そう。(あぁ、最近最中限やってないなぁ・・)

まず、CPU(=プログラム)はメモリ上にオブジェクト(変数とか、ファンクションとか、インスタンス)を展開して、計算したり保管していたりしている。
 プログラムから見た場合、このメモリというのは、物理メモリを直接いじらず、仮想メモリ*1を見ている。仮想メモリと物理メモリのやりとりや、書き換えはOSが担当している。OSは、プログラム起動時に、物理メモリ上に必要な領域を確保し、その領域を指し示す仮想メモリをプログラムに教える。プログラムは仮想メモリ*2にアクセスすることで、透過的に物理メモリにアクセスすることが出来る。

さて、あるメソッドをforkしたい場合は、OSに対してこの子をforkしますよと、プログラムはお願いする。すると、OSは、物理メモリの領域はコピーせずに、仮想メモリ*3だけをコピーして、子プロセスに教える。この時には、親プロセスも子プロセスも全く同一のメモリを参照していることになる。

fork後、どちらか(親か子)のプロセスがメモリーに対して書き換えを行おうとすると、OSは、ここで初めて、書き換えられる領域の物理メモリーを確保し書き換え*4が起こる。これによって、必要最低限のメモリーの増加で、プロセス間で別々のメモリーを扱っているような挙動をすることが出来る。また、物理メモリのコピーより仮想メモリのコピーの方がコストが安い。


こんな感じに、forkを理解した。
これを使っているであろう、pythonのmultiprocessingがどうやって実装されているのか調べていけばいい気がする。

っていうか、これ基礎知識な気がする。今頃調べてる自分がかなすぃ

*1:ページテーブル

*2:プロセスごとの仮想メモリ空間、Page Frame Number, PFN

*3:ページテーブル

*4:Copy On Write