CPU處理器緩存一致性協議MESI詳解
緩存一致性的由來
爲解決CPU與內存之間速率不匹配的問題,現代計算機系統中引入了緩存(Cache)用於提高性能。最初的處理器都是單核心,Cache需要解決的問題主要是Cache中的數據與內存中的數據是否一致。
以圖1爲例,當Cache中緩存的數據與對應的內存行中的數據一致時,認爲當前Cache行爲Clean;當Cache中緩存的數據與對應的內存行數據不一致,則認爲當前Cache行爲Dirty。
Dirty和Clean兩種狀態足夠表示單核系統中Cache的狀態問題,而當處理器發展到多核心的時候,每個CPU核心都有了自己對應的Cache,內存中的同一行數據可能會被多塊Cache緩存,並且處於不同的狀態,這個時候簡單的Dirty和Clean並不足夠處理出現的一致性問題,於是引入了MESI一致性協議。
MESI協議簡介
MESI協議將Cache中的數據分爲4種狀態:
- Modified :代表當前Cache行的數據是修改過的(Dirty),並且只在當前CPU的Cache中是修改過的;此時該Cache行的數據與其他Cache中的數據不同,與內存中該行的數據也不同。
- Exclusive:代表當前Cache行的數據是有效數據,其他CPU的Cache中沒有這行數據;並且當前Cache行數據與內存中的數據相同。
- Shared:代表多個CPU的Cache中均緩存有這行數據,並且Cache中的數據與內存中的數據一致;
- Invalid:表示當前Cache行中的數據無效;
Exclusive狀態
圖中Core 0對應的Cache中有(x=3)並且與內存中x值一致,而此時Core1和Core2中沒有緩存這條數據。此時Core 0對應的Cache行處於Exclusive狀態。
Shared狀態
圖中Core0/1/2中均有(x=3),並且內存中x的值也是一致的,此時Core 0/1/2對應的Cache行都是處於Shared狀態。
Modified和Invalid狀態
圖中Core 0擁有最新的x值(x=5), 並且Core 1/2和內存中均爲無效的x值(x=3)。此時認爲Core 0的Cache行爲Modified狀態,而Core 1/2的Cache行爲Invalid狀態。
MESI狀態切換
MESI協議中的狀態轉換如圖所示,每個Cache控制器根據自己Core的讀寫操作以及其他Core的讀寫操作來決定如何進行狀態跳轉。這裏Local Read/Write指的是Cache對應的Core對當前數據做出的讀寫操作,Remote Read/Write指其他Core對當前數據做出的讀寫操作。下面將分析每個狀態的跳轉情況。
Modified狀態跳轉
- Local Read :從當前Cache取數據,狀態不變,還是M。
- Local Write :向當前Cache寫數據,狀態不變,還是M。
- Remote Read :先將這條數據寫入內存,讓其他Core能夠拿到最新數據,狀態變爲S。
- Remote Write :先將這條數據寫入內存,之後其他Core會修改這條數據,狀態變爲I。
Exclusive狀態跳轉
- Local Read :從當前Cache取數據,狀態不變,還是E。
- Local Write :向當前Cache寫數據,狀態變爲M。
- Remote Read :其他Core會從內存讀取這條數據,變成共享狀態,狀態變爲S。
- Remote Write :數據倍修改,當前Cache行數據無效,狀態變爲I。
Shared狀態跳轉
- Local Read :從當前Cache取數據,狀態不變,還是S。
- Local Write :向當前Cache寫數據,狀態變成M,其他Cache中該行數據無效,變成I。
- Remote Read :對當前Cache無影響,狀態還是S。
- Remote Write :數據被修改,當前行數據無效,狀態變爲I。
Invalid狀態跳轉
- Local Read :如果其他Cache沒有緩存這條數據,需要從內存中讀取該數據,讀取之後狀態變成E;
如果其他Cache有這條數據,且狀態爲M,則先將數據更新到內存,當前Cache再到內存中取數據,之後這兩個Cache的相應行數據相同,都變成S;
如果其他Cache有這條數據,且狀態爲S或E,當前Cache從內存中取這條數據,這些Cache相應行數據相同,都變成S; - Local Write :從內存中讀取數據,在Cache中修改,狀態變成M;
如果其他Cache有這條數據,且狀態爲M,則要先將數據更新到內存;
如果其他Cache有這條數據,則這些Cache行變成I。 - Remote Read :對當前Cache無影響,狀態還是I。
- Remote Write :對當前Cache無影響,狀態還是I。