カーネルがコード セクションが同じ 2 つのプロセスを作成する場合、カーネルは実際に両方のプロセスの仮想アドレス空間にコードをコピーしますか? つまり、メモリ内に同じプログラムの 2 つのプロセスを作成した場合、プログラムのコピーが 2 つあるのか、それとも 1 つだけなのか?
明らかに、実装に依存する可能性がありますが、従来の Unix OS で質問しています。
カーネルは実際に両方のプロセスの仮想アドレス空間にコードをコピーしますか?
テキスト セグメントは (コピーではなく) 各プロセスの仮想アドレス空間にマップされますが、同じ物理空間を参照します (したがって、カーネルはメモリ内にテキストのコピーを 1 つだけ持つことになります)。
data および bss セグメントも各プロセスの仮想アドレス空間にマップされますが、これらはプロセスごとに作成されます。プロセスの開始時に、実行可能ファイルの data セグメントと bss セグメントのデータが、プロセスの仮想メモリにマップ/コピーされます。最初からコピーされなかった場合、プロセスがデータへの書き込みを開始するとすぐに、プロセスには独自のプライベートコピーが与えられます。
明らかに、共有メモリと mmap されたメモリは、プロセスの開始後に処理されます。共有メモリは常にプロセス間で共有されます。それがその存在理由です。mmap で何が起こるかは、使用するフラグによって異なりますが、共有されることもよくあります。
最新のオペレーティング システムでは、コピー オン ライトを使用して、実際に更新されるまでページの重複を回避します。多くのシステム (Linux を含む) では、これによりオーバーコミットが発生する可能性があることに注意してください。この場合、すべてのプロセスが複製されていないページを変更することを決定した場合に、必要なすべてのコピーに対処するのに十分な RAM が OS に実際にはありません。