主存的容量比Cache要大的多,因此咱們得采用多個主存塊映射到同一個Cache行中的方法,將要訪問的局部主存區域取到Cache中。映射方法有:直接映射,全相聯映射,組相鏈映射緩存
直接映射是最簡單粗暴的辦法:code
(塊地址)mod(cache中的塊數)
每一個存儲器地址僅僅對應到Cache中的一個位置。blog
第0,16,n*16塊由於mod16都爲0,因此他們對應到的Cache行號都爲0。索引
知道了映射方法,那麼如何規定主存地址呢?其實對於取模運算,咱們只須要去低位字節就能夠了。在十進制裏面若是對16取餘,那麼結果確定不會大於15,而且確定是兩位數之內。class
好比說Cache有16行,16是2的4次方,那麼咱們就能夠直接取主存塊號的低四位做爲Cache行號。二進制
但當咱們讀取某一個緩存行時,咱們怎麼知道他是0塊羣的仍是其餘塊羣的呢?其實正如主存塊號中包含了Cache行號同樣,其低四位以前的高位就能夠做爲區分的Tag(主存標記)使用。最後一點就是,CPU讀取數據只是要讀取它須要的字(Word)而已,那麼這個字具體是在Cache line的哪裏,咱們還須要一個偏移量來紀錄它。因此直接映射的主存地址應該由三部分組成:主存子塊標記,Cache子塊標記,子塊內地址。方法
如今咱們來本身動手作一作:假設數據在主存和Cache間的傳送單位爲512B,Cache大小爲2^13B,主存大小爲2^20B。im
由於主存大小爲2^20B,且以512B爲傳送單位。那麼2^20B=2048塊 * 512B/塊,主存能夠劃分爲2048塊,主存地址爲20位二進制數。由於咱們須要肯定要取的是塊中的哪一個字,又512=2^9,因此須要9位做爲偏移量,或者說塊內地址。 Cache能夠劃分出16行(2^13=16行 * 512B/行),也就是說劃出4位做爲行號標記,或者說Cache字塊地址。剩下的7位天然就做爲主存字塊標記啦。數據
優缺點:db
針對直接映射Cache空間利用率低的問題,咱們有一種簡單粗暴的辦法提高空間的利用率。那就是主存中的任意一塊均可以映射到Cache中的任意一個位置。有空位置你就坐下,隨意。
那麼咱們惟一要作的就是知道Cache中是對應主存中的哪一塊和字塊內地址就行。由於是隨便映射,因此咱們把直接映射中的Cache字塊標記合併到主存字塊標記中。
全相聯映射主存地址只有兩部分:主存字塊標記,字塊內地址。
優缺點:
綜合前兩種方法的就是組相聯映射,具體作法是:將Cache中的行分組,主存塊映射到固定的行中,但行中的位置能夠隨意。也就是組間直接映射,組內全相聯映射。
Cache組號=主存塊號 mod Cache組數
那麼問題來了怎麼肯定Cache中的字塊是對應主存的那一塊呢?首先咱們仍須要字塊內地址,須要區分組號,那麼剩下的地址就能夠做爲主存字塊標記使用。
好比說:容量爲64塊的Cache,採用組相聯方式映像,字塊大小爲128字,每4塊爲一組。若主存容量爲4096塊,且以字編址,那麼主存地址該如何劃分?
由於4096=2^19,因此主存地址應該爲19位,Cache總共有16組,因此須要4位肯定組號。又字塊大小爲128字,128=2^7,全部字塊內地址爲7位,剩下的19-7-4=8位做爲主存字塊標記。
優缺點: