1. 程式人生 > 其它 >【快取】MESI 快取一致性協議 Gif 動畫

【快取】MESI 快取一致性協議 Gif 動畫

快取一致性可以分為三個點:

  1. 在程序每個寫入運算時都立刻採取措施保證資料一致性
  2. 每個獨立的運算,假如它造成資料值的改變,所有程序都可以看到一致的改變結果
  3. 在每次運算之後,不同的程序可能會看到不同的值(這也就是沒有一致性的行為)

快取一致性協議有哪些:

快取一致性協議有MSI,MESI,MOSI,Synapse,Firefly及DragonProtocol等等

inter採用MESI協議。

注意程式設計中Valotile關鍵 的可見性是基於快取一致原則的,不是基於MESI協議的。

MESI(梅西)協議:

VivioJS 動畫旨在幫助您瞭解 MESI 快取一致性協議。

描述了一個多處理器系統,包括3個CPU,具有本地快取和主記憶體。為簡單起見,主儲存器包括4個位置a0,a1,a2和a3。快取是直接對映的,包含兩組。偶數地址(a0 和 a2)對映到設定 0,而奇數地址(a1 和 a3)對映到設定 1。

注意:為了簡化此動畫,快取行的大小和 CPU 讀/寫操作的大小是相同的。但是,在寫操作未命中時,CPU 會讀取記憶體,即使它將完全覆蓋快取行。這模擬了實際快取的行為,其中快取行的大小通常大於 CPU 讀/寫操作的大小。

每個 CPU 都包含一些按鈕,這些按鈕在指定的記憶體位置上啟動讀取或寫入事務。"CPU 寫入"將遞增值(最初為 1)寫入"記憶體"。

我們的想法是按下按鈕,看看是否可以遵循發生的操作和狀態轉換。可以通過按右上角的"無錯誤"按鈕將錯誤引入動畫中。看看你是否能確定錯誤是什麼!

地址和資料匯流排上的流量方向分別由藍色和紅色箭頭指示。事務中涉及的快取行和記憶體位置顯示為綠色。陳舊的記憶體位置顯示為灰色。

快取行可以處於以下 4 種狀態之一。無效:快取中不存在快取行。EXCLUSIVE:僅此快取中存在的快取行,並且與記憶體中的副本相同。已修改:僅此快取中存在快取行,並且記憶體副本已過期(過時)。SHARED:此快取中的快取行以及可能的其他快取,所有副本都與記憶體副本相同。對共享快取記憶體行的寫入是通過寫來寫的,而對EXCLUSIVE快取記憶體行的寫入是回寫。如果快取觀察它所包含的地址的匯流排事務,它將斷言 SHARED 匯流排行。MESI 是一種無效的快取一致性協議。下面是快取行的狀態轉換圖:

1 CPU0:讀取 a0 CPU0 從記憶體[非共享]讀取 a0 - 狀態 E

2 CPU0:讀取 a0 CPU0 從快取讀取 a0 - 狀態 E

3 CPU0: 寫入 a0 CPU0 僅在快取中更新 a0 - 狀態 M

4 CPU0: 寫入 a0 CPU0 僅在快取中更新 a0 - 狀態 M

5 CPU1: 讀取 a0 CPU1 讀取 a0,CPU0 快取記憶體干預並向快取記憶體和記憶體提供資料 - 狀態 S

6 CPU1: 寫入 a0 CPU1 更新快取和記憶體中的 a0,並使地址為 a0 - 狀態 E 的所有其他快取失效

7 CPU1: 寫入 a0 CPU1 僅在快取中更新 a0 - 狀態 M

8 CPU0: 寫入 a0 CPU0 讀取 a0,CPU1 快取干預並向快取和記憶體 (S) 提供資料,然後 CPU0 寫入快取和記憶體中的 a0,使地址為 a0 的所有其他快取失效 - 狀態

9 CPU0: 寫入 a2 CPU0 從記憶體 (E) 讀取 a2,然後寫入 a2 - 狀態 M

10 CPU0: 寫入 a0 CPU0 將 a2 重新整理到記憶體,從記憶體 (E) 讀取 a2,然後寫入 a0 - 狀態 M



下面是快取行的狀態轉換圖:

素材來源:https://www.scss.tcd.ie/Jeremy.Jones/VivioJS/caches/MESIHelp.htm










程式設計是個人愛好