多核心、一致性與執行緒層級平行

MESI 協定(MESI protocol)

/ MESS-ee /

為了讓所有影印本保持一致,每位編輯在自己的副本上潦草地貼一張小狀態貼紙:「這是唯一一份,而且我改過了」,或「這份和母本相符,但別人也有副本」,或「我曾有這份,但現在作廢了」。這些貼紙讓大家無需每次重查母本就能正確行動。MESI 正是這樣一套貼紙系統:每條快取列帶著四種狀態之一——Modified(已修改)、Exclusive(獨佔)、Shared(共享)、Invalid(無效)——而在狀態間移動的規則,就是讓快取保持一致的東西。

四種狀態,依其字首。Invalid(I,無效):這條列沒有有效資料;讀或寫都必須先提取。Shared(S,共享):這條列是一份與記憶體相符的乾淨副本,其他快取也可能以唯讀方式持有它。Exclusive(E,獨佔):這是唯一的快取副本且與記憶體相符——所以這個核心之後可以不告訴任何人就寫它,因為別人都沒有。Modified(M,已修改):這個核心寫過這條列,所以它的副本是唯一正確的,記憶體現在過時了;這個核心必須把資料供應給任何來要的其他核心,並在丟棄前先寫回。E 的巧妙在於:它讓一個載入了別人都不想要的列的核心,能升級成無匯流排流量的靜默寫入。MESI 在較簡單的 MSI 上加了 E;MOESI 再加一個 Owned(擁有)狀態,讓一條髒列無須先寫回記憶體就能被共享。

MESI 重要,是因為它在精神上就是真實多核心晶片為了有效率地實作一致性而跑的東西,無論透過監聽匯流排或目錄。這些狀態把流量最小化:一條只被某個核心讀或寫的私有列會待在 E 或 M,完全不產生一致性閒談;只有真正被共享又被寫入的列才引發失效。誠實的陷阱是:協定只看得到位址、看不到你的意圖——同一條列裡兩個不相干的變數,會隨著兩個核心「爭奪」它而讓那條列在 M 與 I 之間彈來彈去,這就是偽共享陷阱。

核心 A 讀取一條別人都沒有的列 L:L 在 A 進入 Exclusive。A 寫 L:它靜默地從 E 轉成 Modified,不需匯流排訊息。現在核心 B 讀取 L:A 必須供應它已修改的副本,兩者都安頓為 Shared。若 A 接著又寫 L,它廣播一次失效,B 落到 Invalid,而 A 的列回到 Modified。

Exclusive 狀態是 MESI 的勝著:只被一個核心碰過的列,在別人來共享之前完全不產生一致性流量。

MESI 以每條快取列、而非每個變數來追蹤狀態。因為它作用在整條列上,被打包進同一條列的兩個獨立變數在一致性上是被綁在一起的——這就是偽共享的成因,即使這兩個變數邏輯上毫不相干。

又稱
Illinois protocolMSI/MESI/MOESI familyMESI 一致性協定