高速緩沖器cache的原理
cpu的速度遠(yuǎn)遠(yuǎn)快于內(nèi)存,因此如果cpu只是從內(nèi)存中讀取數(shù)據(jù),那么會花費較多的時間在等待數(shù)據(jù)上,我們希望有一種方法解決【從內(nèi)存中讀數(shù)據(jù)慢】的問題,于是有了高速緩存。
對于數(shù)據(jù)的讀取基于兩個猜想,假設(shè)我們讀取內(nèi)存地址x處的數(shù)據(jù),那么有
內(nèi)存地址x處的數(shù)據(jù)在短時間內(nèi)容易被再次訪問
內(nèi)存地址x周圍的數(shù)據(jù)在短時間內(nèi)容易被再次訪問
當(dāng)一個數(shù)據(jù)要從cache中讀,L1沒有就要去L2,以此層層向下。如果在所有層上都沒有找到則訪問主存,從主存中取數(shù)據(jù)送到cpu,此時取出的數(shù)據(jù)從 主存------》 cache --------》 cpu, 如果cache已滿則用置換算法換出一塊給這個數(shù)據(jù)挪位,數(shù)據(jù)讀到了cache中以便下次查找。
由此引出:
hit 命中 —— 在cache中找到了想要的數(shù)據(jù)
miss 不命中 —— cache中沒有找到想要的數(shù)據(jù)
但是命中(hit)的方式有多種,為什么呢?這是因為cache內(nèi)部的結(jié)構(gòu)問題,這里必須要說一些cache的工作原理。
cache和主存儲器之間以塊為單位進(jìn)行數(shù)據(jù)交換,而塊的大小以在主存儲器的一個周期內(nèi)能訪問到的數(shù)據(jù)長度為限,而這個數(shù)據(jù)長度并不一定只是一個字哦,如果是主存儲器采用并行或者地址交叉存取,則在主存周期內(nèi)可以訪問多個字。
因此,既然是以塊為交換單位,所以將cache和主存儲器都劃分成大小相同的塊。
主存地址:塊號B+塊內(nèi)地址W
cache地址:塊號b+塊內(nèi)地址w
這時,CPU要訪問cache時,CPU要的主存地址放在了主存地址寄存器中,通過cache-主存的地址變換部件,將寄存器要求的主存地址轉(zhuǎn)成cache中的地址,如果能在cache中找到則命中,如果不能則miss。
而主存和cache之間怎么變換的呢?其實只要映射塊號地址,主存塊號B-----》cache中的塊號b,塊內(nèi)地址不變,解決。
要想通過主存地址找到cache地址,其實是有個表來記錄的。
命中(hit)
我們在訪問一個內(nèi)存地址的時候,先查看高速緩存里面有無該地址的數(shù)據(jù)。如果有就直接從高速緩存中讀取數(shù)據(jù),這個行為我們叫做hit,即緩存命中
未命中(miss)
如果高速緩存中沒有數(shù)據(jù),我們需要從內(nèi)存中讀取數(shù)據(jù),這個行為叫做miss。值得注意的是,我們一次讀取不是讀取一個內(nèi)存單元的數(shù)據(jù),而是讀取一個【cache行】的數(shù)據(jù),這意味著目標(biāo)地址及其附近區(qū)域的一些數(shù)據(jù)會被讀到高速緩存中,如果下次訪問鄰近的數(shù)據(jù),就不會miss。(cache容量一般為64字節(jié))
?
直接映像
假設(shè)有4個cache行,每行16字節(jié),那么主存中
0-15字節(jié)被映射到cache行1
16-31字節(jié)被映射到cache行2
32-47字節(jié)被映射到cache行3
48-63字節(jié)被映射到cache行4
64-79字節(jié)被映射到cache行1 這里循環(huán)往復(fù),以4個16字節(jié)為循環(huán)長度,上圖中不同顏色的連線表示了這種循環(huán)映射
我們對內(nèi)存中的地址,直接模除64(4*16=64),看結(jié)果,如果模除結(jié)果是在0-15,那么cache行1。
cache地址: 塊號 +塊內(nèi)地址
主存地址: 區(qū)號(按照組劃分)+ 塊號(按照塊劃分) +塊內(nèi)地址
例:設(shè)主存容量為1MB,高速緩存容量為16KB,塊的大小為512字節(jié)。采用直接地址映像法。
寫出主存地址格式。
寫出Cache地址格式。
塊表的容量是多大。
畫出直接方式地址映像及變換示意圖。
解:
Cache塊數(shù)=16KB/512B=32塊
則主存每區(qū)為32塊,共1MB/16KB=64區(qū)
所以主存地址為6位區(qū)號(共64區(qū))+5位區(qū)內(nèi)塊號(共32塊)+9位塊內(nèi)地址(塊容量512B,按字節(jié)編址)
所以Cache地址為5位區(qū)內(nèi)塊號,9內(nèi)塊內(nèi)地址(相當(dāng)于主存的一個區(qū))
自然的,塊表的容量為32*6位(表示Cache32個塊中分別存了第幾區(qū)的主存塊)
示例
假設(shè)每次訪問的都是映射到同一行的內(nèi)存塊,那么會不斷的miss,因為就一塊cache,大家一起用,互相覆蓋,造成miss率高
優(yōu)點是電路搭建簡單,成本低。缺點是miss率很高
全相聯(lián)映像
全連接映射顧名思義,誰都能映射。任意內(nèi)存塊,可以被映射到任意cache行。可以將cache看作一個list,只要list未滿,就載入最前的一個空cache行,直到cache滿,然后淘汰掉舊行,載入新行。
示例:
全連接映射hit率很高,因為大家公用所有cache,而不是像直接映射一樣大家共用一個cache行。缺點是硬件實現(xiàn)很復(fù)雜,成本非常高(有n個cache行,就要有n個地址的比較電路來判斷地址是否在行內(nèi))
多路組相聯(lián)映像
組映射將cache分組,一個cache組包含多個cache行,而內(nèi)存塊以直接映射的形式,先映射到對應(yīng)的組上,然后再以全連接映射的方式,再組內(nèi)尋找對應(yīng)到的cache行。
?
?
根據(jù)上面的圖:我們知道cache被分為了8組,每組又分為了2塊,右邊主存部分被分成了256個區(qū),每個區(qū)8塊,每個區(qū)的8塊與cache中的8組不是巧合,而是為了實現(xiàn)組間直接映射,然疑問來了,當(dāng)主存的某一塊按直接映射方式規(guī)則進(jìn)行映射后到了cache中相應(yīng)的組,而此時在cache中每組有兩塊,這時候就是實行組內(nèi)全映射。
前面我說過組相聯(lián)映射是直接映射和全相聯(lián)映射的一個折中形式,那么必然也就存在下面?zhèn)z種特殊的形式:
當(dāng)cache中每組內(nèi)的塊數(shù)變?yōu)?時,這就變成了直接映射;
當(dāng)cache中只有一組時,這就變成了全相聯(lián)映射。
組相聯(lián)映射相對應(yīng)的主存地址格式(和直接映射方式很像,只是塊號變成了組號):
優(yōu)缺點:綜合了上述兩種映射,暨能做到組間直接映射,又能做到組內(nèi)全連接映射,在成本和效率上有所折中,是折中的平衡方案。
下面以一道例題為例:
某計算機(jī)按字節(jié)尋址,主存有2K個塊,每塊32個字節(jié)。 Cache由64個塊組成,每組8塊(8路組相聯(lián))。請表示主存地址格式。給內(nèi)存地址為A21FH和C028H兩個地址對應(yīng)的標(biāo)記、組號和字號。
我的解法思路是:
字號:每塊32個字節(jié),即 32=2^5,故字號5位。
組號:Cache由64個塊組成,每組8塊,即64/8=8=2^3,故組號3位。
區(qū)號標(biāo)記:主存有2K個塊,又因為我們知道組間是直接映射(所以把cache中的組數(shù)看作直接映射中的塊),即2k/8=2^8,故區(qū)號8位。
所以,主存格式為:區(qū)號8位、組號3位、字號5位。
又A21FH=1010001000011111B
故對應(yīng)的標(biāo)記:10100010,組號:000,字號:11111
同理C028H=1100000000101000B
故對應(yīng)的標(biāo)記:11000000、組號:001、字號:01000
組相聯(lián)映射總結(jié):
優(yōu)點:塊的沖突概率比較低,塊的利用率大幅度提高;
缺點:實現(xiàn)難度和造價要比直接映射高。
————————————————
版權(quán)聲明:本文為CSDN博主「李昕羽」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_54494937/article/details/120843738
本文摘自 :https://www.cnblogs.com/