寫時拷貝技術 Copy On Write

2021-08-20 16:24:05 字數 1884 閱讀 8216

copy-on-write是一種技術——去高效的完成「懶惰行為」。其核心思想就是:只有在需要分配記憶體的時候才會進行記憶體分配。這種思想廣泛的運用在作業系統和c++程式設計中。

在作業系統當中,當乙個程式執行結束時,作業系統並不會急著把其清除出記憶體,原因是有可能程式還會馬上再執行一次,而只有當記憶體不夠用了,才會把這些還駐留記憶體的程式清出。這樣既盡可能地減少了cpu讀取磁碟的次數,又可以保證功能的正確性。

在c++中copy-on-write技術被廣泛地應用於智慧型指標和字串類等地方。例如在qt的框架中,許多態別應用了該技術,qt的術語叫做隱式共享(」implicialy shared」), 通過compare-and-swap 操作增減內部參考計數器來完成操作。因為複製時相對廉價的,所以qt可以經常安全地使用多執行緒。

對於某些類而言,每一次都執行深拷貝會極大的降低執行效率,為了提高計算機執行效率

確保在需要進行深拷貝的時候(內容被改變的時候)執行深拷貝,確保程式的準確性

設定乙個計數器,標明引用的個數,當引用數量為0時,刪除該物件:

1. 在物件生命週期結束(呼叫析構函式)or需要寫入的時候,計數器減一

2. 在執行拷貝構造or賦值函式的時候,計數器加一

3. 在賦值函式中,輸入的左值將被重新賦值,所以需要將之前所指向的位址的計數器減一

乙個簡單的智慧型指標的實現

#include 

using

namespace

std;

template

class cowptr;

ptr* ptr;

void detach();

public:

cowptr(const t* p =null);

cowptr(const cowptr& cp);

cowptr& operator=(const cowptr& cp);

unsigned

int getcount() const;

t* getpoint() const;

t& operator *();

t operator *() const;

t* operator ->();

const t* operator ->() const;

~cowptr();

};template

void cowptr::detach()

}template

cowptr::cowptr(const t* p)

template

cowptr::cowptr(const cowptr& cp)

template

cowptr& cowptr::operator=(const cowptr& cp)

ptr= cp.ptr;

ptr->counter++;

}return *this;

}template

unsigned

int cowptr::getcount() const

template

t* cowptr::getpoint() const

template

t& cowptr::operator *()

template

t cowptr::operator *() const

template

t* cowptr::operator ->()

template

const t* cowptr::operator ->() const

template

cowptr::~cowptr()

}class test

這個只實現了部分功能,每有乙個指標指向共享記憶體,計數器加一,計數器為0的時候釋放記憶體。但是沒有實現在寫的時候自動拷貝的功能

寫時拷貝技術

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

寫時拷貝技術

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

寫時拷貝技術

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