CPU 讀、修改記憶體資料過程
阿新 • • 發佈:2019-01-08
之前一直不明白為什麼一個執行緒修改了資料(不用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取值的時候直接從記憶體中獲取(原子操作)