1.為什么要有緩存?
隨着現代半導體工藝的發展,CPU的頻率越來越快,相對內存快了一個數量級,對於訪存的操作CPU就需要等待主存,這樣會導致資源的白白浪費。所以cache的出現為了解決CPU與內存速度不匹配的問題。(cpu ->cache->memory)
cache的思想在我們日常的生活隨處可見,我們周圍的超市就是很好的例子。工廠把我們日常用品部分在超市,減少了我們去工廠購買的時間開銷,方便了我們的生活。
2.CPU緩存有什么意義?
時間局部性:如果某個數據被訪問,它在將來的某個時間也有可能在被訪問。
空間局部性:如果某個數據被訪問,那么它相鄰的數據也有可能被訪問。
3.CPU讀取數據的過程
cache中保存着cpu剛用過的數據或者是循環使用的數據,這時,從cache中讀取數據就會很快,減少了cpu等待的時間,提高了系統的性能
4.cache 緩存帶來的問題
導致數據不一致的問題,對於多核系統來說。
5.如何解決緩存帶來的問題,比較常見的緩存一致性(MESI),當然也有鎖住總線。
我們來介紹一下緩存一致性:
在MESI協議中,每個cache line有4個狀態,可用2個bit表示,它們分別是:
狀態 | 描述 |
---|---|
M(Modified) | 這行數據有效,數據被修改了,和內存中的數據不一致,數據只存在於本Cache中。 |
E(Exclusive) | 這行數據有效,數據和內存中的數據一致,數據只存在於本Cache中。 |
S(Shared) | 這行數據有效,數據和內存中的數據一致,數據存在於很多Cache中。 |
I(Invalid) | 這行數據無效 |
MESI為了保證多個CPU緩存中共享數據的一致性,定義了cache line的四種狀態,而CPU對cache line的四種操作可能會產生不一致的狀態,因此緩存控制器監聽到本地操作和遠程操作的時候,需要對地址一致的cache line 狀態進行一致性修改,從而保證數據在多個緩存之間保持一致性(M:modified E:Exclusive S:shared I:invalid) 。
3個Core都訪問變量x,它們對應的Cache line為S(Shared)狀態
下面是MESI四種狀態的轉換:
通過local read(內核讀取本地緩存中的值),local write(本地內核寫本地緩存中的值),remote read(其它內核讀取其他緩存中的值),remote write(其它內核更改其他緩存中的值)。通過這四種操作來改變cache line 的狀態。
在一個典型系統中,可能會有幾個緩存(在多核系統中,每個核心多會有自己的緩存),共享主存總線,每個相應的CPU都會發出相應的讀寫請求,而緩存的目的減少CPU的讀寫共享主存的次數。
緩存行除了在Invalid狀態都可以滿足CPU讀的狀態,一個Invalid的緩存行必須從主存中讀取來滿足CPU的讀請求。 一個寫請求只有在該緩存行是M或者E狀態時才能被執行,如果緩存行處於S狀態,必須先將其它緩存中該緩存行變成Invalid狀態(也既是不允許不同CPU同時修改同一緩存行,即使修改該緩存行中不同位置的數據也不允許)。該操作經常作用廣播的方式來完成,例如:Request For Ownership (RFO)
緩存可以隨時將一個非M狀態的緩存行作廢,或者變成Invalid狀態,而一個M狀態的緩存行必須先被寫回主存。
一個處於M狀態的緩存行必須時刻監聽所有試圖讀該緩存行相對就主存的操作,這種操作必須在緩存將該緩存行寫回主存並將狀態變成S狀態之前被延遲執行。
一個處於S狀態的緩存行也必須監聽其它緩存使該緩存行無效或者獨享該緩存行的請求,並將該緩存行變成無效(Invalid)。
一個處於E狀態的緩存行也必須監聽其它緩存讀主存中該緩存行的操作,一旦有這種操作,該緩存行需要變成S狀態。
對於M和E狀態而言總是精確的,他們在和該緩存行的真正狀態是一致的。而S狀態可能是非一致的,如果一個緩存將處於S狀態的緩存行作廢了,而另一個緩存實際上可能已經獨享了該緩存行,但是該緩存卻不會將該緩存行升遷為E狀態,這是因為其它緩存不會廣播他們作廢掉該緩存行的通知,同樣由於緩存並沒有保存該緩存行的copy的數量,因此(即使有這種通知)也沒有辦法確定自己是否已經獨享了該緩存行。
從上面的意義看來E狀態是一種投機性的優化:如果一個CPU想修改一個處於S狀態的緩存行,總線事務需要將所有該緩存行的copy變成invalid狀態,而修改E狀態的緩存不需要使用總線事務
對於MESI狀態的轉換用表哥形式記錄下來: