CPU實用緩存知識
由于CPU是核心硬件,相信我們在選擇CPU的時候都會去關心CPU參數方面,而在CPU核心參數中,我們經常會看到緩存(Cache)這個參數,那么CPU緩存有什么用?下面就讓小編帶你去看看CPU實用緩存知識,希望能幫助到大家!
CPU緩存有什么用?科普一下關于CPU緩存的作用
CPU緩存是什么?
CPU緩存是CPU和內存之間的臨時存儲器,雖然緩存的容量不能與內存和硬盤相比,但是交換速度卻比它們快得多了,CPU緩存就是為了更快的連接CPU與內存而存儲在中間媒介。簡單來說,因為CPU的速度快,而內存的速度較慢,這時CPU緩存來解決這個問題,減少了CPU的等待時間,變相的提高了CPU的性能。
舉個例子,比如CPU需要做一個加法運算,需要-2個時鐘周期,如果從內存中讀取數據需要100-300個周期,而CPU是不可能等待那么長的時間,即使是高端CPU也變成龜速,因此通過高速緩存來減少了CPU等待時間。
在主流的CPU中,一般緩存分為一級緩存、二級緩存、三級緩存,而它們之間的速度呈遞減,容量呈遞增,讀取一級緩存中的信息需要3個周期,與CPU處理運算的速度無限接近了,讀取二級緩存的周期大約10-15個周期,而三級緩存所需時間為50個周期左右。
之所以CPU需要采用這種層級結構,主要就是是從成本、性能、容量還有面積上來平衡的,對于CPU緩存來說,下面幾點是它們提升的目前,也就所謂的CPU緩存的作用。
1、縮短延遲
訪問緩存的時間應該盡可能縮短,可以通過多種的方式縮短這個時間,比如能夠通過減小緩存的大小或關聯性來降低緩存的延遲,還有方式預測、增加帶寬等方法。
2、提升命中率
所謂的命中率是在高速緩存中找到內存引用的速率,我們希望能夠首先通過緩存中獲得信息,以得到速度優(yōu)勢,所以緩存需要最大限度地實現這一目標。對于單個高速緩存,大小、關聯性和塊大小決定命中率。
3、降低更低級別內存下的開銷
高速緩存是內存層次結構的一部分,其性能會影響其它性能,處理其它內存花費的時間越長,意味著系統(tǒng)性能越低,也就是說盡可能讓處理在緩存中完成。
4、減少錯失懲罰
緩存中不能命中是無法避免的事情,但是我們可以減少處理未命中所需的時間以獲得更好的處理器性能,通過提升命中率并通過應用不同的優(yōu)化,能夠降低錯失懲罰。
高速緩存是CPU中十分重要的部分,占據了大量的資源開銷和成本,如果您看過CPU架構圖的話,您就會發(fā)現緩存占據了至少50%的面積,絕對至關重要。
總結:
CPU緩存的作用說白了就是提高命中率、降低延遲、降低內存開銷、減少錯失懲罰等,對于一般用戶你只需了解CPU緩存能夠提升CPU的工作效率即可,緩存在cpu參數中的作用舉足輕重。
CPU緩存一致性協議
CPU在摩爾定律的指導下以每18個月翻一番的速度在發(fā)展,然而內存和硬盤的發(fā)展速度遠遠不及CPU。這就造成了高性能能的內存和硬盤價格及其昂貴。然而CPU的高度運算需要高速的數據。為了解決這個問題,CPU廠商在CPU中內置了少量的高速緩存以解決IO速度和CPU運算速度之間的不匹配問題。
在CPU訪問存儲設備時,無論是存取數據抑或存取指令,都趨于聚集在一片連續(xù)的區(qū)域中,這就被稱為局部性原理。
比如循環(huán)、遞歸、方法的反復調用等。
比如順序執(zhí)行的代碼、連續(xù)創(chuàng)建的兩個對象、數組等。
帶有高速緩存的CPU執(zhí)行計算的流程
程序以及數據被加載到主內存
指令和數據被加載到CPU的高速緩存
CPU執(zhí)行指令,把結果寫到高速緩存
高速緩存中的數據寫回主內存
目前流行的多級緩存結構
由于CPU的運算速度超越了1級緩存的數據IO能力,CPU廠商又引入了多級的緩存結構。
多級緩存結構
多核CPU多級緩存一致性協議MESI
多核CPU的情況下有多個一級緩存,如何保證緩存內部數據的一致,不讓系統(tǒng)數據混亂。這里就引出了一個一致性的協議MESI。
MESI(Modified E__clusive Shared Or Invalid)(也稱為伊利諾斯協議,是因為該協議由伊利諾斯州立大學提出)是一種廣泛使用的支持寫回策略的緩存一致性協議。
MESI協議中的狀態(tài)
CPU中每個緩存行(caceh line)使用4種狀態(tài)進行標記(使用額外的兩位(bit)表示):
M: 被修改(Modified)
該緩存行只被緩存在該CPU的緩存中,并且是被修改過的(dirty),即與主存中的數據不一致,該緩存行中的內存需要在未來的某個時間點(允許其它CPU讀取請主存中相應內存之前)寫回(write back)主存。
當被寫回主存之后,該緩存行的狀態(tài)會變成獨享(e__clusive)狀態(tài)。
E: 獨享的(E__clusive)
該緩存行只被緩存在該CPU的緩存中,它是未被修改過的(clean),與主存中數據一致。該狀態(tài)可以在任何時刻當有其它CPU讀取該內存時變成共享狀態(tài)(shared)。
同樣地,當CPU修改該緩存行中內容時,該狀態(tài)可以變成Modified狀態(tài)。
S: 共享的(Shared)
該狀態(tài)意味著該緩存行可能被多個CPU緩存,并且各個緩存中的數據與主存數據一致(clean),當有一個CPU修改該緩存行中,其它CPU中該緩存行可以被作廢(變成無效狀態(tài)(Invalid))。
I: 無效的(Invalid)
該緩存是無效的(可能有其它CPU修改了該緩存行)。
MESI狀態(tài)轉換圖
狀態(tài)之間的相互轉換關系也可以使用下表進行表示。
操作
在一個典型系統(tǒng)中,可能會有幾個緩存(在多核系統(tǒng)中,每個核心都會有自己的緩存)共享主存總線,每個相應的CPU會發(fā)出讀寫請求,而緩存的目的是為了減少CPU讀寫共享主存的次數。
一個緩存除在Invalid狀態(tài)外都可以滿足cpu的讀請求,一個Invalid的緩存行必須從主存中讀取(變成S或者 E狀態(tài))來滿足該CPU的讀請求。
一個寫請求只有在該緩存行是M或者E狀態(tài)時才能被執(zhí)行,如果緩存行處于S狀態(tài),必須先將其它緩存中該緩存行變成Invalid狀態(tài)(也既是不允許不同CPU同時修改同一緩存行,即使修改該緩存行中不同位置的數據也不允許)。該操作經常作用廣播的方式來完成,例如:RequestFor Ownership (RFO)。
緩存可以隨時將一個非M狀態(tài)的緩存行作廢,或者變成Invalid狀態(tài),而一個M狀態(tài)的緩存行必須先被寫回主存。
一個處于M狀態(tài)的緩存行必須時刻監(jiān)聽所有試圖讀該緩存行相對就主存的操作,這種操作必須在緩存將該緩存行寫回主存并將狀態(tài)變成S狀態(tài)之前被延遲執(zhí)行。
一個處于S狀態(tài)的緩存行也必須監(jiān)聽其它緩存使該緩存行無效或者獨享該緩存行的請求,并將該緩存行變成無效(Invalid)。
一個處于E狀態(tài)的緩存行也必須監(jiān)聽其它緩存讀主存中該緩存行的操作,一旦有這種操作,該緩存行需要變成S狀態(tài)。
對于M和E狀態(tài)而言總是精確的,他們在和該緩存行的真正狀態(tài)是一致的。而S狀態(tài)可能是非一致的,如果一個緩存將處于S狀態(tài)的緩存行作廢了,而另一個緩存實際上可能已經
獨享了該緩存行,但是該緩存卻不會將該緩存行升遷為E狀態(tài),這是因為其它緩存不會廣播他們作廢掉該緩存行的通知,同樣由于緩存并沒有保存該緩存行的copy的數量,因此(即使有這種通知)也沒有辦法確定自己是否已經獨享了該緩存行。
從上面的意義看來E狀態(tài)是一種投機性的優(yōu)化:如果一個CPU想修改一個處于S狀態(tài)的緩存行,總線事務需要將所有該緩存行的copy變成Invalid狀態(tài),而修改E狀態(tài)的緩存不需要使用總線事務。
從 CPU 緩存看緩存的套路
一、前言
不同存儲技術的訪問時間差異很大,從 計算機層次結構 可知,通常情況下,從高層往底層走,存儲設備變得更慢、更便宜同時體積也會更大,CPU 和內存之間的速度存在著巨大的差異,此時就會想到計算機科學界中一句著名的話:計算機科學的任何一個問題,都可以通過增加一個中間層來解決。
二、引入中間層——緩存層
為了解決速度不匹配問題,可以通過引入一個緩存中間層來解決問題,但是也會引入一些新的問題?,F代計算機系統(tǒng)中,從硬件到操作系統(tǒng)、再到一些應用程序,絕大部分的設計都用到了著名的局部性原理,局部性通常有如下兩種不同的形式:
時間局部性:在一個具有良好的時間局部性的程序當中,被引用過一次的內存位置,在將來一個不久的時間內很可能會被再次引用到。
空間局部性:在一個具有良好的空間局部性的程序當中,一個內存位置被引用了一次,那么在不久的時間內很可能會引用附近的位置。
有上面這個局部性原理為理論指導,為了解決二者速度不匹配問題就可以在 CPU 和內存之間加一個緩存層,于是就有了如下的結構:
三、緩存更新問題
在 CPU 中引入緩存中間層后,雖然可以解決和內存速度不一致的問題,但是同時也面臨著一個問題:當 CPU 更新了其緩存中的數據之后,要什么時候去寫入到內存中呢?,比較容易想到的一個解決方案就是,CPU 更新了緩存的數據之后就立即更新到內存中,也就是說當 CPU更新了緩存的數據之后就會從上到下更新,直到內存為止,英文稱之為write through,這種方式的優(yōu)點是比較簡單,但是缺點也很明顯,由于每次都需要訪問內存,所以速度會比較慢。還有一種方法就是,當 CPU 更新了緩存之后并不馬上更新到內存中去,在適當的時候再執(zhí)行寫入內存的操作,因為有很多的緩存只是存儲一些中間結果,沒必要每次都更新到內存中去,英文稱之為write back,這種方式的優(yōu)點是 CPU 執(zhí)行更新的效率比較高,缺點就是實現起來會比較復雜。
上面說的在適當的時候寫入內存,如果是單核 CPU 的話,可以在緩存要被新進入的數據取代時,才更新內存,但是在多核 CPU 的情況下就比較復雜了,由于 CPU 的運算速度超越了 1 級緩存的數據 I\O 能力,CPU 廠商又引入了多級的緩存結構,比如常見的 L1、L2、L3 三級緩存結構,L1 和 L2 為 CPU 核心獨有,L3 為 CPU 共享緩存。
如果現在分別有兩個線程運行在兩個不同的核 Core 1 和 Core 2 上,內存中 i 的值為 1,這兩個分別運行在兩個不同核上的線程要對 i進行加 1 操作,如果不加一些限制,兩個核心同時從內存中讀取 i 的值,然后進行加 1 操作后再分別寫入內存中,可能會出現相互覆蓋的情況,解決的方法相信大家都能想得到,第一種是只要有一個核心修改了緩存的數據之后,就立即把內存和其它核心更新。第二種是當一個核心修改了緩存的數據之后,就把其它同樣復制了該數據的 CPU 核心失效掉這些數據,等到合適的時機再更新,通常是下一次讀取該緩存的時候發(fā)現已經無效,才從內存中加載最新的值。
四、緩存一致性協議
不難看出第一種需要頻繁訪問內存更新數據,執(zhí)行效率比較低,而第二種會把更新數據推遲到最后一刻才會更新,讀取內存,效率高(類似于懶加載)。 緩存一致性協議(MESI) 就是使用第二種方案,該協議主要是保證緩存內部數據的一致,不讓系統(tǒng)數據混亂。MESI 是指 4 種狀態(tài)的首字母。每個緩存存儲數據單元(Cache line)有 4 種不同的狀態(tài),用 2 個 bit 表示,狀態(tài)和對應的描述如下:
單核讀取步驟:Core 0 發(fā)出一條從內存中讀取 a 的指令,從內存通過 BUS 讀取 a 到 Core 0 的緩存中,因為此時數據只在 Core 0 的緩存中,所以將 Cache line 修改為 E 狀態(tài)(獨享),該過程用示意圖表示如下:
雙核讀取步驟:首先 Core 0 發(fā)出一條從內存中讀取 a 的指令,從內存通過 BUS 讀取 a 到 Core 0 的緩存中,然后將 Cache line 置為 E狀態(tài),此時 Core 1 發(fā)出一條指令,也是要從內存中讀取 a,當 Core 1 試圖從內存讀取 a 的時候, Core 0 檢測到了發(fā)生地址沖突(其它緩存讀主存中該緩存行的操作),然后 Core 0 對相關數據做出響應,a 存儲于這兩個核心 Core 0 和 Core 1 的緩存行中,然后設置其狀態(tài)為 S 狀態(tài)(共享),該過程示意圖如下:
假設此時 Core 0 核心需要對 a 進行修改了,首先 Core 0 會將其緩存的 a 設置為 M(修改)狀態(tài),然后通知其它緩存了 a 的其它核 CPU(比如這里的 Core 1)將內部緩存的 a 的狀態(tài)置為 I(無效)狀態(tài),最后才對 a 進行賦值操作。該過程如下所示:
細心的朋友們可能已經注意到了,上圖中內存中 a 的值(值為 1)并不等于 Core 0 核心中緩存的最新值(值為 2),那么要什么時候才會把該值更新到內存中去呢?就是當 Core 1 需要讀取 a 的值的時候,此時會通知 Core 0 將 a 的修改后的最新值同步到內存(Memory)中去,在這個同步的過程中 Core 0 中緩存的 a 的狀態(tài)會置為 E(獨享)狀態(tài),同步完成后將 Core 0 和 Core 1 中緩存的 a 置為 S(共享)狀態(tài),示意圖描述該過程如下所示:
至此,變量 a 在 CPU 的兩個核 Core 0 和 Core 1 中回到了 S(共享)狀態(tài)了,以上只是簡單的描述了一下大概的過程,實際上這些都是在 CPU 的硬件層面上去保證的,而且操作比較復雜。
五、總結
現在很多一些實現緩存功能的應用程序都是基于這些思想設計的,緩存把數據庫中的數據進行緩存到速度更快的內存中,可以加快我們應用程序的響應速度,比如我們使用常見的 Redis 數據庫可能是采用下面這些策略:① 首先應用程序從緩存中查詢數據,如果有就直接使用該數據進行相應操作后返回,如果沒有則查詢數據庫,更新緩存并且返回。② 當我們需要更新數據時,先更新數據庫,然后再讓緩存失效,這樣下次就會先查詢數據庫再回填到緩存中去,可以發(fā)現,實際上底層的一些思想都是相通的,不同的只是對于特定的場景可能需要增加一些額外的約束?;A知識才是技術這顆大樹的根,我們先把根栽好了,剩下的那些枝和葉都是比較容易得到的東西了。
CPU實用緩存知識相關文章:
★ CPU的基礎知識
CPU實用緩存知識
上一篇:CPU緩存作用知識科普
下一篇:CPU選購實用知識大全