高速緩沖存儲(chǔ)器是存在于主存與CPU之間的一級(jí)存儲(chǔ)器, 由靜態(tài)存儲(chǔ)芯片(SRAM)組成,容量比較小但速度比主存高得多, 接近于CPU的速度。在計(jì)算機(jī)存儲(chǔ)系統(tǒng)的層次結(jié)構(gòu)中,是介于中央處理器和主存儲(chǔ)器之間的高速小容量存儲(chǔ)器。它和主存儲(chǔ)器一起構(gòu)成一級(jí)的存儲(chǔ)器。高速緩沖存儲(chǔ)器和主存儲(chǔ)器之間信息的調(diào)度和傳送是由硬件自動(dòng)進(jìn)行的。高速緩沖存儲(chǔ)器最重要的技術(shù)指標(biāo)是它的命中率。
CPU在Cache中找到有用的數(shù)據(jù)被稱為命中,當(dāng)Cache中沒(méi)有CPU所需的數(shù)據(jù)時(shí)(這時(shí)稱為未命中),CPU才訪問(wèn)內(nèi)存。從理論上講,在一顆擁有2級(jí)Cache的CPU中,讀取L1Cache的命中率為80%。也就是說(shuō)CPU從L1Cache中找到的有用數(shù)據(jù)占數(shù)據(jù)總量的80%,剩下的20%從L2Cache讀取。由于不能準(zhǔn)確預(yù)測(cè)將要執(zhí)行的數(shù)據(jù),讀取L2的命中率也在80%左右(從L2讀到有用的數(shù)據(jù)占總數(shù)據(jù)的16%)。那么還有的數(shù)據(jù)就不得不從內(nèi)存調(diào)用,但這已經(jīng)是一個(gè)相當(dāng)小的比例了。在一些高端領(lǐng)域的CPU中,我們常聽(tīng)到L3Cache,它是為讀取L2Cache后未命中的數(shù)據(jù)設(shè)計(jì)的—種Cache,在擁有L3Cache的CPU中,只有約5%的數(shù)據(jù)需要從內(nèi)存中調(diào)用,這進(jìn)一步提高了CPU的效率。為了保證CPU訪問(wèn)時(shí)有較高的命中率,Cache中的內(nèi)容應(yīng)該按一定的算法替換。一種較常用的算法是“最近最少使用算法”(LRU算法),它是將最近一段時(shí)間內(nèi)最少被訪問(wèn)過(guò)的行淘汰出局。因此需要為每行設(shè)置一個(gè)計(jì)數(shù)器,LRU算法是把命中行的計(jì)數(shù)器清零,其他各行計(jì)數(shù)器加1。當(dāng)需要替換時(shí)淘汰行計(jì)數(shù)器計(jì)數(shù)值最大的數(shù)據(jù)行出局。這是一種高效、科學(xué)的算法,其計(jì)數(shù)器清零過(guò)程可以把一些頻繁調(diào)用后再不需要的數(shù)據(jù)淘汰出Cache,提高Cache的利用率。Cache的替換算法對(duì)命中率的影響。 當(dāng)新的主存塊需要調(diào)入Cache并且它的可用空間位置又被占滿時(shí),需要替換掉Cache的數(shù)據(jù),這就產(chǎn)生了替換策略(算法)問(wèn)題。根據(jù)程序局部性規(guī)律可知:程序在運(yùn)行中,總是頻繁地使用那些最近被使用過(guò)的指令和數(shù)據(jù)。這就提供了替換策略的理論依據(jù)。 替換算法目標(biāo)就是使Cache獲得最高的命中率。Cache替換算法是影響代理緩存系統(tǒng)性能的一個(gè)重要因素,一個(gè)好的Cache替換算法可以產(chǎn)生較高的命中率。常用算法如下:
(1)隨機(jī)法(RAND法) 隨機(jī)替換算法就是用隨機(jī)數(shù)發(fā)生器產(chǎn)生一個(gè)要替換的塊號(hào),將該塊替換出去,此算法簡(jiǎn)單、易于實(shí)現(xiàn),而且它不考慮Cache塊過(guò)去、現(xiàn)在及將來(lái)的使用情況,但是沒(méi)有利用上層存儲(chǔ)器使用的“歷史信息”、沒(méi)有根據(jù)訪存的局部性原理,故不能提高Cache的命中率,命中率較低。
(2)先進(jìn)先出法(FIFO法) 先進(jìn)先出(First-In-First-Out,F(xiàn)IFO)算法。就是將最先進(jìn)入Cache的信息塊替換出去。FIFO算法按調(diào)入Cache的先后決定淘汰的順序,選擇最早調(diào)入Cache的字塊進(jìn)行替換,它不需要記錄各字塊的使用情況,比較容易實(shí)現(xiàn),系統(tǒng)開(kāi)銷小,其缺點(diǎn)是可能會(huì)把一些需要經(jīng)常使用的程序塊(如循環(huán)程序)也作為最早進(jìn)入Cache的塊替換掉,而且沒(méi)有根據(jù)訪存的局部性原理,故不能提高Cache的命中率。因?yàn)樽钤缯{(diào)入的信息可能以后還要用到,或者經(jīng)常要用到,如循環(huán)程序。此法簡(jiǎn)單、方便,利用了主存的“歷史信息”, 但并不能說(shuō)最先進(jìn)入的就不經(jīng)常使用,其缺點(diǎn)是不能正確反映程序局部性原理,命中率不高,可能出現(xiàn)一種異?,F(xiàn)象。(
3)近期最少使用法(LRU法) 近期最少使用(Least Recently Used,LRU)算法。這種方法是將近期最少使用的Cache中的信息塊替換出去。該算法較先進(jìn)先出算法要好一些。但此法也不能保證過(guò)去不常用將來(lái)也不常用。 LRU法是依據(jù)各塊使用的情況,總是選擇那個(gè)最近最少使用的塊被替換。這種方法雖然比較好地反映了程序局部性規(guī)律,但是這種替換方法需要隨時(shí)記錄Cache中各塊的使用情況,以便確定哪個(gè)塊是近期最少使用的塊。LRU算法相對(duì)合理,但實(shí)現(xiàn)起來(lái)比較復(fù)雜,系統(tǒng)開(kāi)銷較大。通常需要對(duì)每一塊設(shè)置一個(gè)稱為計(jì)數(shù)器的硬件或軟件模塊,用以記錄其被使用的情況。