热门问题
时间线
聊天
视角
MESI協議
来自维基百科,自由的百科全书
Remove ads
MESI協議是一個基於失效的快取一致性協議,是支持寫回(write-back)快取的最常用協議。也稱作伊利諾伊協議 (Illinois protocol,因為是在伊利諾伊大學厄巴納-香檳分校被發明的[1])。與寫直達(write through)快取相比,回寫緩衝能節約大量帶寬。總是有「髒」(dirty)狀態表示快取中的數據與主存中不同。MESI協議要求在快取不命中(miss)且數據塊在另一個快取時,允許快取到快取的數據複製。與MSI協議相比,MESI協議減少了主存的事務數量。這極大改善了性能。[2]
狀態
快取行有4種不同的狀態:
- 已修改Modified (M)
- 快取行是髒的(dirty),與主存的值不同。如果別的CPU內核要讀主存這塊數據,該快取行必須回寫到主存,狀態變為共享(S).
- 獨占Exclusive (E)
- 快取行只在當前快取中,但是乾淨的(clean)--快取數據同於主存數據。當別的快取讀取它時,狀態變為共享;當前寫數據時,變為已修改狀態。
- 共享Shared (S)
- 快取行也存在於其它快取中且是乾淨的。快取行可以在任意時刻拋棄。
- 無效Invalid (I)
- 快取行是無效的
任意一對快取,對應快取行的相容關係:
當塊標記為 M (已修改), 在其他快取中的數據副本被標記為I(無效).
Remove ads
操作
有限狀態自動機的狀態轉換結束兩種場景:快取所在處理器的讀寫;其他處理器的讀寫。匯流排請求被匯流排窺探器監視。[4]
處理器對快取的請求:
- PrRd: 處理器請求讀一個快取塊
- PrWr: 處理器請求寫一個快取塊
匯流排對快取的請求:
- BusRd: 窺探器請求指出其他處理器請求讀一個快取塊
- BusRdX: 窺探器請求指出其他處理器請求寫一個該處理器不擁有的快取塊
- BusUpgr: 窺探器請求指出其他處理器請求寫一個該處理器擁有的快取塊
- Flush: 窺探器請求指出請求回寫整個快取到主存
- FlushOpt: 窺探器請求指出整個快取塊被發到匯流排以發送給另外一個處理器(快取到快取的複製)
解釋
圖1.1是MESI協議四種狀態的轉換圖。
寫操作僅在快取行是已修改或獨占狀態時可自由執行。如果在共享狀態,其他快取都要先把該快取行置為無效,這種廣播操作稱作Request For Ownership (RFO).
快取對已修改狀態的快取行,要監聽各處理器對其的讀請求並插入其數據到匯流排。
快取對共享狀態的快取行,要監聽使其無效或請求擁有的廣播,當匹配時把該快取行置為無效。
已修改狀態、獨占狀態是精確的,匹配於該快取行在系統中的實際情況。共享狀態可以是不精確的: 如果別的快取拋棄了該行,只有當前快取擁有該行,但其狀態沒有變為獨占。其他快取不需要廣播通知其拋棄操作。
獨占狀態是一個優化機會:處理器修改共享狀態的快取行必須要先發出一個匯流排事務使得其他快取中的該行失效;而獨占狀態下修改一行不需要匯流排事務。
MESI協議操作圖解[5]
假定下述讀/寫操作訪問同一主存位置的數據。操作流是 : R1, W1, R3, W3, R1, R3, R2. 最初所有快取為空。
Remove ads
參見
- MOSI協議
- MOESI協議
- MESIF協議
- MERSI協議
- Dragon協議
- 螢火蟲協議
參考文獻
外部連結
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads