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狀態轉換圖
狀態之間的相互轉換關係也可以使用下表進行表示。
操作:
在一個典型系統中,可能會有幾個緩衝(在多核系統中,每個核心都會有自己的緩衝)共用主存匯流排,每個相應的CPU會發出讀寫請求,而緩衝的目的是為了減少CPU讀寫共用主存的次數。
一個緩衝除在Invalid狀態外都可以滿足cpu的讀請求,一個invalid的緩衝行必須從主存中讀取(變成S或者 E狀態)來滿足該CPU的讀請求。
一個寫請求只有在該緩衝行是M或者E狀態時才能被執行,如果緩衝行處於S狀態,必須先將其它緩衝中該緩衝行變成Invalid狀態(也既是不允許不同CPU同時修改同一緩衝行,即使修改該緩衝行中不同位置的資料也不允許)。該操作經常作用廣播的方式來完成,例如:Request
For Ownership (RFO)
緩衝可以隨時將一個非M狀態的緩衝行作廢,或者變成Invalid狀態,而一個M狀態的緩衝行必須先被寫回主存。
一個處於M狀態的緩衝行必須時刻監聽所有試圖讀該緩衝行相對就主存的操作,這種操作必須在緩衝將該緩衝行寫回主存並將狀態變成S狀態之前被順延強制。
一個處於S狀態的緩衝行也必須監聽其它緩衝使該緩衝行無效或者獨享該緩衝行的請求,並將該緩衝行變成無效(Invalid)。
一個處於E狀態的緩衝行也必須監聽其它緩衝讀主存中該緩衝行的操作,一旦有這種操作,該緩衝行需要變成S狀態。
對於M和E狀態而言總是精確的,他們在和該緩衝行的真正狀態是一致的。而S狀態可能是非一致的,如果一個緩衝將處於S狀態的緩衝行作廢了,而另一個緩衝實際上可能已經獨享了該緩衝行,但是該緩衝卻不會將該緩衝行升遷為E狀態,這是因為其它緩衝不會廣播他們作廢掉該緩衝行的通知,同樣由於緩衝並沒有儲存該緩衝行的copy的數量,因此(即使有這種通知)也沒有辦法確定自己是否已經獨享了該緩衝行。
從上面的意義看來E狀態是一種投機性的最佳化:如果一個CPU想修改一個處於S狀態的緩衝行,匯流排事務需要將所有該緩衝行的copy變成invalid狀態,而修改E狀態的緩衝不需要使用匯流排事務。
英文原文http://en.wikipedia.org/wiki/MESI_protocol