第一代Unix系統(tǒng)實現(xiàn)了一種傻瓜式的進(jìn)程創(chuàng)建:當(dāng)執(zhí)行fork系統(tǒng)調(diào)用時撒汉,內(nèi)核復(fù)制父進(jìn)程的整個用戶空間并把復(fù)制得到的那一份分配給子進(jìn)程澜搅。這種行為時非常耗時的虑乖,因為它需要完成以下幾項任務(wù):
- 為子進(jìn)程的頁表分配頁面
- 為子進(jìn)程的頁分配頁面
- 初始化子進(jìn)程的頁表
- 把父進(jìn)程的頁復(fù)制到子進(jìn)程對應(yīng)的頁中
寫時復(fù)制(copy-on-write)是一種可以推遲甚至避免復(fù)制數(shù)據(jù)的技術(shù)挨务。內(nèi)核此時并不是復(fù)制整個進(jìn)程空間纯丸,而是讓父進(jìn)程和子進(jìn)程共享同一個副本晌畅。只有在需要寫入的時候但指,數(shù)據(jù)才會被復(fù)制,從而使父進(jìn)程、子進(jìn)程擁有各自的副本棋凳。也就是說拦坠,資源的復(fù)制只有在需要寫入的時候才進(jìn)行,在此之前以只讀方式共享剩岳。這種技術(shù)使得對地址空間中的頁的復(fù)制被推遲到實際發(fā)生寫入的時候贞滨。有時共享頁根本不會被寫入,例如拍棕,fork()后立即調(diào)用exec()晓铆,就無需復(fù)制父進(jìn)程的頁了。fork()實際開銷就是復(fù)制父進(jìn)程的頁表以及給子進(jìn)程創(chuàng)建唯一的PCB绰播。這種優(yōu)化可以避免復(fù)制大量根本就不會使用的數(shù)據(jù)骄噪。