前言:寫時複製是一種比價常用的技術,linux程序fork,vc6的string類等等,都使用了寫時複製。下面利用mstring類來實現一下cow,以進一步明白其中原理。
在我前兩篇部落格中實現了mstring的基礎實現和運算子過載(
要實現cow,其實很簡單的,只需要修改拷貝構造,賦值構造,修改字串的類,新增引用計數變數即可。
在mstring.h中新增:size_t *m_used;
代表引用的個數。
拷貝構造
mstring::mstring(const mstring& s)
賦值構造:
mstring& mstring::operator=(const mstring& s)
建構函式:
mstring::mstring(size_t n)
mstring::~mstring()
delete m_used;
m_used =null;
}}
只要有修改字串的情況,都要實現複製操作,需要注意的就是讓m_used減1,重新建立乙個新的mstring類,。注意所有類、賦值等的左值情況需要過載與mstring相關的全域性操作符。
最後,開始準備寫乙個完備的cow技術的mstring後來發現,其實沒有多大意義,開啟vc6的string原始碼,裡面實現的非常完美。關於cow技術,其實只要理解其實現基本原理即可,當我們在實際應用的時候,要根據不同的邏輯來實現,比如在io快取中,當緩衝池滿了或關閉的情況才去將內容複製到裝置上。
寫時複製技術(COW)
維基百科 寫入時複製 copy on write 是乙個被使用在程式設計領域的最佳化策略。其基礎的觀念是,如果有多個呼叫者 callers 同時要求相同資源,他們會共同取得相同的指標指向相同的資源,直到某個呼叫者 caller 嘗試修改資源時,系統才會真正複製乙個副本 private copy 給該...
寫時拷貝技術 COW
寫時拷貝技術實際上是一種拖延戰術,是為了提高效率而產生的技術,這怎麼提高效率呢?實際上就是在需要開闢空間時,假裝開了空間,實際上用的還是原來的空間,減少開闢空間的時間,等到真正要使用新空間的時候才去真正開闢空間。舉乙個例子理解寫時拷貝技術 我們小時候經常會遇到這種情況 家裡面有哥哥姐姐的,大人們經常...
Copy On Write寫時複製
copy on write解決的問題 早期unix系統建立程序的方式存在缺陷 當發出fork 系統呼叫時,核心原樣複製父程序的整個位址空間並把複製的那乙份分配給子程序。這種行為是非常耗時的,因為它需要 為子程序的頁表分配頁幀 為子程序的頁分配頁幀 初始化子程序的頁表 把父程序的頁複製到子程序相應的頁...