CPU處理器一致性協議MESI詳解

緩存一致性的由來

爲解決CPU與內存之間速率不匹配的問題,現代計算機系統中引入了緩存(Cache)用於提高性能。最初的處理器都是單核心,Cache需要解決的問題主要是Cache中的數據與內存中的數據是否一致。
以圖1爲例,當Cache中緩存的數據與對應的內存行中的數據一致時,認爲當前Cache行爲Clean;當Cache中緩存的數據與對應的內存行數據不一致,則認爲當前Cache行爲Dirty。
圖1 Cache行的兩種狀態
Dirty和Clean兩種狀態足夠表示單核系統中Cache的狀態問題,而當處理器發展到多核心的時候,每個CPU核心都有了自己對應的Cache,內存中的同一行數據可能會被多塊Cache緩存,並且處於不同的狀態,這個時候簡單的Dirty和Clean並不足夠處理出現的一致性問題,於是引入了MESI一致性協議。

MESI協議簡介

MESI協議將Cache中的數據分爲4種狀態:

  1. Modified :代表當前Cache行的數據是修改過的(Dirty),並且只在當前CPU的Cache中是修改過的;此時該Cache行的數據與其他Cache中的數據不同,與內存中該行的數據也不同。
  2. Exclusive:代表當前Cache行的數據是有效數據,其他CPU的Cache中沒有這行數據;並且當前Cache行數據與內存中的數據相同。
  3. Shared:代表多個CPU的Cache中均緩存有這行數據,並且Cache中的數據與內存中的數據一致;
  4. Invalid:表示當前Cache行中的數據無效;

Exclusive狀態

圖中Core 0對應的Cache中有(x=3)並且與內存中x值一致,而此時Core1和Core2中沒有緩存這條數據。此時Core 0對應的Cache行處於Exclusive狀態。
Exclusive狀態

Shared狀態

圖中Core0/1/2中均有(x=3),並且內存中x的值也是一致的,此時Core 0/1/2對應的Cache行都是處於Shared狀態。
Shared狀態

Modified和Invalid狀態

圖中Core 0擁有最新的x值(x=5), 並且Core 1/2和內存中均爲無效的x值(x=3)。此時認爲Core 0的Cache行爲Modified狀態,而Core 1/2的Cache行爲Invalid狀態。

Modified和Invalid狀態

MESI狀態切換

MESI協議中的狀態轉換如圖所示,每個Cache控制器根據自己Core的讀寫操作以及其他Core的讀寫操作來決定如何進行狀態跳轉。這裏Local Read/Write指的是Cache對應的Core對當前數據做出的讀寫操作,Remote Read/Write指其他Core對當前數據做出的讀寫操作。下面將分析每個狀態的跳轉情況。
MESI狀態跳轉圖

Modified狀態跳轉

  1. Local Read :從當前Cache取數據,狀態不變,還是M
  2. Local Write :向當前Cache寫數據,狀態不變,還是M
  3. Remote Read :先將這條數據寫入內存,讓其他Core能夠拿到最新數據,狀態變爲S
  4. Remote Write :先將這條數據寫入內存,之後其他Core會修改這條數據,狀態變爲I

Exclusive狀態跳轉

  1. Local Read :從當前Cache取數據,狀態不變,還是E
  2. Local Write :向當前Cache寫數據,狀態變爲M
  3. Remote Read :其他Core會從內存讀取這條數據,變成共享狀態,狀態變爲S
  4. Remote Write :數據倍修改,當前Cache行數據無效,狀態變爲I

Shared狀態跳轉

  1. Local Read :從當前Cache取數據,狀態不變,還是S
  2. Local Write :向當前Cache寫數據,狀態變成M,其他Cache中該行數據無效,變成I
  3. Remote Read :對當前Cache無影響,狀態還是S
  4. Remote Write :數據被修改,當前行數據無效,狀態變爲I

Invalid狀態跳轉

  1. Local Read :如果其他Cache沒有緩存這條數據,需要從內存中讀取該數據,讀取之後狀態變成E
    如果其他Cache有這條數據,且狀態爲M,則先將數據更新到內存,當前Cache再到內存中取數據,之後這兩個Cache的相應行數據相同,都變成S;
    如果其他Cache有這條數據,且狀態爲S或E,當前Cache從內存中取這條數據,這些Cache相應行數據相同,都變成S;
  2. Local Write :從內存中讀取數據,在Cache中修改,狀態變成M
    如果其他Cache有這條數據,且狀態爲M,則要先將數據更新到內存;
    如果其他Cache有這條數據,則這些Cache行變成I
  3. Remote Read :對當前Cache無影響,狀態還是I
  4. Remote Write :對當前Cache無影響,狀態還是I
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章