CPU緩存用處意義解釋
簡(jiǎn)而言之,因?yàn)閮?nèi)存太慢了,實(shí)際上內(nèi)存之所以誕生也是基于類似的原因。理論上來(lái)說(shuō),一臺(tái)計(jì)算機(jī)只需要外部存儲(chǔ)器就能運(yùn)行,但是這樣速度太慢,尤其是早期使用的紙帶、磁帶,完全跟不上處理器的運(yùn)算速度。下面就讓小編帶你去看看CPU緩存用處意義解釋,希望能幫助到大家!
CPU緩存有什么用?Intel官方答案來(lái)了
更詳細(xì)來(lái)講,在計(jì)算機(jī)系統(tǒng)中,CPU高速緩存在金字塔式存儲(chǔ)體系中它位于自頂向下的第二層,僅次于CPU寄存器。其容量遠(yuǎn)小于內(nèi)存,但速度卻可以接近處理器的頻率,比內(nèi)存快得多。
緩存的出現(xiàn)主要是為了解決CPU運(yùn)算速度與內(nèi)存讀寫速度不匹配的矛盾,因?yàn)镃PU運(yùn)算速度要比內(nèi)存讀寫速度快很多,這樣會(huì)使CPU花費(fèi)很長(zhǎng)時(shí)間等待數(shù)據(jù)到來(lái)或把數(shù)據(jù)寫入內(nèi)存。
按照數(shù)據(jù)讀取順序和與CPU結(jié)合的緊密程度,CPU緩存可以分為一級(jí)緩存,二級(jí)緩存,部分高端CPU還具有三級(jí)緩存。
今年下半年,Intel將推出10nm+ Tiger Lake,還是針對(duì)輕薄本,CPU架構(gòu)升級(jí)為Willow Cove,IPC相比于Skylake提升25%,換算一下對(duì)比Sunny Cove只提升大約6%。
下一代桌面級(jí)的Rocket Lake據(jù)說(shuō)也會(huì)是同樣的架構(gòu),只不過(guò)工藝延續(xù)14nm。
再往后的新架構(gòu)是Golden Cove,將應(yīng)用于10nm++ Alder Lake,IPC相比于Skylake提升50%,相比于Willow Cove則提升大約20%。
傳聞稱,Alder Lake將會(huì)采用大小核配置,8+8的規(guī)格可媲美AMD 16核心32線程的銳龍9 3950__,不過(guò)到那個(gè)時(shí)候,Zen 4都快出來(lái)了。
Intel官方公布的架構(gòu)路線圖到此為止,而根據(jù)傳聞,Golden Cove的繼任者代號(hào)為“Ocean Cove”,IPC性能相比于Skylake提升幅度達(dá)80%,不過(guò)對(duì)比它之前的Golden Cove提升幅度還是20%。
CPU 緩存是什么?
不同存儲(chǔ)技術(shù)的訪問(wèn)時(shí)間差異很大,從 計(jì)算機(jī)層次結(jié)構(gòu) 可知,通常情況下,從高層往底層走,存儲(chǔ)設(shè)備變得更慢、更便宜同時(shí)體積也會(huì)更大,CPU 和內(nèi)存之間的速度存在著巨大的差異,此時(shí)就會(huì)想到計(jì)算機(jī)科學(xué)界中一句著名的話:計(jì)算機(jī)科學(xué)的任何一個(gè)問(wèn)題,都可以通過(guò)增加一個(gè)中間層來(lái)解決。
二.引入緩存層為了解決速度不匹配問(wèn)題,可以通過(guò)引入一個(gè)緩存中間層來(lái)解決問(wèn)題,但是也會(huì)引入一些新的問(wèn)題?,F(xiàn)代計(jì)算機(jī)系統(tǒng)中,從硬件到操作系統(tǒng)、再到一些應(yīng)用程序,絕大部分的設(shè)計(jì)都用到了著名的局部性原理,局部性通常有如下兩種不同的形式:
時(shí)間局部性:在一個(gè)具有良好的時(shí)間局部性的程序當(dāng)中,被引用過(guò)一次的內(nèi)存位置,在將來(lái)一個(gè)不久的時(shí)間內(nèi)很可能會(huì)被再次引用到。
空間局部性:在一個(gè)具有良好的空間局部性的程序當(dāng)中,一個(gè)內(nèi)存位置被引用了一次,那么在不久的時(shí)間內(nèi)很可能會(huì)引用附近的位置。
有上面這個(gè)局部性原理為理論指導(dǎo),為了解決二者速度不匹配問(wèn)題就可以在 CPU 和內(nèi)存之間加一個(gè)緩存層,于是就有了如下的結(jié)構(gòu):
三.何時(shí)更新緩存在 CPU 中引入緩存中間層后,雖然可以解決和內(nèi)存速度不一致的問(wèn)題,但是同時(shí)也面臨著一個(gè)問(wèn)題:當(dāng) CPU 更新了其緩存中的數(shù)據(jù)之后,要什么時(shí)候去寫入到內(nèi)存中呢?比較容易想到的一個(gè)解決方案就是,CPU 更新了緩存的數(shù)據(jù)之后就立即更新到內(nèi)存中,也就是說(shuō)當(dāng) CPU 更新了緩存的數(shù)據(jù)之后就會(huì)從上到下更新,直到內(nèi)存為止,英文稱之為write through,這種方式的優(yōu)點(diǎn)是比較簡(jiǎn)單,但是缺點(diǎn)也很明顯,由于每次都需要訪問(wèn)內(nèi)存,所以速度會(huì)比較慢。還有一種方法就是,當(dāng) CPU 更新了緩存之后并不馬上更新到內(nèi)存中去,在適當(dāng)?shù)臅r(shí)候再執(zhí)行寫入內(nèi)存的操作,因?yàn)橛泻芏嗟木彺嬷皇谴鎯?chǔ)一些中間結(jié)果,沒(méi)必要每次都更新到內(nèi)存中去,英文稱之為write back,這種方式的優(yōu)點(diǎn)是 CPU 執(zhí)行更新的效率比較高,缺點(diǎn)就是實(shí)現(xiàn)起來(lái)會(huì)比較復(fù)雜。
上面說(shuō)的在適當(dāng)?shù)臅r(shí)候?qū)懭雰?nèi)存,如果是單核 CPU 的話,可以在緩存要被新進(jìn)入的數(shù)據(jù)取代時(shí),才更新內(nèi)存,但是在多核 CPU 的情況下就比較復(fù)雜了,由于 CPU 的運(yùn)算速度超越了 1 級(jí)緩存的數(shù)據(jù) I\O 能力,CPU 廠商又引入了多級(jí)的緩存結(jié)構(gòu),比如常見(jiàn)的 L1、L2、L3 三級(jí)緩存結(jié)構(gòu),L1 和 L2 為 CPU 核心獨(dú)有,L3 為 CPU 共享緩存。
如果現(xiàn)在分別有兩個(gè)線程運(yùn)行在兩個(gè)不同的核 Core 1 和 Core 2 上,內(nèi)存中 i 的值為 1,這兩個(gè)分別運(yùn)行在兩個(gè)不同核上的線程要對(duì) i 進(jìn)行加 1 操作,如果不加一些限制,兩個(gè)核心同時(shí)從內(nèi)存中讀取 i 的值,然后進(jìn)行加 1 操作后再分別寫入內(nèi)存中,可能會(huì)出現(xiàn)相互覆蓋的情況,解決的方法相信大家都能想得到,第一種是只要有一個(gè)核心修改了緩存的數(shù)據(jù)之后,就立即把內(nèi)存和其它核心更新。第二種是當(dāng)一個(gè)核心修改了緩存的數(shù)據(jù)之后,就把其它同樣復(fù)制了該數(shù)據(jù)的 CPU 核心失效掉這些數(shù)據(jù),等到合適的時(shí)機(jī)再更新,通常是下一次讀取該緩存的時(shí)候發(fā)現(xiàn)已經(jīng)無(wú)效,才從內(nèi)存中加載最新的值。
四.緩存一致性協(xié)議不難看出第一種需要頻繁訪問(wèn)內(nèi)存更新數(shù)據(jù),執(zhí)行效率比較低,而第二種會(huì)把更新數(shù)據(jù)推遲到最后一刻才會(huì)更新,讀取內(nèi)存,效率高(類似于懶加載)。緩存一致性協(xié)議(MESI) 就是使用第二種方案,該協(xié)議主要是保證緩存內(nèi)部數(shù)據(jù)的一致,不讓系統(tǒng)數(shù)據(jù)混亂。MESI 是指 4 種狀態(tài)的首字母。每個(gè)緩存存儲(chǔ)數(shù)據(jù)單元(Cache line)有 4 種不同的狀態(tài),用 2 個(gè) bit 表示,狀態(tài)和對(duì)應(yīng)的描述如下:
下面看看基于緩存一致性協(xié)議是如何進(jìn)行讀取和寫入操作的, 假設(shè)現(xiàn)在有一個(gè)雙核的 CPU,為了描述方便,簡(jiǎn)化一下只看其邏輯結(jié)構(gòu):
單核讀取步驟:Core 0 發(fā)出一條從內(nèi)存中讀取 a 的指令,從內(nèi)存通過(guò) BUS 讀取 a 到 Core 0的緩存中,因?yàn)榇藭r(shí)數(shù)據(jù)只在 Core 0 的緩存中,所以將 Cache line 修改為 E 狀態(tài)(獨(dú)享),該過(guò)程用示意圖表示如下:
雙核讀取步驟:首先 Core 0 發(fā)出一條從內(nèi)存中讀取 a 的指令,從內(nèi)存通過(guò) BUS 讀取 a 到 Core 0 的緩存中,然后將 Cache line 置為 E 狀態(tài),此時(shí) Core 1 發(fā)出一條指令,也是要從內(nèi)存中讀取 a,當(dāng) Core 1 試圖從內(nèi)存讀取 a 的時(shí)候, Core 0 檢測(cè)到了發(fā)生地址沖突(其它緩存讀主存中該緩存行的操作),然后 Core 0 對(duì)相關(guān)數(shù)據(jù)做出響應(yīng),a 存儲(chǔ)于這兩個(gè)核心 Core 0 和 Core 1 的緩存行中,然后設(shè)置其狀態(tài)為 S 狀態(tài)(共享),:
假設(shè)此時(shí) Core 0 核心需要對(duì) a 進(jìn)行修改了,首先 Core 0 會(huì)將其緩存的 a 設(shè)置為 M(修改)狀態(tài),然后通知其它緩存了 a 的其它核 CPU(比如這里的 Core 1)將內(nèi)部緩存的 a 的狀態(tài)置為 I(無(wú)效)狀態(tài),最后才對(duì) a 進(jìn)行賦值操作。該過(guò)程如下所示:
細(xì)心的朋友們可能已經(jīng)注意到了,上圖中內(nèi)存中 a 的值(值為 1)并不等于 Core 0 核心中緩存的最新值(值為 2),那么要什么時(shí)候才會(huì)把該值更新到內(nèi)存中去呢?就是當(dāng) Core 1 需要讀取 a 的值的時(shí)候,此時(shí)會(huì)通知 Core 0 將 a 的修改后的最新值同步到內(nèi)存(Memory)中去,在這個(gè)同步的過(guò)程中 Core 0 中緩存的 a 的狀態(tài)會(huì)置為 E(獨(dú)享)狀態(tài),同步完成后將 Core 0和 Core 1 中緩存的 a 置為 S(共享)狀態(tài),示意圖描述該過(guò)程如下所示:
至此,變量 a 在 CPU 的兩個(gè)核 Core 0 和 Core 1 中回到了 S(共享)狀態(tài)了,以上只是簡(jiǎn)單的描述了一下大概的過(guò)程,實(shí)際上這些都是在 CPU 的硬件層面上去保證的,而且操作比較復(fù)雜。
五.總結(jié)現(xiàn)在很多一些實(shí)現(xiàn)緩存功能的應(yīng)用程序都是基于這些思想設(shè)計(jì)的,緩存把數(shù)據(jù)庫(kù)中的數(shù)據(jù)進(jìn)行緩存到速度更快的內(nèi)存中,可以加快我們應(yīng)用程序的響應(yīng)速度,比如我們使用常見(jiàn)的 Redis 數(shù)據(jù)庫(kù)可能是采用下面這些策略:
① 首先應(yīng)用程序從緩存中查詢數(shù)據(jù),如果有就直接使用該數(shù)據(jù)進(jìn)行相應(yīng)操作后返回,如果沒(méi)有則查詢數(shù)據(jù)庫(kù),更新緩存并且返回。
② 當(dāng)我們需要更新數(shù)據(jù)時(shí),先更新數(shù)據(jù)庫(kù),然后再讓緩存失效,這樣下次就會(huì)先查詢數(shù)據(jù)庫(kù)再回填到緩存中去,可以發(fā)現(xiàn),實(shí)際上底層的一些思想都是相通的,不同的只是對(duì)于特定的場(chǎng)景可能需要增加一些額外的約束?;A(chǔ)知識(shí)才是技術(shù)這顆大樹的根,我們先把根栽好了,剩下的那些枝和葉都是比較容易得到的東西了。
有問(wèn)有答:為什么CPU有緩存?
隨機(jī)存儲(chǔ)器主要有兩種,靜態(tài)隨機(jī)存儲(chǔ)器SRAM和動(dòng)態(tài)隨機(jī)存儲(chǔ)器DRAM。SRAM無(wú)需刷新,速度快,但密度小,造價(jià)高昂。DRAM需要不斷通電刷新,速度比較慢,但制造成本更低,容量更大。內(nèi)存最開始有過(guò)SRAM的時(shí)期,隨后就被更廉價(jià)的DRAM取代。一開始DRAM的速度還能跟得上CPU,比如CPU的頻率在2MHz時(shí)內(nèi)存的頻率可以達(dá)到4MHz。而從上世紀(jì)80年代開始,CPU的速度很快就遠(yuǎn)遠(yuǎn)甩開的內(nèi)存,差距逐漸達(dá)到數(shù)個(gè)數(shù)量級(jí)。
CPU與DRAM的速度差距越來(lái)越大。
這時(shí)候SRAM來(lái)救場(chǎng)了,它的速度仍能跟得上CPU,因此人們開始將其內(nèi)置到CPU中,CPU緩存也因此誕生。最早有記錄使用緩存的系統(tǒng)是通用電氣的645和IBM360/67,它們配備了TLB轉(zhuǎn)換檢測(cè)緩沖區(qū),用于加快內(nèi)存尋址,而最早有記錄搭載了數(shù)據(jù)緩存的系統(tǒng)是IBM System/360 Model 85。我們比較熟悉的摩托羅拉68k系列處理器中,發(fā)布于1984年的68020是第一款真正搭載了緩存的68k CPU,擁有256字節(jié)的指令緩存。
現(xiàn)在的CPU大都有一套多層緩存系統(tǒng),將緩存分為L(zhǎng)1、L2、L3等,有的還有L4。當(dāng)L1發(fā)生緩存命中失敗后,CPU會(huì)嘗試去L2中讀取,如果又失敗,則繼續(xù)向下一層緩存尋找。數(shù)字越小,緩存的速度越快,但成本也越高,因此容量一般更小。緩存并不是越大越好,雖然更大的緩存雖然能存儲(chǔ)更多的數(shù)據(jù)和指令,但每一次尋址需要花費(fèi)更多的周期,可能最終得不償失。緩存的設(shè)計(jì)需要平衡時(shí)間、空間和制造成本,是CPU架構(gòu)設(shè)計(jì)中的一個(gè)重要環(huán)節(jié)。
CPU緩存用處意義解釋相關(guān)文章:
CPU緩存用處意義解釋
上一篇:CPU緩存冷門知識(shí)講解
下一篇:CPU緩存作用知識(shí)科普