寫時拷貝的主要思想是在複製原來實體的時候,如果複製後的實體不需要進行改變,那麼實際上沒必要進行實體內容的拷貝,只需建立乙個引用指向原來的物理記憶體,直接應用原來的實體內容即可,只有當需要對複製後的實體進行修改的時候才進行內容的拷貝。
寫時拷貝技術在很多方面都有應用,典型的有:
c++中的寫時拷貝技術
linux中的寫時拷貝技術
一、c++中的寫時拷貝技術
c++中的寫時拷貝是通過「引用計數」實現的,在分配空間的時候,多分配4個位元組,用來記錄有多少個指標指向該記憶體塊,當有新的指標指向該記憶體塊的時候,該「引用計數」加一,當要釋放該空間時,「引用計數」減一,當「引用計數」減為0時,釋放該空間記憶體。當某個指標需要改變該記憶體空間中的值的時候,再為這個指標分配自己的空間(舊的記憶體空間中「引用計數」減一)。
對於上述情況就需要注意一點,只有當能夠準確捕捉使用者是否進行了寫操作才可以使用寫時拷貝計數。比如c++標準認為當你使用迭代器或獲取到string的內部位址的時候,string並不知道你將進行讀操作還是寫操作。這是無法確定的,為此當你獲取到內部引用的時候,為了避免不能捕獲你的寫操作,它在此時廢除了寫操作。
二、linux中的寫時拷貝技術
在linux程式中,fork()會產生乙個和父程序相同的程序,但子程序之後多會exec呼叫,處於效率考慮,linux也使用了「寫時拷貝技術」,也就是只有程序空間的各段內容發生變化時,才會將父程序的內容複製乙份給子程序。
那麼就會有這樣的疑問:子程序的物理空間沒有**,怎麼執行exec系統呼叫呢?
在執行fork之後、exec之前,兩個程序使用的是相同的實體地址空間,子程序的**段、資料段、堆疊都是指向父程序的實體地址空間,也就是說,兩者的虛擬位址空間不同,但其對應的物理空間是相同的。當父子程序有更改相應段的行為發生時,再為子程序相應的段分配物理空間
寫時拷貝技術
cow技術初窺 在linux程式中,fork 會產生乙個和父程序完全相同的子程序,但子程序在此後多會exec系統呼叫,出於效率考慮,linux中引入了 寫時複製 技術,也就是只有程序空間的各段的內容要發生變化時,才會將父程序的內容複製乙份給子程序。那麼子程序的物理空間沒有 怎麼去取指令執行exec系...
寫時拷貝技術
寫時拷貝故名思意 是在寫的時候 即改變字串的時候 才會真正的開闢空間拷貝 深拷貝 如果只是對資料的讀時,只會對資料進行淺拷貝 寫時拷貝技術是通過 引用計數 實現的,在分配空間的時候多分配4個位元組,用來記錄有多少個指標指向塊空間,當有新的指標指向這塊空間時,引用計數加一,當要釋放這塊空間時,引用計數...
linux寫時拷貝技術
cow技術初窺 在linux程式中,fork 會產生乙個和父程序完全相同的子程序,但子程序在此後多會exec系統呼叫,出於效率考慮,linux中引入了 寫時複製 技術,也就是只有程序空間的各段的內容要發生變化時,才會將父程序的內容複製乙份給子程序。那麼子程序的物理空間沒有 怎麼去取指令執行exec系...