雜記 寫時拷貝技術

2021-10-24 02:09:57 字數 1007 閱讀 6630

參考文獻

在linux中,fork()產生乙個父程序相似的子程序,但是一般情況下,子程序在此之後會呼叫exec函式族。如果這個時候把各個段都拷貝到子程序,就會造成很大的效率浪費。

這是不用寫時拷貝的**

可以看到,核心將父程序的資訊複製到子程序並為子程序開闢了物理空間

所以linux引入了寫時拷貝技術,也就是當各個段的內容要發生變化時,才會將父程序的內容複製乙份給子程序。當然,不變化則父子程序共享資源。

再來看一下寫時拷貝技術

明顯省略了開闢物理空間的花銷

我們剛剛提到的寫時拷貝會導致子程序的物理空間沒有**,那麼子程序如何去取指令執行exec系統呼叫?

fork之後exec之前兩個程序用的是相同的物理空間(記憶體區),子程序的**段、資料段、堆疊都是指向父程序的物理空間,也就是說,兩者的虛擬空間不同,但其對應的物理空間是同乙個。

當父子程序中有更改相應段的行為發生時,再為子程序相應的段分配物理空間,如果不是因為exec,核心會給子程序的資料段、堆疊段分配相應的物理空間(至此兩者有各自的程序空間,互不影響),而代碼段繼續共享父程序的物理空間(兩者的**完全相同)。而如果是因為exec,由於兩者執行的**不同,子程序的**段也會分配單獨的物理空間。

這裡還看到乙個細節問題:

fork之後核心往往會把子程序的執行順序放在佇列前面,讓子程序先執行,以免父程序執行導致寫時複製影響效率。

[1] as_.linux寫時拷貝技術..2012.07.20

寫時拷貝技術

cow技術初窺 在linux程式中,fork 會產生乙個和父程序完全相同的子程序,但子程序在此後多會exec系統呼叫,出於效率考慮,linux中引入了 寫時複製 技術,也就是只有程序空間的各段的內容要發生變化時,才會將父程序的內容複製乙份給子程序。那麼子程序的物理空間沒有 怎麼去取指令執行exec系...

寫時拷貝技術

寫時拷貝故名思意 是在寫的時候 即改變字串的時候 才會真正的開闢空間拷貝 深拷貝 如果只是對資料的讀時,只會對資料進行淺拷貝 寫時拷貝技術是通過 引用計數 實現的,在分配空間的時候多分配4個位元組,用來記錄有多少個指標指向塊空間,當有新的指標指向這塊空間時,引用計數加一,當要釋放這塊空間時,引用計數...

寫時拷貝技術

寫時拷貝的主要思想是在複製原來實體的時候,如果複製後的實體不需要進行改變,那麼實際上沒必要進行實體內容的拷貝,只需建立乙個引用指向原來的物理記憶體,直接應用原來的實體內容即可,只有當需要對複製後的實體進行修改的時候才進行內容的拷貝。寫時拷貝技術在很多方面都有應用,典型的有 c 中的寫時拷貝技術 li...