ram是什么意思 ram是什么( 六 )


這個時候可以再回頭看看"圖4:一個存儲器層次結構的示例" 。
下面這張圖和這段文字來自《深入理解計算機系統》(CSAPP),大家可以有個更嚴謹和細節的認識 。

ram是什么意思  ram是什么

文章插圖
圖8:存儲器層次結構中基本的緩存原理
存儲器層次結構的中心思想:位于k層的更快更小的存儲設備作為位于k+1層得更大更慢的存儲設備的緩存;數據總是以塊大小為傳送單元(transfer unit)在第k層和第k+1層之間來回拷貝的;任何一對相鄰的層次之間傳送的塊大小是固定的,即每一級緩存的塊大小是固定的 。但是其它的層次對之間可以有不同的塊大小 。
當程序需要第k+1層的某個數據對象d時,它首先在當前存儲在第k層的一個塊中查找d 。如果d剛好在k層,那么就是緩存命中 。如果第k層中沒有緩存數據對象d,那么就是緩存命不中 。當緩存不命中發生時,第k層的緩存從第k+1層 緩存中取出包含d的那個塊,如果第k層的緩存已經滿了的話,可能會覆蓋現存的一個塊 。(覆蓋策略可以使用常見的LRU算法) 。
volatile 關鍵字在java和C當中,有一個volatile關鍵字(其他語言估計也有),它的作用就是在多線程時保證變量的內存可見性,但是具體怎么理解呢?
我們在"圖4:一個存儲器層次結構的示例"中,說的緩存結構其實對于一個單核CPU而言的,比如 對于 一個四核三級緩存的CPU,它的緩存結構是這樣的 。
ram是什么意思  ram是什么

文章插圖
圖9:多核處理器緩存結構
我們可以看到L3是四個核共有的,但是L2,L1其實是每個核私有的,如果我有一個變量var,它會被兩個線程同時讀取,這兩個線程在兩個核上并行執行,因為我們的緩存原理,這個var可能分別在兩個核的 L2或L1緩存,這樣讀取速度最快,但是該var值可能就分別被這兩個核分別修改成不同的值,最后將值回寫到L3或L4主存,此時就會發生bug了 。
所以volatile關鍵字就是預防這種情況,對于被volatile修飾的的變量,每次CPU需要讀取時,都至少要從L3讀取,并且CPU計算結束后,也立刻回寫到L3中,這樣讀寫速度雖然減慢了一些,但是避免了該值在每個core的私有緩存中單獨操作而其他核不知道 。

推薦閱讀