科普:CPU緩存一致性協議
2019-04-04 15:01:22 未知CPU在摩爾定律的指導下以每18個月翻一番的速度在發展,然而內存和硬盤的發展速度遠遠不及CPU。這就造成了高性能能的內存和硬盤價格及其昂貴。然而CPU的高度運算需要高速的數據。為了解決這個問題,CPU廠商在CPU中內置了少量的高速緩存以解決IO速度和CPU運算速度之間的不匹配問題。
在CPU訪問存儲設備時,無論是存取數據抑或存取指令,都趨于聚集在一片連續的區域中,這就被稱為局部性原理。
時間局部性(Temporal Locality):如果一個信息項正在被訪問,那么在近期它很可能還會被再次訪問。
比如循環、遞歸、方法的反復調用等。
空間局部性(Spatial Locality):如果一個存儲器的位置被引用,那么將來他附近的位置也會被引用。
比如順序執行的代碼、連續創建的兩個對象、數組等。
帶有高速緩存的CPU執行計算的流程
由于CPU的運算速度超越了1級緩存的數據IO能力,CPU廠商又引入了多級的緩存結構。
多級緩存結構
多核CPU的情況下有多個一級緩存,如何保證緩存內部數據的一致,不讓系統數據混亂。這里就引出了一個一致性的協議MESI。
緩存一致性協議MESI
MESI(Modified Exclusive Shared Or Invalid)(也稱為伊利諾斯協議,是因為該協議由伊利諾斯州立大學提出)是一種廣泛使用的支持寫回策略的緩存一致性協議。
CPU中每個緩存行(caceh line)使用4種狀態進行標記(使用額外的兩位(bit)表示):
M: 被修改(Modified)
該緩存行只被緩存在該CPU的緩存中,并且是被修改過的(dirty),即與主存中的數據不一致,該緩存行中的內存需要在未來的某個時間點(允許其它CPU讀取請主存中相應內存之前)寫回(write back)主存。
當被寫回主存之后,該緩存行的狀態會變成獨享(exclusive)狀態。
E: 獨享的(Exclusive)
該緩存行只被緩存在該CPU的緩存中,它是未被修改過的(clean),與主存中數據一致。該狀態可以在任何時刻當有其它CPU讀取該內存時變成共享狀態(shared)。
同樣地,當CPU修改該緩存行中內容時,該狀態可以變成Modified狀態。
S: 共享的(Shared)
該狀態意味著該緩存行可能被多個CPU緩存,并且各個緩存中的數據與主存數據一致(clean),當有一個CPU修改該緩存行中,其它CPU中該緩存行可以被作廢(變成無效狀態(Invalid))。
I: 無效的(Invalid)
該緩存是無效的(可能有其它CPU修改了該緩存行)。
MESI狀態轉換圖
狀態之間的相互轉換關系也可以使用下表進行表示。
操作
在一個典型系統中,可能會有幾個緩存(在多核系統中,每個核心都會有自己的緩存)共享主存總線,每個相應的CPU會發出讀寫請求,而緩存的目的是為了減少CPU讀寫共享主存的次數。
一個緩存除在Invalid狀態外都可以滿足cpu的讀請求,一個Invalid的緩存行必須從主存中讀取(變成S或者 E狀態)來滿足該CPU的讀請求。
一個寫請求只有在該緩存行是M或者E狀態時才能被執行,如果緩存行處于S狀態,必須先將其它緩存中該緩存行變成Invalid狀態(也既是不允許不同CPU同時修改同一緩存行,即使修改該緩存行中不同位置的數據也不允許)。該操作經常作用廣播的方式來完成,例如:RequestFor Ownership (RFO)。
緩存可以隨時將一個非M狀態的緩存行作廢,或者變成Invalid狀態,而一個M狀態的緩存行必須先被寫回主存。
一個處于M狀態的緩存行必須時刻監聽所有試圖讀該緩存行相對就主存的操作,這種操作必須在緩存將該緩存行寫回主存并將狀態變成S狀態之前被延遲執行。
一個處于S狀態的緩存行也必須監聽其它緩存使該緩存行無效或者獨享該緩存行的請求,并將該緩存行變成無效(Invalid)。
一個處于E狀態的緩存行也必須監聽其它緩存讀主存中該緩存行的操作,一旦有這種操作,該緩存行需要變成S狀態。
對于M和E狀態而言總是精確的,他們在和該緩存行的真正狀態是一致的。而S狀態可能是非一致的,如果一個緩存將處于S狀態的緩存行作廢了,而另一個緩存實際上可能已經
獨享了該緩存行,但是該緩存卻不會將該緩存行升遷為E狀態,這是因為其它緩存不會廣播他們作廢掉該緩存行的通知,同樣由于緩存并沒有保存該緩存行的copy的數量,因此(即使有這種通知)也沒有辦法確定自己是否已經獨享了該緩存行。
從上面的意義看來E狀態是一種投機性的優化:如果一個CPU想修改一個處于S狀態的緩存行,總線事務需要將所有該緩存行的copy變成Invalid狀態,而修改E狀態的緩存不需要使用總線事務。
參考:
計算機體系結構(第五版)-復習-MESI&MOESI協議
https://www.cnblogs.com/yanlong300/p/8986041.html
https://www.cnblogs.com/z00377750/p/9180644.html