私は以下のようにLinuxが個人オブジェクトを管理する方法についての教科書を読んでいます。
図は、2 つのプロセスがプライベートオブジェクトを仮想メモリの異なる領域にマップしますが、オブジェクトの同じ物理コピーを共有する状況を示しています。個人オブジェクトをマッピングする各プロセスについて、その個人領域のページテーブルエントリは読み取り専用としてマークされ、領域構造は個人書き込み時にコピーとして表示されます。プロセスがプライベート領域のページに書き込もうとすると、書き込みによって保護エラーが発生します。エラーハンドラが書き込み領域のプライベートコピー内のページに書き込もうとしたために保護例外が発生したことが検出された場合は、物理メモリにページの新しいコピーを作成し、新しいページを指すようにページテーブルエントリを更新します。コピーしてページ書き込み権限を復元します。
私たちは、Linuxがvm_area_struct
(領域構造体)を使用して現在の仮想アドレス空間の領域を次のように表現していることを知っています。
vm_flags
書き込み中にコピーが機能するように、プライベート領域を「プライベート」に設定することができます。
私の質問は、プロセス2の仮想メモリ内の個人オブジェクトの個人領域があるとしますpa2
。したがって、最初にプロセス2は(開始仮想アドレスが仮定されている0x404000
)にページ書き込みを試みてpa2
保護エラーを引き起こし、それを処理し、物理メモリにページの新しいコピーを作成します。一定時間が経過した後にプログラムが0x404000
再起動するページを修正する必要がありますが、pa2
それでもプライベートゾーンであるため、別の保護エラーが発生し、ページの別の新しいコピーが物理メモリに作成されるとします。しかし、最初の新しいページはどうなりますか? ?最初のエラー処理中に生成されましたか?もはや仮想アドレスとして参照されず、それでも物理メモリに常駐します。これはリソースの無駄ですか?
答え1
ページエラーが発生した場合、カーネルは書き込み中のコピーシナリオで書き込みが失敗したと判断し、ページに少なくとも2人のユーザーがいる場合は、元のページを新しいページにコピーし(説明どおり)、新しいページに書き込み可能です。所有プロセスでは、同じページへの後続の書き込みはページエラーを引き起こしません。