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