之前一直不明白為什麼乙個執行緒修改了資料(不用volatile修飾),而另乙個執行緒讀取時還是之前的值,網上查詢了一些資料做了個總結,純屬個人理解如有不對請指正
1.cpu快取(cache memory)是位於cpu和記憶體之間的臨時儲存器,它的容量小但是資料交換速度很快。
2.記憶體:它的容量比較大,但是cpu訪問記憶體的效率相對快取較低
有了快取和記憶體,記憶體儲器(快取+記憶體)就變成既有快取的高速度又有記憶體的大容量的儲存系統。
快取工作原理:cpu讀取乙個資料時,會先從快取中查詢,如果沒有找到才會從記憶體中查詢。(cpu下次要讀取的資料90%在快取中,因此效率很高)
現在的cpu與記憶體之間一般都存在一級緩衝區、二級緩衝區,這樣效率更高。
write-back:cpu在改寫了cache line後,並不是馬上把其寫回記憶體,而是將該cache line標誌為dirty。只有當cache中發生一次cache miss,其他的資料要占用該cache line時,cpu才會把其寫回記憶體。在實現write-back策略時,有乙個重要的問題是需要被考慮到的,當多個處理器訪問同一記憶體時,必須保證所有處理器所看到的記憶體內容是相同的,也就是一致性的問題。當乙個cache line被乙個處理器設定為dirty後,另乙個處理器要訪問同一記憶體,那麼顯然,該處理器真正需要的資料是前者的cache裡的資料,而不是記憶體中還未更新的資料。
個人理解:
在多執行緒程式設計中,乙個執行緒把資料更改了,而另乙個執行緒讀取這個資料還是之前的值,可能就是讀取的是緩衝區中的值,而不是記憶體中的值,用關鍵字volatile修飾變數就是告訴cpu取值的時候直接從記憶體中獲取(原子操作)
windows程式設計之記憶體資料修改
include stdafx.h include dword g arlist 1024 int g nlistcnt 0 handle g hprocess bool compareapage dword dwbaseaddr,dword dwvalue return true bool find...
華為手機使用應用沙盒動態修改cpu資料
較早前文章介紹了怎麼樣在安卓手機上安裝啟用xposed框架,xposed框架的強大功能大家都清楚,能不修改apk的前提下,修改系統底層的引數,打比方在某些應用需要,大家需要修改手機的某個系統引數,這情況下就需要使用xposed以及相關模組功能來實現。首先,具體xposed框架大夥可以在軟體作者官網了...
獲取或修改指定程序ID的記憶體資料
在程序id已知的前提下,如何獲取該程序在記憶體中的資料,下面提供一種方法。void getprocessmemory ulong pid,pvoid pvoid praddaddr size t nread bool isok readprocessmemory hprocess,praddaddr...