剛了解到。趕快記下來。
每個程式都有自己的資料段,**段。。。
補充:dll有自己的資料段,但沒有自己的堆疊。
乙個dll,被很多程式呼叫,為什麼**段共享,資料段不共享?就是因為 記憶體的copy on write 機制
程式1呼叫這個dll,執行過程中,dll的資料段肯定會改變,那記憶體就會被copy乙份,原來的依然存在不受影響。
程式2呼叫這個dll,仍然用的是最開始的資料段,他往裡寫時再copy乙份,這就保證了兩個程式互不影響。
而**段是一般不會被更改的,所以才來的**段共享這個概念。
如果用hook等技術,把**改了,**同樣會被copy乙份之後再改,所以不會影響其它的程序,只會影響你改的程序。
要實現程序1程序2資料共享,只能定義自己的段 ,全域性變數和static變數因為記憶體copy機制,不會起作用的。
自己的段的定義方法:
#pragma data_seg("share_data_seg")
定義資料(必須初始化)
#pragma data_seg()
或者#pragma bbs_seg("share_data_seg")
定義資料(不必初始化)
#pragma bbs_seg()
然後定義他的訪問機制為rws: 表示具有讀,寫和共享屬性
#pragma comment(linker, "/section: share_data_seg rws")
也可以給工程新增def檔案,在裡邊定義。
記憶體共享和Copy On Write技術
剛看到一篇文章 標準c 類std string的 記憶體共享和copy on write技術 覺得很有意思,於是將個人的理解記錄於此。1.copy on write技術 copy on write技術使用了 引用計數 當第乙個類構造時,string 的建構函式會根據傳入的引數從堆上分配記憶體,當有其...
PHP中copy on write寫時複製機制介紹
什麼是寫時複製 copy on write 答 在複製乙個物件的時候並不是真正的把原先的物件複製到記憶體的另外乙個位置上,而是在新物件的記憶體對映表中設定乙個指標,指向源物件的位置,並把那塊記憶體的copy on write位設定為1.這樣,在對新的物件執行讀操作的時候,記憶體資料不發生任何變動,直...
使用記憶體新主張CopyOnWrite(寫時拷貝)
一 什麼是寫時拷貝技術?寫時拷貝技術可以理解為 寫的時候才去分配空間 這實際上是一種拖延戰術。舉個栗子 二 寫時拷貝技術原理 寫時拷貝技術是通過 引用計數 實現的,在分配空間的時候多分配4個位元組,用來記錄有多少個指標指向塊空間,當有新的指標指向這塊空間時,引用計數加一,當要釋放這塊空間時,引用計數...