以前
copy on write (COW)
、親プロセスと子プロセスが同じアドレス空間を共有しているというのは、同じコード セグメント、データ セグメント、ヒープ、スタックを共有しているということですよね?親プロセスと子プロセスが COW の前に同じアドレス空間を共有している場合、どういう
the page table entries are copied from parent process to child process
意味ですか?ページ テーブル エントリを複製することは、アドレス空間を複製することを意味しますか?
3 に答える
プロセスが、仮想アドレス 100 と物理アドレス 200 を持つ変数名 X を取得したとします。PTE は、仮想 100 から物理 200 へのアドレスのマッピングを保持しています。
フォーク後、各プロセス (親と子) にはプライベート PTE があります。この時点で、両方の PTE が仮想 100 を物理 200 にマップします。
両方のプロセスがそこから読み取る限り、両方とも物理アドレス 200 から読み取ります。
最初の人がそこに書き込もうとすると、物理アドレスからのデータが新しい物理空間、たとえば 300 にコピーされ、彼の (そして彼だけの) PTE が更新されるため、仮想 100 が物理 300 にマップされます。彼はまだ同じ(仮想)アドレスを使用しているため、プロセスに対して透過的です。
*注: これは単なる要約であり、ページの解像度で実際に起こっていることです。
はい、同じ物理メモリがプロセス (親と子) によって共有されます。
これは、それぞれが仮想アドレス空間を物理アドレス空間に変換する独自の PTE を持っていることを意味します。フォークの直後は、一般的に同じです。
はい、フォーク後、それぞれが最初は同一の独自のアドレス空間を持つことを意味しますが、後で変更することができます。たとえば、COW、malloc、free では、基本的にプロセスのメモリ使用量が変更されます。
ページ テーブルは、線形アドレスと物理アドレスをマッピングするプロセスごとのデータ構造です。ページ テーブル エントリは親から子にコピーされます。つまり、 の直後にfork()
、両方のプロセスが同じページ テーブルを使用し、同じ物理アドレスを各プロセスのアドレス空間の同じ線形アドレスにマップします。ただし、この後、各 COW フォールトが発生し、その他のアドレス空間の変更が行われると、ページ テーブルが分岐し始めます。