我正在閱讀有關使用COW - 在現代類UNIX系統中執行fork
之後的方法。後叉工作後COW如何?
假設我們有進程--P1。它分叉;我們得到另一個進程 - P2。 由於COW,它們的虛擬內存由相同的物理頁面支持。 有一個頁面,其中一個靜態全局變量(例如,static long variable;
以外的main
)位於(在。數據段),其由物理頁A.備份
現在P1改變其靜態全局變量;內核在處理保護錯誤後,將新頁面(頁面B)映射到P1的虛擬內存以存儲該已更改的變量。
同樣的方法P2在處理保護錯誤後更改其靜態全局變量內核,將新頁面(頁面C)映射到P1的虛擬內存以存儲更改後的變量。
現在什麼都沒有引用頁面A. 它位於何處?我想這不是「懸在空中」,使一個物理頁面不能使用,從而浪費內存?
爲什麼不只是修改A,因爲只有一個引用它?如果沒有使用它,爲什麼它會保存在物理內存中? –
@Sami,你的意思是,P2可以改變A'頁面標誌而不是映射新的「C」頁面?我認爲父母可能有多個孩子,因此A應該保持只讀? –