MESI(Modified Exclusive Shared Or Invalid)(也稱為伊利諾斯協議,是因為該協議由伊利諾斯州立大學提出)是一種廣泛使用的支持寫回策略的緩存一致性協議,該協議被應用在Intel奔騰系列的CPU中,詳見“support the more efficient write-back cache in addition to the write-through cache previously used by the Intel 486 processor”
MESI協議中的狀態
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狀態轉換圖
狀態之間的相互轉換關系也可以使用下表進行表示。
M | E | S | I | |
---|---|---|---|---|
M | ![]() |
![]() |
![]() |
![]() |
E | ![]() |
![]() |
![]() |
![]() |
S | ![]() |
![]() |
![]() |
![]() |
I | ![]() |
![]() |
![]() |
![]() |
操作:
在一個典型系統中,可能會有幾個緩存(在多核系統中,每個核心都會有自己的緩存)共享主存總線,每個相應的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狀態的緩存不需要
使用總線事務。