電子百科
CPU緩存(Cache Memory)是位于CPU與內(nèi)存之間的臨時(shí)存儲(chǔ)器,它的容量比內(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ù)到來或把數(shù)據(jù)寫入內(nèi)存。在緩存中的數(shù)據(jù)是內(nèi)存中的一小部分,但這一小部分是短時(shí)間內(nèi)CPU即將訪問的,當(dāng)CPU調(diào)用大量數(shù)據(jù)時(shí),就可避開內(nèi)存直接從緩存中調(diào)用,從而加快讀取速度。由此可見,在CPU中加入緩存是一種高效的解決方案,這樣整個(gè)內(nèi)存儲(chǔ)器(緩存+內(nèi)存)就變成了既有緩存的高速度,又有內(nèi)存的大容量的存儲(chǔ)系統(tǒng)了。緩存對(duì)CPU的性能影響很大,主要是因?yàn)镃PU的數(shù)據(jù)交換順序和CPU與緩存間的帶寬引起的。
在現(xiàn)代CPU設(shè)計(jì)中,設(shè)計(jì)師們要解決的最主要問題,就是找到一個(gè)在CPU和內(nèi)存之間平衡的均點(diǎn)。Cache作為CPU---內(nèi)存的中轉(zhuǎn)站,在其中發(fā)揮了巨大的作用。CPU在請(qǐng)求數(shù)據(jù)或指令時(shí),除了常規(guī)的在內(nèi)存中進(jìn)行查找外,還會(huì)在Cache中進(jìn)行查找。一旦命中,就可以直接從Cache中讀取,節(jié)約大量時(shí)間。正因?yàn)槿绱耍?font face="Verdana">CPU緩存
眾所周知,CPU緩存屬于SRAM(Satic Random Access Memory),它利用晶體管的邏輯開關(guān)狀態(tài)來存取數(shù)據(jù)。也正因?yàn)槿绱?,SRAM內(nèi)部的電路構(gòu)造比起常見的DRAM(Dynamic Random Memory)要復(fù)雜得多,導(dǎo)致了成本的巨增。這也是SRAM不能普及的一個(gè)重要原因。
CPU緩存在計(jì)算機(jī)存儲(chǔ)系統(tǒng)中沒有編配固定的地址,這樣程序員在寫程序時(shí)就不用考慮指令是運(yùn)行在內(nèi)存中還是Cache中,Cache對(duì)于計(jì)算機(jī)上層來說是完全透明的。
CPU在讀取數(shù)據(jù)時(shí),會(huì)首先向內(nèi)存和Cache都發(fā)送一個(gè)查找指令。如果所需要的數(shù)據(jù)在Cache中(命中),則直接從Cache讀取數(shù)據(jù),以節(jié)約時(shí)間和資源。CPU對(duì)Cache的搜索叫做Tag search,即通過Cache中的CAM(Content Addressed Memory)對(duì)希望得到的Tag數(shù)據(jù)進(jìn)行搜索。CAM是一種存儲(chǔ)芯片,延遲很低,常用于網(wǎng)絡(luò)設(shè)備中用作路由選擇。
CPU進(jìn)行Tag search的過程是這樣的:在Cache中數(shù)據(jù)或指令是以行為單位存儲(chǔ)的,一行又包含了很多字。如現(xiàn)在主流的設(shè)計(jì)是一行包含64Byte。每一行擁有一個(gè)Tag。因此,假設(shè)CPU需要一個(gè)標(biāo)為Tag 1的行中的數(shù)據(jù),它會(huì)通過CAM對(duì)Cache中的行進(jìn)行查找,一旦找到相同Tag的行,就對(duì)其中的數(shù)據(jù)進(jìn)行讀取。
在現(xiàn)代計(jì)算機(jī)中,雖然Cache的容量一直在增漲,但現(xiàn)在桌面處理器中Cache最大的也不過4MB,設(shè)計(jì)師們是如何保證在這小小的Cache中保存的數(shù)據(jù)或指令就一定是CPU需要的呢?這就要利用到CPU運(yùn)行時(shí)的兩個(gè)基本局限性:時(shí)間局限性和空間局限性。
所謂時(shí)間局限性,是指CPU在某一時(shí)刻使用到的數(shù)據(jù)或指令,在下一時(shí)刻也會(huì)被重復(fù)利用。比如3D游戲中,同一場(chǎng)景會(huì)在不同時(shí)間被渲染多次,如果在第一次渲染中Cache存儲(chǔ)了相關(guān)指令、數(shù)據(jù),那么在下一次需要重復(fù)渲染時(shí),就能夠直接從Cache中讀取相關(guān)內(nèi)容。
而空間局限性,指的是CPU在讀取某一地址的數(shù)據(jù)時(shí),也有可能會(huì)用到該地址附近的數(shù)據(jù)。也就是說,CPU需要的數(shù)據(jù)在很多時(shí)候是連續(xù)的。例如在聽歌或看電影時(shí),數(shù)據(jù)流總是連續(xù)的(正常播放狀態(tài)下)。這樣的應(yīng)用對(duì)于CPU來說是很有利的,數(shù)據(jù)預(yù)讀取單元也能夠發(fā)揮最大作用。
CPU緩存正是利用了上述兩個(gè)局限性,得已實(shí)現(xiàn)并工作。設(shè)計(jì)師們能夠充分利用這兩個(gè)局限,在容量較小的Cache中存入CPU在將來某時(shí)刻需要的內(nèi)容。需要指出的是,很多程序在執(zhí)行指令或數(shù)據(jù)時(shí),所呈現(xiàn)出來的局限性是不同的。有可能執(zhí)行指令的時(shí)候呈現(xiàn)出時(shí)間局限性,而數(shù)據(jù)呈現(xiàn)出空間局限性,因此設(shè)計(jì)師們把L1 Cache分成了Instruction Cache(指令緩存)和Data Cache(數(shù)據(jù)緩存)。
前面已經(jīng)說過,Cache的數(shù)據(jù)存儲(chǔ)是以行(Line)為單位的,每一行又包含64Byte。行是存儲(chǔ)在“框架”(Block frame)這種數(shù)據(jù)容器中的,而框架則直接與內(nèi)存相對(duì)應(yīng)。很明顯,Cache中可能包含數(shù)個(gè)框架。那么這些Cache框架是怎么與內(nèi)存相對(duì)應(yīng)相聯(lián)系的呢?有三種辦法。
第一種方法叫完全相聯(lián)法。即內(nèi)存中的數(shù)據(jù)可以存儲(chǔ)在任何Cache框架中,同一數(shù)據(jù)也可以存儲(chǔ)在不同的框架中。這樣數(shù)據(jù)的存儲(chǔ)相當(dāng)靈活,CPU在查找時(shí)也很方便:只需在框架中對(duì)比找出需要的Tag行,即實(shí)現(xiàn)命中,顯著的提升了命中率。然而這樣做的缺陷也很明顯:對(duì)于容量較大的Cache來說,CPU需要在成百的框架中查找需要的Tag行,延遲大大增加。因此這種設(shè)計(jì)方式只適用于容量較小的Cache。
由于完全相聯(lián)法的這種局限性,設(shè)計(jì)師們很快提出了另一種旨在降低延遲的組織方式:直接映象法。和完全相聯(lián)不同,在直接映象中內(nèi)存會(huì)將數(shù)據(jù)存入的Cache框架地址“記住”,以后再次存儲(chǔ)時(shí)就只能使用該框架。這樣做的好處是使CPU只需要進(jìn)行一次Tag search,在以后的讀取操作中就可以直接找到所需Tag行所在的框架,從而達(dá)到降低延遲的目的。
而至于內(nèi)存會(huì)將數(shù)據(jù)存入Cache的哪個(gè)框架中,這有個(gè)算法——塊地址與整個(gè)框架數(shù)的同余。我們舉個(gè)簡(jiǎn)單的例子來看,有個(gè)1K的緩存,塊大小為64字節(jié),則總共有16個(gè)緩存塊,也就是有16個(gè)框架,那在內(nèi)存中首地址為12480的內(nèi)存塊應(yīng)該保存在緩存的哪個(gè)框架中呢?12480/64=195,195mod16=3,則它應(yīng)該放入第4個(gè)框架中。這樣一來,內(nèi)存中的數(shù)據(jù)能很快的讀取到緩存中的某個(gè)塊中,CPU也能很快的在這個(gè)塊中找到所要的數(shù)據(jù),這樣就省下了對(duì)比各個(gè)框架的時(shí)間,自然延遲就小了,但是,如果第4個(gè)框架中裝入了內(nèi)存塊195的數(shù)據(jù),而其它同余依然是3的35,51,67等這些塊就不能裝入了,這樣,當(dāng)CPU需要35,51,67這些塊的時(shí)候,就會(huì)發(fā)生沖突(collision),導(dǎo)致出現(xiàn)Cache miss的情況,大大的降低了命中率。
按照數(shù)據(jù)讀取順序和與CPU結(jié)合的緊密程度,CPU緩存可以分為一級(jí)緩存,二級(jí)緩存,部分高端CPU還具有三級(jí)緩存,每一級(jí)緩存中所儲(chǔ)存的全部數(shù)據(jù)都是下一級(jí)緩存的一部分,這三種緩存的技術(shù)難度和制造成本是相對(duì)遞減的,所以其容量也是相對(duì)遞增的。當(dāng)CPU要讀取一個(gè)數(shù)據(jù)時(shí),首先從一級(jí)緩存中查找,如果沒有找到再?gòu)亩?jí)緩存中查找,如果還是沒有就從三級(jí)緩存或內(nèi)存中查找。一般來說,每級(jí)緩存的命中率大概都在80[%]左右,也就是說全部數(shù)據(jù)量的80[%]都可以在一級(jí)緩存中找到,只剩下20[%]的總數(shù)據(jù)量才需要從二級(jí)緩存、三級(jí)緩存或內(nèi)存中讀取,由此可見一級(jí)緩存是整個(gè)CPU緩存架構(gòu)中最為重要的部分。
?。保┮患?jí)緩存
一級(jí)緩存(Level 1 Cache)簡(jiǎn)稱L1 Cache,位于CPU內(nèi)核的旁邊,是與CPU結(jié)合最為緊密的CPU緩存,也是歷史上最早出現(xiàn)的CPU緩存。由于一級(jí)緩存的技術(shù)難度和制造成本最高,提高容量所帶來的技術(shù)難度增加和成本增加非常大,所帶來的性能提升卻不明顯,性價(jià)比很低,而且現(xiàn)有的一級(jí)緩存的命中率已經(jīng)很高,所以一級(jí)緩存是所有緩存中容量最小的,比二級(jí)緩存要小得多。
?。玻┒?jí)緩存
二級(jí)緩存是CPU的第二層高速緩存,分內(nèi)部和外部?jī)煞N芯片。內(nèi)部的芯片二級(jí)緩存運(yùn)行速度與主頻相同,而外部的二級(jí)緩存則只有主頻的一半。L2高速緩存容量也會(huì)影響CPU的性能,原則是越大越好,現(xiàn)在家庭用CPU容量最大的是4MB,而服務(wù)器和工作站上用CPU的L2高速緩存更高達(dá)2MB—4MB,有的高達(dá)8MB或者19MB。
?。常┤?jí)緩存
三級(jí)緩存分為兩種,早期的是外置,現(xiàn)在的都是內(nèi)置的。而它的實(shí)際作用即是,L3緩存的應(yīng)用可以進(jìn)一步降低內(nèi)存延遲,同時(shí)提升大數(shù)據(jù)量計(jì)算時(shí)處理器的性能。降低內(nèi)存延遲和提升大數(shù)據(jù)量計(jì)算能力對(duì)游戲都很有幫助。而在服務(wù)器領(lǐng)域增加L3緩存在性能方面仍然有顯著的提升。比方具有較大L3緩存的配置利用物理內(nèi)存會(huì)更有效,故它比較慢的磁盤I/O子系統(tǒng)可以處理更多的數(shù)據(jù)請(qǐng)求。具有較大L3緩存的處理器提供更有效的文件系統(tǒng)緩存行為及較短消息和處理器隊(duì)列長(zhǎng)度。
一級(jí)緩存和二級(jí)緩存用于存儲(chǔ)數(shù)據(jù)的緩存部分通常被稱為RAM,掉電以后其中的信息就會(huì)消失。
RAM又分兩種,其中一種是靜態(tài)RAM(SRAM);另外一種是動(dòng)態(tài)RAM(DRAM)。前者的存儲(chǔ)速度要比后者快得多,我們現(xiàn)在使用的內(nèi)存一般都是動(dòng)態(tài)RAM。CPU的L1級(jí)緩存通常都是靜態(tài)RAM,速度非常的快,但是靜態(tài)RAM集成度低(存儲(chǔ)相同的數(shù)據(jù),靜態(tài)RAM的體積是動(dòng)態(tài)RAM的6倍),而且價(jià)格也相對(duì)較為昂貴(同容量的靜態(tài)RAM是動(dòng)態(tài)RAM的四倍)。擴(kuò)大靜態(tài)RAM作為緩存是一個(gè)不太合算的做法,但是為了提高系統(tǒng)的性能和速度又必須要擴(kuò)大緩存,這就有了一個(gè)折中的方法:在不擴(kuò)大原來的靜態(tài)RAM緩存容量的情況下,僅僅增加一些高速動(dòng)態(tài)RAM做為L(zhǎng)2級(jí)緩存。高速動(dòng)態(tài)RAM速度要比常規(guī)動(dòng)態(tài)RAM快,但比原來的靜態(tài)RAM緩存慢,而且成本也較為適中。一級(jí)緩存和二級(jí)緩存中的內(nèi)容都是內(nèi)存中訪問頻率高的數(shù)據(jù)的復(fù)制品(映射),它們的存在都是為了減少高速CPU對(duì)慢速內(nèi)存的訪問。
二級(jí)緩存是CPU性能表現(xiàn)的關(guān)鍵之一,在CPU核心不變化的情況下,增加二級(jí)緩存容量能使性能大幅度提高。而同一核心的CPU高低端之分往往也是在二級(jí)緩存上存在差異,由此可見二級(jí)緩存對(duì)CPU的重要性。CPU在緩存中找到有用的數(shù)據(jù)被稱為命中,當(dāng)緩存中沒有CPU所需的數(shù)據(jù)時(shí)(這時(shí)稱為未命中),CPU才訪問內(nèi)存。
從理論上講,在一顆擁有二級(jí)緩存的CPU中,讀取一級(jí)緩存的命中率為80[%]。也就是說CPU一級(jí)緩存中找到的有用數(shù)據(jù)占數(shù)據(jù)總量的80[%],剩下的20[%]從二級(jí)緩存中讀取。由于不能準(zhǔn)確預(yù)測(cè)將要執(zhí)行的數(shù)據(jù),讀取二級(jí)緩存的命中率也在80[%]左右(從二級(jí)緩存讀到有用的數(shù)據(jù)占總數(shù)據(jù)的16[%])。那么還有的數(shù)據(jù)就不得不從內(nèi)存調(diào)用,但這已經(jīng)是一個(gè)相當(dāng)小的比例了。
三級(jí)緩存是為讀取二級(jí)緩存后未命中的數(shù)據(jù)設(shè)計(jì)的—種緩存,在擁有三級(jí)緩存的CPU中,只有約5[%]的數(shù)據(jù)需要從內(nèi)存中調(diào)用,這進(jìn)一步提高了CPU的效率。