---- 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. 全相聯對映
就像停車位可以大家隨便停一樣,停的時候簡單,找車的時候需要乙個乙個停車位的找了。
圖(2)是全相聯對映的cache組織,主存中任何一塊都可以對映到cache中的任何一塊位置上。
圖(2)
全相聯對映方式比較靈活,主存的各塊可以對映到cache的任一塊中,cache的利用率高,塊衝突概率低,只要淘汰cache中的某一塊,即可調入主存的任一塊。
但是,由於cache比較電路的設計和實現比較困難,這種方式只適合於小容量cache採用。
需要儲存tag來區分,tag可以理解為主存塊的index,方便查詢。
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塊。
下面這個圖中間部分總共16塊,0~15,是從主存中取了和cache同樣大小的,16塊分為2組,0~7塊是第1組,8~15塊是第2組。
即將乙個區分為了2組;塊0對映到cache中的組1,塊1對映組1,以此類推,塊7對映組7;但是可以是組中的任一塊。
圖(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是前兩種方法的折中方案,適度兼顧二者的優點,盡量避免二者的缺點,因而得到普遍採用。
更正一下:有人說這個cache的組畫的不對,是cache分了2組,應該是組1和組2,組1裡有0-7,組2是8-15,和中間的那個一樣。
這麼畫是為了便於理解,把2路體現在了中間部分,而把可以放同乙個塊的放到了一組,看個人理解,但是對映的關係都是一樣的。
至於塊0和塊1在一組不太合邏輯,更正為下面的圖,有問題請指正。
例項分析:
1.容量為64塊的cache採用組相聯方式映像,字塊大小為128位元組,每4塊為一組,若主容量為4096塊,且以字編址,那麼主存位址為(19)位,主存區號為(6)位。
主存的每個分割槽/組大小與整個cache大小相等,故此主存需要分的區數為:4096/64=64,因為26=64,因此需要6位來表示區號。每4塊為一組,故共有組數 64/4 = 16 ,因為24=16,因此需要4位表示組號。每組4塊,故表示塊號需要2位。
主存區號的位數=6
個人見解:cache有u組,每組有v塊,即u = 16,v = 4,cache大小:64塊×128b =8kb。
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直接對映 全相聯對映和組相聯對映
cache的容量很小,它儲存的內容只是主存內容的乙個子集,且cache與主存的資料交換是以塊為單位的。為了把資訊放到cache中,必須應用某種函式把主存位址定位到cache中,這稱為位址對映。在資訊按這種對映關係裝入cache後,cpu執行程式時,會將程式中的主存位址變換成cache位址,這個變換過...
主存cache的位址對映
cpu對儲存器的訪問,通常是一次讀寫乙個字單元。當 cpu訪 cache 不命中時,需將儲存在主存中的字單元連同其後若干個字一同調入 cache 中,之所以這樣做,是為了使其後的訪存能在 cache 中命中。因此,主存和 cache 之間一次交換的資料單位應該是乙個資料塊。資料塊的大小是固定的,由若...
Cache和主存位址對映關係
cache的位址映像方式中,發生塊衝突次數最小的是 a 全相聯映像 b 組相聯映像 c 直接映像 d 無法確定的 全相聯映像塊衝突最小,其次為組相聯映像,直接映像塊衝突最大。容量為64塊的cache採用組相聯方式映像,字塊大小為128位元組,每4塊為一組,若主容量為4096塊,且以字編址,那麼主存位...