存儲器 - 緩存一致性 MESI 協議:如何讓多核CPU的高速緩存保持一致


存儲器 - 緩存一致性 MESI 協議:如何讓多核CPU的高速緩存保持一致

計算機組成原理目錄:https://www.cnblogs.com/binarylei/p/12585607.html

在上一篇 存儲器 - 高速緩存(CPU Cache):為什么要使用高速緩存 中,我們分析了高速緩存(CPU Cache) 的數據結構,及如何進行讀寫操作。在寫操作時,可以通過使用寫回策略替換直接寫策略,將數據先寫到 CPU Cache 中,從而提高吞吐率。但始終還遺留了一個問題,那就是多核 CPU 如何保證 Cache 的一致性?

1. 緩存一致性

1.1 問題根源

  • CPU Cache:解決的是內存訪問速度和 CPU 的速度差距太大的問題。
  • 多核 CPU:在主頻難以提升的時候,通過增加 CPU 個數來提升 CPU 的吞吐率的辦法。

我們把多核和 CPU Cache 兩者一結合,就給我們帶來了一個新的挑戰。因為 CPU 的每個核各有各的緩存,互相之間的操作又是各自獨立的,就會帶來緩存一致性(Cache Coherence) 的問題。

圖1:高速緩存結構

如上圖所示 CPU Cache 中,L1 和 L2 Cache 都是 CPU 獨有的,而 L3 和 DRAM 則是共有的。如果 CPU-1 更新了自己的 L1 或 L2 Cache 沒有更新主存,或者 CPU-1 寫的同時 CPU-2 並發讀,則會造成 CPU-1 和 CPU-2 的數據不一致。無論是直接寫還是寫回策略都沒有解決這個問題。

1.2 解決方案

為了解決這個緩存不一致的問題,我們就需要有一種機制,來同步兩個不同 CPU 的緩存數據。那這樣的機制需要滿足什么條件呢?我覺得能夠做到下面兩點就是合理的。

  • 寫傳播(Write Propagation):在一個 CPU 核心里,我們的 Cache 數據更新,必須能夠傳播到其他的對應節點的 Cache Line 里。

  • 事務的串行化(Transaction Serialization):在一個 CPU 核心里面的讀取和寫入,在其他的節點看起來,順序是一樣的。

    事務的串行化比較難理解,舉個例子。有 CPU-1~4 四個 CPU,CPU-1 將數據 i 修改成 5000,而 CPU-2 將數據 i 修改成 6000,它們都將修改的操作廣播給其余兩個 CPU。CPU-3 可能先收到 CPU-1 的廣播,將 i 修改成 5000,而接着又收到 CPU-2 的廣播,將 i 修改成 6000,而 CPU-4 恰好相反,先修改成 6000 再修改成 5000。這樣就造成這兩個 CPU 數據的不一致,也就是沒做到事務的串行化。

2. 總線嗅探機制和 MESI 協議

要解決緩存一致性問題,首先要解決的是多個 CPU 之間的數據傳播問題。

  • 總線嗅探(Bus Snooping):最常見的一種解決多核 CPU 數據廣播問題的方案。本質上就是把所有的讀寫請求都通過總線(Bus) 廣播給所有的 CPU 核心,然后讓各個核心去“嗅探”這些請求,再根據本地的情況進行響應。
  • MESI 協議:基於總線嗅探機制的緩存一致性協議,MESI 協議也是在 Pentium 時代被引入到 Intel CPU。

2.1 寫傳播 vs 寫失效

  • 寫失效(Write Invalidate) 協議:在寫失效協議里,在這個 CPU 寫入 Cache 后,它會去廣播一個“失效”請求給其他所有 CPU。其他 CPU 如果也存在這個緩存行,直接標記成失效的就好了。MESI 協議使用的就是寫失效協議。
  • 寫傳播(Write Invalidate) 協議:會將數據廣播給其他 CPU,相對於寫失效請求,占用更多的帶寬。

2.2 MESI 協議

MESI 協議的由來呢,來自於我們對 Cache Line 的四個不同的標記,分別是:

  • M:代表已修改(Modified),表示數據修改后未同步到主存的臟數據。
  • E:代表獨占(Exclusive),獨占模式下,可以對應數據任意修改,不需要廣播給其它 CPU。
  • S:代表共享(Shared),當有兩個 CPU 讀取數據時,緩存行的狀態從獨占變成共享。此時修改數據時,需要廣播給其他 CPU。
  • I:代表已失效(Invalidated),表示數據已經失效,需要重新從主存中讀取數據。
圖2:MESI 協議狀態變化

參考:

  • 《大話計算機》 6.9 章節:比較詳細地講解了多核 CPU 的訪問存儲數據的一致性問題。

每天用心記錄一點點。內容也許不重要,但習慣很重要!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM