Cache(高速緩存)技術(shù)詳解
計(jì)算機(jī)系統(tǒng)一般都采用多級(jí)存儲(chǔ)器結(jié)構(gòu),如寄存器、主存、磁盤、光盤、磁帶等。這種多級(jí)存儲(chǔ)器的特點(diǎn)是從外存儲(chǔ)器到CPU中的寄存器逐級(jí)向上,存儲(chǔ)容量逐級(jí)減小,而存取速度逐級(jí)提高。由于上下兩級(jí)存儲(chǔ)器的速度可以相差l—2個(gè)數(shù)量級(jí)或者更高,因此,上一級(jí)和下一級(jí)存儲(chǔ)器的數(shù)據(jù)交換常常成為系統(tǒng)瓶頸,大大降低了系統(tǒng)的性能。為了解決這個(gè)問題,通常采用的辦法是在兩級(jí)存儲(chǔ)器之間增加一個(gè)高速緩沖存儲(chǔ)器Cache。
所謂Cache是一個(gè)速度等于或者接近上一級(jí)存儲(chǔ)器訪問速度的小容量存儲(chǔ)器,其中保存了下級(jí)存儲(chǔ)器中部分當(dāng)前所需的數(shù)據(jù),因此CPU可以直接從Cache中取得所需的數(shù)據(jù),而不必訪問下一級(jí)存儲(chǔ)器。由于Cache的速度與上一級(jí)存儲(chǔ)器相當(dāng),因此保證了系統(tǒng)效率不會(huì)降低。Cache的設(shè)計(jì)依據(jù)是程序存取局部性原理,通常程序存取的一批數(shù)據(jù)總是存放在存儲(chǔ)器相鄰的單元中,只要把這一批數(shù)據(jù)同時(shí)調(diào)入cache中,即可保證近期內(nèi)需要的數(shù)據(jù)都能在Caclle中訪問成功。為了實(shí)現(xiàn)上述目標(biāo),在設(shè)計(jì)Cache時(shí)必須做到以下兩點(diǎn):
1.保證訪問Cache有較高的命中率;
2.訪問Cache與訪問下級(jí)存儲(chǔ)器的方式不變、容量不減。因此對(duì)于編程人員來(lái)說(shuō),Cache是完全透明的,也就是說(shuō),他們感覺不到Cache的存在。
由于Cache的容量比下級(jí)存儲(chǔ)器小l-2個(gè)數(shù)量級(jí)、要做到上述兩點(diǎn),則必須考慮以下問題:
1.如何組織Cache,使得下級(jí)存儲(chǔ)器的每個(gè)部分都能夠在需要時(shí)調(diào)入Cache
2.采用何種替換策略、使得訪問cache的命中率最高;
3.采用什么方法使得Cache和下級(jí)存儲(chǔ)器的數(shù)據(jù)具有—致性,即修改Cache后保證下級(jí)存儲(chǔ)器的內(nèi)容也隨之修改(或者相反)。
通過(guò)上面的介紹,我們知道Cache也是一種存儲(chǔ)器,其工作速度很高,如Ll和L2 Cache就是為了解決PU和DRAM主存之間的速度匹配而設(shè)置的。因此主存Cache也可以看作是高速CPU和低速DRAM之間的接口?;蛘哒f(shuō),把Cache看成一個(gè)適配器來(lái)解決CPU和DRAM之間的速度匹配問題。
當(dāng)CPU要從存儲(chǔ)器中讀取一個(gè)數(shù)據(jù)字時(shí),它首先在Cache中查找。如果找到了,則立即從Cache中讀取并送到CPU中;如果在Cache中找不到,則用一個(gè)存儲(chǔ)器讀周期的時(shí)間從主存?zhèn)€讀出這個(gè)數(shù)據(jù)字送到CPU、并且把包含這個(gè)數(shù)據(jù)字的整個(gè)內(nèi)存數(shù)據(jù)塊都從主存送到Cache中。之所以要把包含被讀數(shù)據(jù)字的整個(gè)內(nèi)存數(shù)據(jù)塊都從主存送到Cache中是因?yàn)閷?duì)存儲(chǔ)器的訪問具有局部性,也就是說(shuō)連續(xù)讀取的數(shù)據(jù)宇一般在內(nèi)存中都是連續(xù)存放的;調(diào)入一個(gè)數(shù)據(jù)塊后,將使得以后若干次的訪存都可以通過(guò)訪問Cache來(lái)完成。如果調(diào)度算法得當(dāng),Cache的命中率可以很高。這樣,從用戶的角度看來(lái),整個(gè)存儲(chǔ)器(Cache+DRAM)就變成了既有Cache這樣高的速度,又有DRAM這樣的大容量的存儲(chǔ)系統(tǒng)了。這對(duì)于解決存儲(chǔ)器這個(gè)瓶頸是十分有效的。
綜上所述,Cache具有以下一些特點(diǎn):
·Cache雖然也是一類存儲(chǔ)器.但是不能由用戶直接訪問。
·Cache的容量不大,其中存放的只是主存儲(chǔ)器中某一部分內(nèi)容的拷貝,稱為存儲(chǔ)器映象。
·為了保證CPU訪問時(shí)有較高的命中率,Cache中的內(nèi)容應(yīng)該按一定的算法更換。
·Cache中的內(nèi)容應(yīng)該與主存中對(duì)應(yīng)的部分保持一致。也就是說(shuō),如果主存守的內(nèi)容在調(diào)入Cache之后發(fā)生了改變,那么它在Cache中的拷貝也應(yīng)該隨之改變。反過(guò)來(lái),如果CPU修改了Cache中的內(nèi)容,也應(yīng)該修改主存中的相應(yīng)內(nèi)容。
現(xiàn)代的Cache系統(tǒng)常常采用分級(jí)組織的方法,在CPU中集成了一級(jí)Cache(L1),也稱為片內(nèi)Cache;在主板上配置二級(jí)Cache(L2)。CPU中的片內(nèi)Cache雖然容量較小,但是能夠以CPU相同的工作頻率工作,因此速度極快。一般情況下在L1未命中時(shí),才在L2中查找。從賽揚(yáng)處理器開始,甚至已經(jīng)把L2集成到CPU內(nèi)部了(K6-3處理器也內(nèi)置了二級(jí)緩存,而這時(shí)相應(yīng)的Socket 7主板上的二級(jí)緩存就成為“三級(jí)”緩存了)。
所謂存儲(chǔ)器映像問題就是如何組織Cache.使得下級(jí)存儲(chǔ)器的每個(gè)部分都能夠在需要時(shí)調(diào)入Cache,并且確定調(diào)入的內(nèi)容放在Cache中的什么地方,以便于準(zhǔn)確迅速地查找。存儲(chǔ)器映像的方法主要有全相聯(lián)映像法、直接映象法和組相聯(lián)映象法。
全相聯(lián)映像法的基本思想是把一個(gè)主存塊的地址(塊號(hào))和塊的內(nèi)容都拷貝到Cache行中;由于塊地址也保存在Cache中,因此可以拷貝到Cache中的任意位置。此法的優(yōu)點(diǎn)是靈活,但是查找比較困難,而且硬件的實(shí)現(xiàn)較為困難。
直接映像法的基本思想是一個(gè)主存塊只能拷貝到Cache中固定的行內(nèi)。該按硬件成本低,但是由于一個(gè)Cache行要對(duì)應(yīng)多個(gè)主存塊,在使用中當(dāng)這些主存塊需要同時(shí)調(diào)入Cache時(shí)將發(fā)生沖突、增加調(diào)入調(diào)出的開銷。
組相聯(lián)映像法是上述兩種方法的折衷方案。其基本思想是把Cache分為m個(gè)組,每個(gè)組分為n行。主存塊分配時(shí)對(duì)組是固定的、而在組內(nèi)的位置可以任意。這樣就綜合了兩者的優(yōu)點(diǎn),這是目前最常用的方法。
由于Cache的容量總是遠(yuǎn)小于下一級(jí)存儲(chǔ)器的容量,因此Cache中只能是下級(jí)存儲(chǔ)器的部分映像。為了使下級(jí)存儲(chǔ)器的內(nèi)容都能在需要時(shí)拷貝到Cache中,必須隨時(shí)替換Cache內(nèi)容:即把當(dāng)前不需要的內(nèi)容調(diào)出Cache,騰出空間,調(diào)入當(dāng)前需要的內(nèi)存塊。在這種調(diào)入調(diào)出方法中,最重要的是替換的策略,即在需要時(shí)選擇Cache中的哪些行調(diào)出,再調(diào)入所需的內(nèi)存塊。這種替換策略通常稱為調(diào)度算法,它是由硬件實(shí)現(xiàn)的。如果算法選擇不當(dāng),將大大增加調(diào)入調(diào)出的頻度。例如把一個(gè)當(dāng)前不需要但是很快就將使用的行調(diào)出,必然會(huì)降低系統(tǒng)的效率。
常用算法有最不經(jīng)常使用算法、最近最少使用算法。
最不經(jīng)常使用算法(LFU算法)的思想是把最近一段時(shí)間內(nèi)被訪問次數(shù)最少的行調(diào)出。因此需要對(duì)每一個(gè)行設(shè)置一個(gè)計(jì)數(shù)器,對(duì)該行的訪問次數(shù)計(jì)數(shù)、在需要時(shí)比較各個(gè)計(jì)數(shù)器的值,淘汰計(jì)數(shù)次數(shù)最少的數(shù)據(jù)行。這種算法的問題是明顯的、那些在程序前期被頻繁訪問而在后期不再使用的行,可能會(huì)在相當(dāng)長(zhǎng)的時(shí)間內(nèi)不被淘沈而那些剛剛調(diào)入并將繼續(xù)反復(fù)使用的行則可能因?yàn)槠溆?jì)數(shù)器中的值較小而頻道淘汰。這將嚴(yán)重影響系統(tǒng)的效率。
另一種較常用的算法是最近最少使用算法(LRU算法)。LRU算法的思想是將最近一段時(shí)間內(nèi)最少被訪問過(guò)的行淘汰出局。因此也需要為每行設(shè)置一個(gè)計(jì)數(shù)器、但是計(jì)數(shù)方法與LFU算法不同。LRU算法是把命中行的計(jì)數(shù)器清零、其它各行計(jì)數(shù)器加1。當(dāng)需要替換時(shí)淘汰行計(jì)數(shù)器計(jì)數(shù)值最大的數(shù)據(jù)行出局。
此外還有一些算法,鑒于篇幅不再贅述。
由于Cache中的內(nèi)容只是主存中相應(yīng)單元的“拷貝”。因此必須保持這兩處的數(shù)據(jù)絕對(duì)一致,否則就會(huì)產(chǎn)生錯(cuò)誤。造成Cache和相應(yīng)主存單元數(shù)據(jù)不一致的原因來(lái)自兩個(gè)方面。一是CPU讀人Cache數(shù)據(jù)作了修改后再寫入Cache,而主存中相應(yīng)單元的內(nèi)容并未隨之變化二是在有多個(gè)設(shè)備對(duì)主存訪問的情況下造成的。如多處理器或有DMA的系統(tǒng),它們直接訪問主存儲(chǔ)器,修改了其中的內(nèi)容,而cache中的相應(yīng)數(shù)據(jù)卻末隨之修改。
1.CPU修改Cache后的處理
對(duì)于CPU修改了Cache的數(shù)據(jù),如何使主存中相應(yīng)單元的數(shù)據(jù)也隨之修改的問題。通常有三種不同的處理方式。
一種方式稱為“直寫式(write—through)”,其原理是在CPU向Cache寫入的同時(shí),也把數(shù)據(jù)寫入主存儲(chǔ)器,以保證Cache和主存中相應(yīng)單元數(shù)據(jù)的一致性。直寫式系統(tǒng)簡(jiǎn)單可靠,但由于CPU每次更新Cache時(shí)都要對(duì)主存儲(chǔ)器寫入,習(xí)此速度受到了影響。
第二種方式稱為“緩沖直寫式(Posted Write)”,其原理是CPU在更新Cache時(shí)不直接更新主存中的數(shù)據(jù),而是把更新的數(shù)據(jù)送入一個(gè)緩沖器中暫存,這樣CPU就不必等待主存寫入造成的延時(shí)而直接進(jìn)入下一周期的操作在適當(dāng)?shù)臅r(shí)候再把緩沖器中的內(nèi)容寫入主存中(例如在CPU讀Cache的同時(shí);把緩沖器的內(nèi)容寫入主存)。這種方式在一定程序上提高了速度,但由于緩沖器的容量有限,只能鎖存——次寫入的數(shù)據(jù),如果發(fā)生連續(xù)的寫操作則CPU仍需要等待。上述的直寫式或緩沖直寫式不僅速度低,而且在很多時(shí)候向主存寫入是不必要的。例如CPU可能多次對(duì)同一個(gè)Cache單元更新內(nèi)容,實(shí)際上只需把最后更新結(jié)果寫入主存即可,而不必更新一次Cache,就向主存寫入一次。根據(jù)這種思想提出了第三種方式,稱為“回寫式(Write—back)”。有的資料中也稱為“寫回”。這種方式的原理是CPU修改了Cache的內(nèi)容后并不立即修改主存中相應(yīng)的單元,而在被修改的Cache單元的內(nèi)容將從Cache中淘汰時(shí)(如更換頁(yè)面)才把它寫入主存儲(chǔ)器的相應(yīng)單元中?;貙懯较到y(tǒng)速度快,避免了不必要的冗余寫操作,但結(jié)構(gòu)上比較復(fù)雜。當(dāng)前的微機(jī)普遍采回寫式系統(tǒng)。
2.多處理器或DMA直接訪問主存儲(chǔ)器后的處理
多處理器或DMA直接訪問主存儲(chǔ)器造成主存和cache中的數(shù)據(jù)不一致發(fā)生在以下情形:當(dāng)主存中某單元內(nèi)容調(diào)入Cache后,又由其它處理器或DMA更新了主存儲(chǔ)器該單元的內(nèi)容。為了避免這種情況下的數(shù)據(jù)不一致,通常采用以下三種處理辦法。
一種辦法稱為“總線監(jiān)視”,即由cache控制器隨時(shí)監(jiān)視系統(tǒng)的地址總線,若有其它部件向主存中寫入了內(nèi)容,則把Cache中相應(yīng)單元的內(nèi)容置為無(wú)效,CPU必須重新從主存中讀人該單元的內(nèi)容。
第二種方式稱為“主存監(jiān)視”、由Cache控制器監(jiān)視所有主存儲(chǔ)器的讀寫操作所有對(duì)主存的訪問都必須通過(guò)Cache來(lái)完成。這樣,凡對(duì)主存的寫入也就對(duì)Cache中的相應(yīng)單元進(jìn)行拷貝從而保證了兩者數(shù)據(jù)的一致性。
第三種方式是設(shè)置“不可Cache區(qū) (Non Cacheable Block)”,這種方式的基本思想是在主存中開辟一塊區(qū)域,該區(qū)域中數(shù)據(jù)不受cache控制器的管理,不能調(diào)入Cache,CPU只能直接讀寫該區(qū)域的內(nèi)容。其它總線設(shè)備也只能把數(shù)據(jù)直接寫入該區(qū)域中。由于該區(qū)域不與Cache發(fā)生關(guān)系,也就不存在數(shù)據(jù)不一致的問題。不可Cache區(qū)方式是微機(jī)中最主要的方式,不少BIOS設(shè)置程序允許用戶設(shè)置不可Cache區(qū)的首地址和尺寸、以及可Cache區(qū)的地址范圍。
Cache在微機(jī)系統(tǒng)中獲得了廣泛應(yīng)用。除了CPU中的cache外,硬盤、光盤甚至主存中部可找到它的蹤影。
1 CPU中的Cache
從486CPU開始,在CPU芯片內(nèi)集成了Cache,稱為片內(nèi)Cache。此時(shí)由于受到工藝上的限制,片內(nèi)Cache的容量很小,只有8KB。片內(nèi)Cache的最大優(yōu)點(diǎn)是,CPU對(duì)它的訪問是在芯片內(nèi)部進(jìn)行的,不需要通過(guò)總線傳送數(shù)據(jù)因此速度很快;但是由于其容量很小,而處理器的時(shí)鐘頻率又很高,一旦出現(xiàn)片內(nèi)cache末命中的情況,性能將明顯化。因此在處理器芯片之外的主板上再加Cache,稱為二級(jí)Cache(L2Cache),或稱為板載Cache。
在實(shí)際使用中,進(jìn)入Cache的內(nèi)容既可以是指令也可以是數(shù)據(jù),而CPU對(duì)于這兩者的處理是不完全相同的。為了使系統(tǒng)效率達(dá)到最佳狀態(tài),從Pentium處理器開始把片內(nèi)Cache容量增加到16KB。其中指令CBche和數(shù)據(jù)Cache各占8KB。
Intel公司在1995年末推出了Pentium Pro(P6),為了進(jìn)一步改善系統(tǒng)性能,P6采用了雙穴封裝,即除了CPU外,還把256/5l2KB的二級(jí)Cache也封裝在同一個(gè)陶瓷片內(nèi)。這樣,L2也能以處理器的時(shí)鐘高速運(yùn)行,大大地提高了系統(tǒng)效率。
由于P6采用的方式成本很高,在InteI隨后推出的Pentium II中,把L2又從CPU陶瓷封裝中分立出來(lái),和CPU共同安裝在一塊稱為SEC的卡盒內(nèi),而Pentium II處理器則采用了雙獨(dú)立總線結(jié)構(gòu),其中一條總線聯(lián)接L2高速緩存,另一條負(fù)責(zé)主存。由于Pentium II的L2只能以CPU時(shí)鐘的一半工作。因此比Pentium Pro的L2慢一些。作為一種補(bǔ)償,Intel將Pentium II上的Ll高速緩存從16K加倍到32K,從而減少了對(duì)L2高速緩存的調(diào)用頻率。而在非Intel CPU中,L1的容量則更大,以期求得更好的系統(tǒng)性能。
為了匹配硬盤和主存在數(shù)據(jù)傳送速度上的矛盾,微機(jī)系統(tǒng)中毫無(wú)例外地采用了硬盤高速緩存,或稱為硬盤Cache。硬盤高速緩存分為兩種:硬件高速緩存和軟件高速緩存。軟件高速緩存是利用軟件工具(如Smart Drive)在系統(tǒng)主存中開辟的一塊區(qū)域作為數(shù)據(jù)傳送緩沖區(qū),硬件高速緩存則是在磁盤控制器中安裝的一塊RAM,通過(guò)RAM緩沖區(qū)讀寫數(shù)據(jù)可以得到更高的訪問速度。早期硬盤中的cache很小,只有數(shù)十KB到數(shù)百KB,目前新型硬盤的高速緩存均達(dá)到2MB。在選購(gòu)硬盤時(shí)除了注意容量、帶寬、轉(zhuǎn)速等參數(shù)外,還應(yīng)該考慮Cache的容量,越大越好。當(dāng)Cache容量大時(shí),能夠保證較穩(wěn)定的突發(fā)數(shù)據(jù)傳送;而如果Cache容量較小,在讀寫大型圖形或視頻文件時(shí),由于連續(xù)傳送的數(shù)據(jù)量很大,緩沖區(qū)則不能表示出其優(yōu)越性,使得數(shù)據(jù)傳送不再能處于突發(fā)傳送方式,而處于持續(xù)傳送方式,降低了數(shù)據(jù)帶寬。
3.光盤
以CD—ROM驅(qū)動(dòng)器為例,其中配置的Cache通常為128KB或者256KB,高檔CD—ROM驅(qū)動(dòng)器中的Cache容量可達(dá)512KB甚至更高。在CD ROM中配置Cache的目的仍然是作為光盤的高速緩存,以便減少讀盤的次數(shù),這對(duì)于改善CD RoM的性能是很有好處的。
同樣,其它品種的光盤驅(qū)動(dòng)器,如CD-R、CD—RW、M0、DVD—ROM等,也都配置了Cache。
4.主存儲(chǔ)器中的Cache
主存通常是采用DRAM(動(dòng)態(tài)隨機(jī)存取存儲(chǔ)器)器件制作的,而Cache一般采用速度更高的SRAM(靜態(tài)隨機(jī)存取存儲(chǔ)器)制作。一種新型的增強(qiáng)DRAM)采用了在DRAM芯片上集成一個(gè)小容量SRAM的辦法,我們可以把這一小片SRAM稱為主存中的Cache。這個(gè)Cache在突發(fā)式讀寫時(shí)非常有利,使DRAM芯片的性能得到了明顯的提高。
評(píng)論