傻瓜式拷貝
地址空間複製
內核原樣複製父進程的整個地址空間並把複製的那一份分配給子進程
1.爲子進程的頁表分配頁面
2.爲子進程的頁分配頁面
3.初始化子進程的頁表
4. 把父進程的頁複製到子進程相應的頁中
不被使用
涉及許多內存訪問,消耗許多CPU週期,並且完全破壞了高速緩存中的內容
但子程序往往是在裝入一個新的程序之後被執行,完全丟棄了所繼承的地址空間
寫時拷貝
共享頁面
父進程和子進程共享頁面而不是複製頁面。
父進程和子進程都不能修改被共享的頁面
寫共享頁面
產生錯誤
內核把這個頁複製到一個新頁面中 標記爲可寫
原來頁面保持寫保護狀態
寫入時內核檢查該進程是否是頁面的唯一屬主 是的話標記頁面對這個進程可寫
寫時拷貝的開銷
fork()後立即執行exec(),地址空間就無需被複制了。fork()的實際開銷就是複製父進程的頁表以及給子進程創建一個進程描述符
子進程會被放在隊列的前面優先執行,以免父進程執行導致寫時拷貝,子進程exec無意義複製導致效率下降。
寫時拷貝
有父進程主體P1 在其虛擬地址空間有.text/.data/.stack/.heap四部分,相應的是
內核要爲這四個部分分配各自的物理塊,代碼段塊、數據段塊、堆快、棧快