維基百科
:
寫入時複製(copy-on-write)是乙個被使用在程式設計領域的最佳化策略。其基礎的觀念是,如果有多個呼叫者(callers)同時要求相同資源,他們會共同取得相同的指標指向相同的資源,直到某個呼叫者(caller)嘗試修改資源時,系統才會真正複製乙個副本(private copy)給該呼叫者,以避免被修改的資源被直接察覺到,這過程對其他的呼叫只都是通透的(transparently)。此作法主要的優點是如果呼叫者並沒有修改該資源,就不會有副本(private copy)被建立。
第一代unix系統實現了一種傻瓜式的程序建立:當發出fork()系統呼叫時,核心原樣複製父程序的整個位址空間並把複製的那乙份分配給子程序。這種行為是非常耗時的,因為它需要:
- 為子程序的頁表分配頁幀
- 為子程序的頁分配頁幀
- 初始化子程序的頁表
- 把父程序的頁複製到子程序相應的頁中
這種建立位址空間的方法涉及許多記憶體訪問,消耗許多cpu週期,並且完全破壞了快取記憶體中的內容。在大多數情況下,這樣做常常是毫無意義的,因為許多子程序通過裝入乙個新的程式開始它們的執行,這樣就完全丟棄了所繼承的位址空間。
現在的linux核心採用一種更為有效的方法,稱之為寫時複製(copy on write,cow)。這種思想相當簡單:父程序和子程序共享頁幀而不是複製頁幀。然而,只要頁幀被共享,它們就不能被修改,即頁幀被保護。無論父程序還是子程序何時試圖寫乙個共享的頁幀,就產生乙個異常,這時核心就把這個頁複製到乙個新的頁幀中並標記為可寫。原來的頁幀仍然是寫保護的:當其他程序試圖寫入時,核心檢查寫程序是否是這個頁幀的唯一屬主,如果是,就把這個頁幀標記為對這個程序是可寫的。
寫時拷貝技術 COW
寫時拷貝技術實際上是一種拖延戰術,是為了提高效率而產生的技術,這怎麼提高效率呢?實際上就是在需要開闢空間時,假裝開了空間,實際上用的還是原來的空間,減少開闢空間的時間,等到真正要使用新空間的時候才去真正開闢空間。舉乙個例子理解寫時拷貝技術 我們小時候經常會遇到這種情況 家裡面有哥哥姐姐的,大人們經常...
String系列 寫時複製COW
前言 寫時複製是一種比價常用的技術,linux程序fork,vc6的string類等等,都使用了寫時複製。下面利用mstring類來實現一下cow,以進一步明白其中原理。在我前兩篇部落格中實現了mstring的基礎實現和運算子過載 要實現cow,其實很簡單的,只需要修改拷貝構造,賦值構造,修改字串的...
Copy On Write寫時複製
copy on write解決的問題 早期unix系統建立程序的方式存在缺陷 當發出fork 系統呼叫時,核心原樣複製父程序的整個位址空間並把複製的那乙份分配給子程序。這種行為是非常耗時的,因為它需要 為子程序的頁表分配頁幀 為子程序的頁分配頁幀 初始化子程序的頁表 把父程序的頁複製到子程序相應的頁...