原文:多線程之:MESI-CPU緩存一致性協議html
MESI
(Modified Exclusive Shared Or Invalid
)(也稱爲伊利諾斯協議,是由於該協議由伊利諾斯州立大學提出)是一種普遍使用的支持寫回策略的緩存一致性協議。緩存
CPU
中每一個緩存行(caceh line
)使用4種狀態進行標記(使用額外的兩位(bit
)表示):多線程
M: 被修改(Modified)優化
該緩存行只被緩存在該CPU
的緩存中,而且是被修改過的(dirty
),即與主存中的數據不一致,該緩存行中的內存須要在將來的某個時間點(容許其它CPU
讀取請主存中相應內存以前)寫回(write back
)主存。.net
當被寫回主存以後,該緩存行的狀態會變成獨享(exclusive
)狀態。線程
E: 獨享的(Exclusive)3d
該緩存行只被緩存在該CPU
的緩存中,它是未被修改過的(clean
),與主存中數據一致。該狀態能夠在任什麼時候刻當有其它CPU
讀取該內存時變成共享狀態(shared
)。code
一樣地,當CPU
修改該緩存行中內容時,該狀態能夠變成Modified
狀態。htm
S: 共享的(Shared)blog
該狀態意味着該緩存行可能被多個CPU
緩存,而且各個緩存中的數據與主存數據一致(clean
),當有一個CPU
修改該緩存行中,其它CPU
中該緩存行能夠被做廢(變成無效狀態(Invalid
))。
I: 無效的(Invalid)
該緩存是無效的(可能有其它CPU
修改了該緩存行)。
狀態之間的相互轉換關係也可使用下表進行表示。
在一個典型系統中,可能會有幾個緩存(在多核系統中,每一個核心都會有本身的緩存)共享主存總線,每一個相應的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
狀態的緩存不須要使用總線事務。