CPU 一致性快取協議MESI

2021-10-07 02:08:38 字數 2531 閱讀 8174

計算機在執行指令的時候都是通過cpu進行逐條執行而在執行指令的過程中勢必涉及對資料的讀寫,而資料基本從磁碟載入到記憶體中cpu直接使用記憶體中的資料

由於cpu計算速度遠大於對記憶體的讀寫速度如果任何資料的讀寫都通過記憶體cpu的效率將會大打折扣,因此在cpu中引入暫存器作為快取記憶體提高系統效率例如

i = i + 1

當cpu執行該語句時首先將i從記憶體複製到cpu暫存器中(快取記憶體)然後將i加一最後將資料更新到主存中,如果此語句在單執行緒下執行沒有任何問題但是在多執行緒下會出現問題

因為多執行緒執行該語句每個執行緒執行在不同的cpu核心中此時每個核心都有i的副本,假設兩個執行緒執行該語句期待所有執行緒執行完i的值為2,如果沒有互斥機制保護i的情況下,兩個執行緒執行完

i的值還會出現為1的場景

為何解決這種問題在硬體層面上有兩種方式

在早期的cpu當中,是通過在匯流排上加lock#鎖的形式來解決快取不一致的問題。因為cpu和其他部件進行通訊都是通過匯流排來進行的,如果對匯流排加lock#鎖的話,也就是說阻塞了其他cpu對其他部件訪問(如記憶體),從而使得只能有乙個cpu能使用這個變數的記憶體。比如上面例子中 如果乙個執行緒在執行 i = i +1,如果在執行這段**的過程中,在匯流排上發出了lcok#鎖的訊號,那麼只有等待這段**完全執行完畢之後,其他cpu才能從變數i所在的記憶體讀取變數,然後進行相應的操作。這樣就解決了快取不一致的問題。

顯然通過匯流排鎖的方式之後只有乙個cpu核心可以訪問匯流排其他cpu核心都是處於等待狀態,因此cpu無法發揮多核心的優勢

所以就出現了快取一致性協議。最出名的就是intel 的mesi協議,mesi協議保證了每個快取中使用的共享變數的副本是一致的。它核心的思想是:當cpu寫資料時,如果發現操作的變數是共享變數,即在其他cpu中也存在該變數的副本,會發出訊號通知其他cpu將該變數的快取行置為無效狀態,因此當其他cpu需要讀取這個變數時,發現自己快取中快取該變數的快取行是無效的,那麼它就會從記憶體重新讀取。

mesi 協議中的狀態

cpu中每個快取行使用的4種狀態進行標記(使用兩位bit表示)

狀態 描述

s狀態是所有core的資料都是共享的,只有clean的資料才能被多個core共享

i表示這個cache line無效

在mesi協議中,每個cache的cache控制器不僅知道自己的讀寫操作,而且也監聽(snoop)其它cache的讀寫操作。每個cache line所處的狀態根據本核和其它核的讀寫操作在4個狀態間進行遷移

狀態觸發本地讀取

觸發本地寫入

觸發遠端讀取

觸發遠端寫入

m本地cache:m 觸發cache:m 其他cache:i

本地cache:m 觸發cache:m 其他cache:i

本地cache:m→e→s 觸發cache:i→s 其他cache:i→s 同步主記憶體後修改為e獨享,同步觸發、其他cache後本地、觸發、其他cache修改為s共享

本地cache:m→e→s→i 觸發cache:i→s→e→m 其他cache:i→s→i 同步和讀取一樣,同步完成後觸發cache改為m,本地、其他cache改為i

e本地cache:e 觸發cache:e 其他cache:i

本地cache:e→m 觸發cache:e→m 其他cache:i 本地cache變更為m,其他cache狀態應當是i(無效)

本地cache:e→s 觸發cache:i→s 其他cache:i→s 當其他cache要讀取該資料時,其他、觸發、本地cache都被設定為s(共享)

本地cache:e→s→i 觸發cache:i→s→e→m 其他cache:i→s→i 當觸發cache修改本地cache獨享資料時時,將本地、觸發、其他cache修改為s共享.然後觸發cache修改為獨享,其他、本地cache修改為i(無效),觸發cache再修改為m

s本地cache:s 觸發cache:s 其他cache:s

本地cache:s→e→m 觸發cache:s→e→m 其他cache:s→i 當本地cache修改時,將本地cache修改為e,其他cache修改為i,然後再將本地cache為m狀態

本地cache:s 觸發cache:s 其他cache:s

本地cache:s→i 觸發cache:s→e→m 其他cache:s→i 當觸發cache要修改本地共享資料時,觸發cache修改為e(獨享),本地、其他cache修改為i(無效),觸發cache再次修改為m(修改)

i本地cache:i→s或者i→e 觸發cache:i→s或者i →e 其他cache:e、m、i→s、i 本地、觸發cache將從i無效修改為s共享或者e獨享,其他cache將從e、m、i 變為s或者i

本地cache:i→s→e→m 觸發cache:i→s→e→m 其他cache:m、e、s→s→i

既然是本cache是i,其他cache操作與它無關

既然是本cache是i,其他cache操作與它無關

CPU快取一致性(MESI)協議

cpu在摩爾定律的指導下以每18個月翻一番的速度在發展,然而記憶體和硬碟的發展速度遠遠不及cpu。這就造成了高效能能的記憶體和硬碟 及其昂貴。然而cpu的高度運算需要高速的資料。為了解決這個問題,cpu廠商在cpu中內建了少量的快取記憶體以解決i o速度和cpu運算速度之間的不匹配問題。在cpu訪問...

CPU快取一致性協議 MESI詳解

mesi 也稱伊利諾斯協議 是一種廣泛使用的支援寫回策略的快取一致性協議,該協議被應用在intel奔騰系列的cpu中。mesi協議中的狀態 cpu中每個快取行使用的4種狀態進行標記 使用額外的兩位bit表示 狀態描述 m modified 這行資料有效,資料被修改了,和記憶體中的資料不一樣,資料只存...

快取一致性協議MESI

處理器上有一套完整的協議,來保證cache一致性。比較經典的cache一致性協議當屬mesi協議,奔騰處理器有使用它,很多其他的處理器都是使用它的變種。單核cache中每個cache line有2個標誌 dirty和valid標誌,它們很好的描述了cache和memory 記憶體 之間的資料關係 資...