【併發編程】基礎-CPU多級緩存

緩存一致性(MESI)

MESI是一種協議,用於保證多個CPU cache之間緩存共享數據的一致。緩存

MESI表示了緩存的4種狀態。3d

M:被修改。指該緩存行只被緩存在該cpu的緩存中而且是被修改過的,與主存中的數據不一致。該緩存行內容將在將來某個時間點寫回主存。cdn

E:獨享。M狀態被寫回主存後進入E狀態,其緩存行只被緩存在該cpu的緩存中,未被修改過,與主存中數據一致。這個狀態能夠在任什麼時候候當有其餘cpu讀取該緩存時進入共享狀態。當cpu修改緩存內容時會變成M狀態。blog

S:共享。意味着該緩存行被多個cpu進行緩存,而且各個緩存中的數據與主存中一致。當有一個cpu修改該緩存行時其餘cpu從該緩存行能夠被做廢,進入I狀態。事務

I:無效。表明該緩存無效,多是有其餘cpu修改了該緩存行。內存

除了4種狀態,引發狀態轉換的操做也有四種。

local read:讀本地緩存數據。rem

local write:將數據寫入本地緩存。it

remote read:將內存數據讀取過來。io

remote write:將數據寫回主存。class

狀態之間的相互轉換關係

在一個典型多核系統中每個核都會有本身緩存來共享主存總線,每個相應的cpu都會發出讀寫請求,緩存的目的是爲了減小cpu讀寫共享主存的次數。一個緩存除了在invalid狀態均可以知足cpu的讀請求。寫請求只有在緩存在M或E狀態才能被執行。

一個處於M狀態的緩存行必須時刻監聽全部試圖讀該緩存行相對用主存的操做,這種操做必須在緩存將該緩存行寫回到主存並將狀態變成S以前被延遲執行。

一個處於S狀態的緩存行也必須監聽其餘緩存使該緩存行無效或者獨享該緩存行的請求,並將緩存行變成無效。

一個處於E狀態的緩存行須要監聽其餘緩存讀緩存中該緩存行的操做,一旦有該緩存行的操做就須要變成S狀態。

所以對於M和E兩種狀態而言它們的數據老是精確的,它們和緩存行的真正狀態是一致的。而S多是非一致的,若是一個緩存將處於S狀態的緩存行做廢了,另外一個緩存可能已經獨享了該緩存行,可是該緩存卻不會將緩存行轉換成E狀態,由於其餘緩存不會廣播它們做廢該緩存行的通知。一樣,因爲緩存沒有保存該緩存行的copy數量,因此沒有辦法肯定本身是否已獨享了該緩存行。

若cpu要修改S狀態的緩存行,總線事務須要將全部該緩存行copy的值變成invalid才行,而修改E狀態則不須要總線事務。

Written by Autu.

2019.7.5

相關文章
相關標籤/搜索