高速缓冲存储器(Cache)
2018-1-4
首先我們得知道,為什么會出現(xiàn)Cache?
是為了解決CPU與主存速度不匹配的問題。
其次,Cache主要是由高速的靜態(tài)RAM組成的,價格較貴,容量較小。
還有,我們是如何使用Cache的?
根據(jù)局部性原理可以知道,CPU在執(zhí)行某段程序的時候,他的訪存是具有相對的局部性的,也就是說,大部分都是順序執(zhí)行或者說是循環(huán)執(zhí)行。那么我們只要將CPU近期會使用到的程序和數(shù)據(jù)放在Cache中即可,那么CPU就可以實(shí)現(xiàn)在某一時間段內(nèi)只訪問速度較快的Cache,從而加快了速度。
當(dāng)CPU想要讀取主存中某個字的時候,他會先去Cache中尋找,如果它所需要的字已經(jīng)在Cache里了,便可直接訪問Cache(Cache與CPU之間通常每次只傳送一個字),但是如果他想要的字并不在Cache中,那么他會將主存中那個字對應(yīng)的一整個字塊一次調(diào)入Cache中(Cache與主存之間通常每次傳送一個字塊)。如何該字塊已經(jīng)調(diào)入Cache塊中,那么我們稱主存塊與緩存塊建立了 對應(yīng)關(guān)系。
再說一下基本結(jié)構(gòu)示意圖:
我們假設(shè)主存共有2^n個可編址的字,那么我們可以得到,主存地址一共有n位。
假設(shè)我們將主存的低b位作為塊內(nèi)地址,那么表明我們每一塊有2^b個字。
那么剩下的n-b=m位就作為了主存塊號,主存一共有2^m個塊。
對于Cache而言,他每一塊的大小和主存是保持一致的,所以他的塊內(nèi)地址的位數(shù)也是b位,每塊的大小也是2^b個字。
假設(shè)他的緩存塊號為c位,那么他一共有2^c個塊。他的大小是遠(yuǎn)小于主存的塊數(shù)的。
還有,根據(jù)我們的分析可知,一個緩存塊不可能永久的只放那一個主存塊(那么有的主存塊豈不是無處可放),言外之意就是說,每一個緩存塊位置上的主存塊是不唯一的,所以我們的緩存塊需要一個標(biāo)記來標(biāo)記是哪一個主存塊放在了這里,這樣我們每次需要根據(jù)標(biāo)記來判斷該緩存塊中的內(nèi)容。
接著我們再說一下幾個比較重要的指標(biāo)吧!
1.命中率:
h=Cache總命中次數(shù)/(Cache總命中次數(shù)+訪問主存的總次數(shù))
其中他們兩個的和就表示我們對數(shù)據(jù)訪問的總次數(shù)。
2.Cache-主存系統(tǒng)平均訪問時間:
1-h為未命中率
t=h*(命中時訪問Cache的時間)+(1-h)*(未命中時訪問主存的時間)
3.Cache-主存系統(tǒng)訪問效率
e=命中時訪問Cache的時間/平均訪問時間*100%
最后,我想說的是Cache-主存地址映射。
CPU給出一個他想要訪問的主存地址,我們將他映射到對應(yīng)的緩存塊,進(jìn)而判斷是否命中了。
由主存地址映射到緩存地址叫做地址映射。
通常有三種方式:直接映射,全相聯(lián)映射,組相聯(lián)映射。
1.直接映射:
首先,我們將主存地址分成了三個部分:
t+c+b,其中b我們在上面已經(jīng)有提到 ,就是用這b位地址作為塊內(nèi)地址,t+c=m在上面是主存塊號,在這里:
i=jmod(2^c),其中2^c表示緩存塊號,j表示主存塊號,i表示對應(yīng)的緩存塊號,那么我們可以得到,主存里面的0,2^c,2^(c+1)……對應(yīng)緩存里的第0塊,主存里面的1,2^c+1,2^(c+1)+1……對應(yīng)緩存里的第1塊,我們根據(jù)中間的c位確定緩存塊,剩下的t位就作為主存字塊標(biāo)記了,我們根據(jù)緩存里對應(yīng)的標(biāo)記與這里的t位進(jìn)行比較,看是否在里面即可。
缺點(diǎn)是不夠靈活,每個主存塊必須對應(yīng)某個緩存塊。
2.全相聯(lián)映射:
這就厲害了,主存中的每一字塊可以映射到Cache中的任意位置,這樣利用率比較高,但是我們的主存字塊標(biāo)記從t位增加到了t+c位,而且邏輯電路也比較復(fù)雜,成本比較高。
3.組相聯(lián)映射:
我們增加了組這個概念。
這是一種折中,概括的說,就是從組間來說是直接映射,從組內(nèi)來說是全相聯(lián)映射。
假設(shè)我們一組內(nèi)有兩塊,那么我們只需要r=1位就可以標(biāo)記是組內(nèi)的哪一塊了(2^1=2),b還是原來的b,但是,對于Cache而言,他原來共需要2^c個地址,現(xiàn)在我們只需要有2^(c-1)個地址即可(因?yàn)槲覀儍蓚€塊排成了一組也就是一排),我們使用c-r位作為組地址,根據(jù)這個找到對應(yīng)的組,然后我們再根據(jù)t+r位的主存字塊標(biāo)記來判斷該塊是否是緩存中的字塊,一組中某一字塊的位置是隨便放的。
總結(jié)
以上是生活随笔為你收集整理的高速缓冲存储器(Cache)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: effectiveJava(5)消除过期
- 下一篇: spring源码阅读(3)-- 容器启动