主存到Cache直接映射、全相聯映射和組相聯映射


轉自:https://blog.csdn.net/dongyanxia1000/article/details/53392315

---- Cache的容量很小,它保存的內容只是主存內容的一個子集,且Cache與主存的數據交換是以塊(cache line)為單位的。為了把信息放到Cache中,必須應用某種函數把主存地址定位到Cache中,這稱為地址映射。

---- 在信息按這種映射關系裝入Cache后,CPU執行程序時,會將程序中的主存地址變換成Cache地址,這個變換過程叫做地址變換。

Cache的地址映射方式有直接映射、全相聯映射和組相聯映射。

假設某台計算機主存容量為1MB,被分為2048塊,每個Block為512B;Cache容量為8KB,被分為16塊,每塊也是512B。

下面以此為例介紹三種基本的地址映射方法。

1. 直接映射

---- 一個內存地址能被映射到的Cache line是固定的。就如每個人的停車位是固定分配好的,可以直接找到。缺點是:因為人多車位少,很可能幾個人爭用同一個車位,導致Cache淘汰換出頻繁,需要頻繁的從主存讀取數據到Cache,這個代價也較高。

直接映射的Cache組織如圖(1)所示。主存中的一個塊只能映射到Cache的某一特定塊中去。例如,

主存的第0塊、第16塊、第32塊、第48塊、……、第2032塊等128塊,只能映射到Cache的第0塊;

主存的第1塊、第17塊、第33塊、第49塊、……、第2033塊等128塊,只能映射到Cache的第1塊;

以此類推,主存的第15塊、第31塊、第47塊、……、第2047塊等128塊,只能映射到Cache的第15塊中。

映射完畢,Cache總共有0~15即16塊,主存中的每128(2048/16)塊,只能映射到Cache中的某一個塊中。

即映射規則為cache line index = (主存(Page)的line數)%(cache中 cache line的總數)

主存的line數是0~2047,cache中cache line的總數是16.

  

                                          圖(1)

直接映射是最簡單的地址映射方式,它的硬件簡單,成本低,地址變換速度快,而且不涉及替換算法問題。但是這種方式不夠靈活,Cache的存儲空間得不到充分利用,每個主存塊只有一個固定位置可存放,容易產生沖突,使Cache效率下降,因此只適合大容量Cache采用。例如,如果一個程序需要重復引用主存中第0塊與第16塊,最好將主存第0塊與第16塊同時復制到Cache中,但由於它們都只能復制到Cache的第0塊中去,即使Cache中別的存儲空間空着也不能占用,因此這兩個塊會不斷地交替裝入Cache中,導致命中率降低。

2. 全相聯映射

---- 主存中的一個地址可被映射進任意cache line,問題是:當尋找一個地址是否已經被cache時,需要遍歷每一個cache line來尋找,這個代價很高。就像停車位可以大家隨便停一樣,停的時候簡單,找車的時候需要一個一個停車位的找了。

圖(2)是全相聯映射的Cache組織,主存中任何一塊都可以映射到Cache中的任何一塊位置上。

 

  

                                         圖(2)

全相聯映射方式比較靈活,主存的各塊可以映射到Cache的任一塊中,Cache的利用率高,塊沖突概率低,只要淘汰Cache中的某一塊,即可調入主存的任一塊。但是,由於Cache比較電路的設計和實現比較困難,這種方式只適合於小容量Cache采用。

3. 組相聯映射

---- 組相聯映射實際上是直接映射和全相聯映射的折中方案,其組織結構如圖(3)所示。

主存和Cache都分組,主存中一個組內的塊數與Cache中的分組數相同,組間采用直接映射,組內采用全相聯映射。也就是說,將Cache分成2^u組,每組包含2^v塊,主存塊存放到哪個組是固定的,至於存到該組哪一塊則是靈活的。即主存的某塊只能映射到Cache的特定組中的任意一塊。主存的某塊b與Cache的組k之間滿足以下關系:k=b%(2^u).

例如,Cache分為8組(u=3),每組2塊(v=1),主存分為128個區,每個區16塊。

 

 

                                                  圖(3)

主存中的各塊與Cache的組號之間有固定的映射關系,但可自由映射到對應Cache組中的任何一塊。例如:

--主存的第0塊、第2^u塊、第2×(2^u)塊、…第255x(2^u)即255x8=2040塊等256塊均映射於Cache的第0組,但可映射到其中的第0塊或第1塊;

--主存的第1塊、第2^u+1塊、第3^(2^u)+1塊、…第255x(2^u+1)即2041塊等均映射於Cache的第2組,但可映射到Cache第2組中的任意一塊;

--主存的第2塊、第2^u+2塊、第(2^u)x2+2塊、…第2042塊等均映射於Cache的第3組,但可映射到Cache第3組中的任意一塊;

--主存的第7塊、第2^u+7塊、第2^(u+1)+7塊、…第2047塊等均映射於Cache的第8組,但可映射到Cache第8組中的第14塊或第15塊。

常采用的組相聯結構Cache,每組內有2、4、8、16塊,稱為2路、4路、8路、16路組相聯Cache。以上為2路組相聯Cache。組相聯結構Cache是前兩種方法的折中方案,適度兼顧二者的優點,盡量避免二者的缺點,因而得到普遍采用。

實例分析:

1.容量為64塊的Cache采用組相聯方式映像,字塊大小為128字節,每4塊為一組,若主容量為4096塊,且以字編址,那么主存地址為(19)位,主存區號為(6)位。

解:組相聯的地址構成為:區號+組號+塊號+塊內地址。

主存的每個分區/組大小與整個Cache大小相等,故此主存需要分的區數為:4096/64=64,因為26=64,因此需要6位來表示區號。每4塊為一組,故共有組數 64/4 = 16 ,因為24=16,因此需要4位表示組號。每組4塊,故表示塊號需要2位。

塊內地址共128字節,27=128,所以塊內地需要7位表示。所以:主存地址的位數=6+4+2+7 = 19

主存區號的位數=6

個人見解:Cache有u組,每組有v塊,即u = 16,v = 4,Cache大小:64塊×128B = 8KB。

主存大小:4096×128B = 2^12*2^7 = 2^19,即主存地址有19位。4096/64= 2^6主存區號為6位。

2.某 32 位計算機的 cache 容量為 16KB,cache 塊的大小為 16B,若主存與 cache 的地址映射采用直接映射方式,則主存地址為 1234E8F8(十六進制)的單元裝入的 cache 地址為__C__。

A. 00 0100 0100 1101 (二進制)
B. 01 0010 0011 0100 (二進制)
C. 10 1000 1111 1000 (二進制)
D. 11 0100 1110 1000 (二進制)

解:Cache大小為16KB,塊大小為16B,所以Cache被分成16KB/16B=1024塊,因210=1024故需要10位來表示塊數。

24=16故塊內地址需要4位來表示。所以Cache的地址線位置為14位。

由於采用直接映像的方式,所以主存的后14位就是要裝入的到Cache中的位置。故選 C.

個人見解:Cache的容量是16KB = 16×1024B = 16384B,主存的地址為0x1234E8F8/(16×1024B)= 18643. 該地址對應的是主存的第18643塊。

根據公式:cache的塊地址i = 主存的塊地址 % 16384 = 1234E8F8 - 1234C000 = 0x28F8 選C


免責聲明!

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



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