天天看點

硬體層緩存一緻性協定硬體層緩存一緻性

硬體層緩存一緻性

一、緩存行

在講緩存一緻性之前,我們先來說一下緩存行的概念

緩存是分段(line)的,一個段對應一塊存儲空間,稱為緩存行,它是CPU緩存中可配置設定的最小存儲單元,大小為32、64、128位元組不等,與CPU的架構有關,通常為64位元組。當CPU看到一條讀取記憶體的指令時,它會把記憶體位址傳遞給一級資料緩存,一級資料緩存會檢查它是否有這個記憶體位址對應的緩存段,如果沒有就把整個緩存段從記憶體(或高一級的緩存)中加載進來。

二、什麼是緩存一緻性

緩存一緻性(cache coherence)是一種保證存儲在多個緩存中的共享資源資料相同的機制。緩存不一緻,是指相同資料在不同的緩存中呈現出不同的表現。

緩存不一緻的問題,在多核CPU的系統中,比較容易出現。假設主存有一個x,值為5。核0和核3都從主存中加載x到緩存。此時核0更改x的值為8。此時核3的緩存中的x的值還是5,資料出現了不一緻。

硬體層緩存一緻性協定硬體層緩存一緻性

二、如何保證緩存一緻性

緩存一緻性的協定有多種,嗅探(snooping)協定比較常用,它的基本思想是:所有的記憶體傳輸都發生在一條共享的總線上,所有的處理器都能看到這條總線。緩存本身是獨立的,但是記憶體是共享資源,所有的記憶體通路都要經過仲裁(同一個指令周期中,隻有一個CPU緩存可以讀寫記憶體)。

CPU緩存不僅僅在做記憶體傳輸時才和總線打交道,而是不停在嗅探總線上發生的資料交換,跟蹤其他緩存在做什麼。當一個緩存行代表它的處理器去讀寫記憶體時,其他處理器都會得到通知,它們以此來使自己的緩存保持同步。隻要某個處理器一寫記憶體,其他處理器馬上知道這塊記憶體在它們的緩存中已失效。

1、MESI協定

MESI協定是目前最主流的緩存一緻性協定,在MESI協定中,每個緩存行有4個狀态,可用2個bit表示,它們分别是:

狀态 描述
M(Modified) 這行資料有效,資料被修改了,和記憶體中的資料不一緻,資料隻存在本cache中
E(Exclusive) 這行資料有效,資料和記憶體中的資料一緻,資料隻存在于本cache中
S(Shared) 這行資料有效,資料和記憶體中的資料一緻,資料存在于多個cache中
I(Invalid) 這行資料無效

隻有當緩存行處于E或M狀态,處理器才能去寫它,也就是說隻有在這兩種狀态下,處理器是獨占這個緩存行的。

當處理器想要寫某個緩存行時,如果它沒有獨占權,必須發送一條“我要獨占權”的請求給總線,這會通知其他處理器把它們擁有的同一緩存行的拷貝失效。隻有在獲得獨占權之後,處理器才能開始修改資料。并且此時這個處理器知道,這個緩存行隻有一份拷貝,在我自己的緩存裡,是以不會有沖突

反之,如果其他處理器想要讀取這個緩存行(馬上就能知道,因為一直在嗅探總線),獨占或者修改狀态的緩存行必須先回到共享狀态。如果是已修改的緩存行,那麼還要先把内容寫回到記憶體中。

看懂了下圖,就看懂了MESI協定

硬體層緩存一緻性協定硬體層緩存一緻性

參考資料

  • https://blog.csdn.net/qq_26222859/article/details/52235930
  • https://en.wikipedia.org/wiki/MESI_protocol
  • https://en.wikipedia.org/wiki/Cache_coherence#Coherence_mechanisms

繼續閱讀