CPU多級緩存與緩存一致性

cache的作用

隨着現代半導體工藝的發展,CPU的頻率越來遠快,相對內存快了一個數量級,對於訪存的操作CPU就需要等待主存,這樣會導致資源的白白浪費。所以cache的出現是爲了解決CPU與內存速度不匹配的問題。

cache的思想在我們日常的生活隨處可見,我們周圍的便利店就是個很好的例子。工廠把我們日常用品部分存儲在便利店,省掉了直接從工廠購買所需要的時間開銷,方便了我們的生活。

cache 的工作原理是基於“局部性”原理,它包含以下兩個方面:

時間局部性:如果某個數據被訪問,那麼不久將來它很可能再次被訪問。
空間局部性:如果某個數據被訪問,那麼與它相鄰的數據也可能被訪問。

現在的多核CPU的緩存一般都到了3級
這裏寫圖片描述

cache中保存着cpu剛用過的數據或者是循環使用的數據,這時,從cache中讀取數據就會很快,減少了cpu等待的時間,提高了系統的性能。
cache帶來的問題

cache 給系統帶來性能上飛躍的同時,也引入了新的問題“緩存一致性問題”。設想如下場景(cpu一共有兩個核,core1和core2):
以i++爲例,i的初始值是0.那麼在開始每個核都存儲了i的值0,當第core1塊做i++的時候,其緩存中的值變成了1,即使馬上回寫到主內存,那麼在回寫之後core2緩存中的i值依然是0,其執行i++,回寫到內存就會覆蓋第一塊內核的操作,使得最終的結果是1,而不是預期中的2。
緩存一致性

爲了達到數據訪問的一致,需要各個處理器在訪問緩存時遵循一些協議,在讀寫時根據協議來操作,常見的協議有MSI,MESI,MOSI等。我們介紹其中最經典的MESI協議。

在MESI協議中,每個cache line有4個狀態,可用2個bit表示,它們分別是:
狀態 描述
M(Modified) 這行數據有效,數據被修改了,和內存中的數據不一致,數據只存在於本Cache中。
E(Exclusive) 這行數據有效,數據和內存中的數據一致,數據只存在於本Cache中。
S(Shared) 這行數據有效,數據和內存中的數據一致,數據存在於很多Cache中。
I(Invalid) 這行數據無效

E狀態:
這裏寫圖片描述
只有Core 0訪問變量x,它的Cache line狀態爲E(Exclusive)。

S狀態:
這裏寫圖片描述
3個Core都訪問變量x,它們對應的Cache line爲S(Shared)狀態。

M狀態和I狀態:
這裏寫圖片描述
Core 0修改了x的值之後,這個Cache line變成了M(Modified)狀態,其他Core對應的Cache line變成了I(Invalid)狀態。

協議時序圖:
在MESI協議中,每個Cache的Cache控制器不僅知道自己的讀寫操作,而且也監聽(snoop)其它Cache的讀寫操作。每個Cache line所處的狀態根據本核和其它核的讀寫操作在4個狀態間進行遷移。
這裏寫圖片描述

在上圖中,Local Read表示本內核讀本Cache中的值,Local Write表示本內核寫本Cache中的值,Remote Read表示其它內核讀其它Cache中的值,Remote Write表示其它內核寫其它Cache中的值,箭頭表示本Cache line狀態的遷移,環形箭頭表示狀態不變。

MESI狀態之間的遷移過程
在這裏插入圖片描述
當前狀態 事件 行爲 下一個狀態
I(Invalid) Local Read 如果其它Cache沒有這份數據,本Cache從內存中取數據,Cache line狀態變成E; 如果其它Cache有這份數據,且狀態爲M,則將數據更新到內存,本Cache再從內存中取數據,2個Cache 的Cache line狀態都變成S; 如果其它Cache有這份數據,且狀態爲S或者E,本Cache從內存中取數據,這些Cache 的Cache line狀態都變成S E/S
Local Write 從內存中取數據,在Cache中修改,狀態變成M; 如果其它Cache有這份數據,且狀態爲M,則要先將數據更新到內存; 如果其它Cache有這份數據,則其它Cache的Cache line狀態變成I M
Remote Read 既然是Invalid,別的核的操作與它無關 I
Remote Write 既然是Invalid,別的核的操作與它無關 I
E(Exclusive) Local Read 從Cache中取數據,狀態不變 E
Local Write 修改Cache中的數據,狀態變成M M
Remote Read 數據和其它核共用,狀態變成了S S
Remote Write 數據被修改,本Cache line不能再使用,狀態變成I I
S(Shared) Local Read 從Cache中取數據,狀態不變 S
Local Write 修改Cache中的數據,狀態變成M, 其它核共享的Cache line狀態變成I M
Remote Read 狀態不變 S
Remote Write 數據被修改,本Cache line不能再使用,狀態變成I I
M(Modified) Local Read 從Cache中取數據,狀態不變 M
Local Write 修改Cache中的數據,狀態不變 M
Remote Read 這行數據被寫到內存中,使其它核能使用到最新的數據,狀態變成S S
Remote Write 這行數據被寫到內存中,使其它核能使用到最新的數據,由於其它核會修改這行數據, 狀態變成I I
參考資料

https://blog.csdn.net/muxiqingyang/article/details/6615199

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章