寫時複製(copy-on-write)

    傳統的fork()系統調用直接把所有的資源複製給新創建的進程。這種實現過於簡單並且效率低下,因爲它拷貝的數據或許可以共享(This approach is significantly naïve and inefficient in that it copies much data that might otherwise be shared.)。更糟糕的是,如果新進程打算立即執行一個新的映像,那麼所有的拷貝都將前功盡棄。Linux的fork()使用寫時拷貝(copy-on-write)頁實現。寫時拷貝是一種可以推遲甚至避免拷貝數據的技術。內核此時並不複製整個進程的地址空間,而是讓父子進程共享同一個地址空間。只用在需要寫入的時候纔會複製地址空間,從而使各個進行擁有各自的地址空間。也就是說,資源的複製是在需要寫入的時候纔會進行,在此之前,只有以只讀方式共享。這種技術使地址空間上的頁的拷貝被推遲到實際發生寫入的時候。在頁根本不會被寫入的情況下---例如,fork()後立即執行exec(),地址空間就無需被複制了。fork()的實際開銷就是複製父進程的頁表以及給子進程創建一個進程描述符。在一般情況下,進程創建後都爲馬上運行一個可執行的文件,這種優化,可以避免拷貝大量根本就不會被使用的數據(地址空間裏常常包含數十兆的數據)。由於Unix強調進程快速執行的能力,所以這個優化是很重要的。
http://hi.baidu.com/zengzhaonong/blog/item/90ce8d5802d044de9d82043f.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章