Cache地址映射與計算方式


什么是Cache地址映射

主存的容量比Cache要大的多,所以我們得采用多個主存塊映射到同一個Cache行中的方法,將要訪問的局部主存區域取到Cache中。映射方法有:直接映射,全相聯映射,組相鏈映射

直接映射

直接映射是最簡單粗暴的辦法:

(塊地址)mod(cache中的塊數)

一個內存塊地址始終映射到一個固定的Cache 地址。下圖中主存被分為了0-2047個內存塊,緩存塊或者說cache line有16塊。

那么第0,16,n*16塊因為mod16都為0,所以他們對應到的Cache行號都為0。

如果我們要訪問第16號內存塊(內存塊從0開始計數的),只要它在緩存塊里面,那么它必定是在0號緩存塊,也就是行號為0.

Cache直接映射

知道了映射方法,那么如何規定主存地址呢?其實對於取模運算,我們只需要取低位字節就可以了。

在十進制里面如果對16取余,那么結果定是兩位數以內,並且不會大於15。

比如說Cache有16行,16是2的4次方,那么我們就可以直接取主存塊號的低四位作為Cache行號。

Cache索引

17對應的cache行號就是1.

但當我們讀取某一個緩存行時,我們怎么知道他是0塊群的還是其他塊群的呢?

其實正如主存塊號中包含了Cache行號一樣,其低四位之前的高位就可以作為區分的Tag(主存標記)使用。最后一點就是,CPU讀取數據只是要讀取它需要的字(Word)而已,那么這個字具體是在Cache line的哪里,我們還需要一個偏移量來紀錄它。

所以直接映射的主存地址應該由三部分組成:主存子塊標記,Cache子塊標記,字塊內地址。

直接映射主存格式

現在我們來自己動手做一做:假設數據在主存和Cache間的傳送單位為512B,Cache大小為213B,主存大小為220B。

因為主存大小為220B,且以512B為傳送單位。那么220B=2048塊 * 512B/塊,主存可以划分為2048塊,主存地址為20位二進制數。因為我們需要確定要取的是塊中的哪個字,又512=2^9,所以需要9位作為偏移量,或者說字塊內地址。 Cache可以划分出16行(2^13=16行 * 512B/行),也就是說划出4位作為行號標記,或者說Cache字塊地址。剩下的7位自然就作為主存字塊標記啦。

直接映射例題

優缺點:

  • 電路實現簡單,命中時間短
  • 無需考慮替換問題
  • Cache的存儲空間沒有得到充分使用,命中率低

全相聯映射

針對直接映射Cache空間利用率低的問題,我們有一種簡單粗暴的辦法提升空間的利用率。那就是主存中的任意一塊都可以映射到Cache中的任意一個位置。有空位置你就坐下,隨意,映射位置不在固定。

全相聯映射

那么我們唯一要做的就是知道Cache中是對應主存中的哪一塊和字塊內地址就行。因為是隨便映射,所以我們把直接映射中的Cache字塊標記合並到主存字塊標記中。

全相聯映射主存地址只有兩部分:主存字塊標記,字塊內地址。

優缺點:

  • 不存在沖突缺失,命中率高
  • 電路復雜,速度慢

組相聯映射

綜合前兩種方法的就是組相聯映射,具體做法是:將Cache中的行分組,主存塊映射到固定的行中,但行中的位置可以隨意。也就是組間直接映射,組內全相聯映射。

Cache組號=主存塊號 mod Cache組數

組相聯映射

那么問題來了怎么確定Cache中的字塊是對應主存的那一塊呢?首先我們仍需要字塊內地址,需要區分組號,那么剩下的地址就可以作為主存字塊標記使用。

容量為64塊的Cache,采用組相聯方式映像,字塊大小為128字,每4塊為一組。若主存容量為4096塊,且以字編址,那么主存地址該如何划分?

因為4096=219,所以主存地址應該為19位,Cache總共有16組,所以需要4位確定組號。又字塊大小為128字,128=27,所有字塊內地址為7位,剩下的19-7-4=8位作為主存字塊標記。

組相聯例題

優缺點:

  • 電路較簡單,速度較快,命中率較高,屬於比較理想的方式


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM