一、全相連映像
主存中任何一個塊均可以映像裝入到Cache中的任何一個塊的位置上。主存地址分為塊號和塊內地址兩部分,Cache地址也分為塊號和塊內地址。Cache的塊內地址部分直接取自主存地址的塊內地址段。主存塊號和Cache塊號不相同,Cache塊號根據主存塊號從塊表中查找。Cache保存的各數據塊互不相關,Cache必須對每個塊和塊自身的地址加以存儲。當請求數據時,Cache控制器要把請求地址同所有的地址加以比較,進行確認。
特點:靈活,塊沖突率低,只有在Cache中的塊全部裝滿后才會出現沖突,Cache利用率高。但地址變換機構復雜,地址變換速度慢,成本高。
公式:
主存地址位數=塊號+塊內地址;
Cache地址位數=塊號+塊內地址。
二、直接映像
把主存分成若干區,每區與Cache大小相同。區內分塊,主存每個區中塊的大小和Cache中塊的大小相等,主存中每個區包含的塊的個數與Cache中塊的個數相等。任意一個主存塊只能映像到Cache中唯一指定的塊中,即相同塊號的位置。主存地址分為三部分:區號、塊號和塊內地址,Cache地址分為:塊號和塊內地址。直接映像方式下,數據塊只能映像到Cache中唯一指定的位置,故不存在替換算法的問題。它不同於全相連Cache,地址僅需比較一次。
特點:地址變換簡單、速度快,可直接由主存地址提取出Cache地址。但不靈活,塊沖突率較高,Cache空間得不到充分利用。
公式:
主存地址位數=區號+區內分塊號+塊內地址;
Cache地址位數=塊號+塊內地址。
三、組相連映像
組相連映像是前兩種方式的折衷。主存按Cache容量分區,每個區分為若干組,每組包含若干塊。Cache也進行同樣的分組和分塊。主存中一個組內的塊數與Cache中一個組內的塊數相等。組間采用直接方式,組內采用全相連方式。組的容量=1時,即直接映像,組的容量=整個Cache的容量時,即全相連映像。Cache的存在對於程序員透明,Cache的地址變換和數據塊的替換算法都采用硬件實現。
公式:
主存地址位數=區號+組號+主存塊號+塊內地址;
Cache地址位數=組號+組內塊號+塊內地址。
四、主存地址和Cache地址的相關計算
&主存地址的位數A由主存容量N決定
A=log2N=區號位數+塊號位數+塊內地址位數
&Cache地址的位數B由Cache容量H決定
B=LOG2H=塊號位數+塊內地址位數
&區號根據Cache容量划分,區號長度=主存地址位數-Cache地址位數
&主存的塊號和Cache塊號的長度相同,位數K取決於Cache中能容納的個數
J,K=LOG2J
&主存的塊內地址和Cache的塊內地址長度相同,位數M取決於塊的容量 Q , M=LOG2Q
例題解析:
例一、容量為64塊的Cache采用組相聯方式映像,字塊大小為128字節,每4塊為一組,若主容量為4096塊,且以字編址,那么主存地址為多少位,主存區號為多少位?
方法一:
分區數=主存容量/Cache容量=4096/64=64;
區內分組數=64/4=16;
組內分塊數=4塊/組;
塊內地址=128字節;
所以根據公式:
主存地址位數=6+4+2+7=19;
主存區號=6位;
方法二:
主存地址的位數A由主存容量N決定:
A=log2N=區號位數+塊號位數+塊內地址位數
所以:
A=LOG2N=LOG2(4096*128)=LOG2(2^12*2^7)=LOG2(2^19)=19;
&Cache地址的位數B由Cache容量H決定
B=LOG2H=塊號位數+塊內地址位數
所以:
B=LOG2(64*128)=13.
區號的計算方法同上!
方法三:
主存地址=主存塊地址+塊內地址=12+7=19;
主存區號地址=主存塊地址-Cache塊地址=12-6=6.
例二、一個具有4KB直接相聯cache的32位微處理器,主存的容量為16MB,假定該cache的塊為4個32位的字。
(1)指出主存地址中區號、塊號和塊內地址的位數;
(2)求主存地址為ABCDEF(16進制)的單元在cache中的什么位置?
分析:
Cache容量:4KB
主存 容量 :16MB
映像方式 :直接映像;
把主存分成若干區,每區與Cache大小相同。區內分塊,主存每個區中塊的大小和Cache中塊的大小相等,主存中每個區包含的塊的個數與Cache中塊的個數相等。任意一個主存塊只能映像到Cache中唯一指定的塊中,即相同塊號的位置。主存地址分為三部分:區號、塊號和塊內地址,Cache地址分為:塊號和塊內地址。
主存地址位數=區號+區內分塊號+塊內地址;
Cache地址位數=塊號+塊內地址。
主存的區號:16M/4KB=2^12=12位;
主存塊號 :4KB/(4*32bit)=2^8=8位;
塊內地址 :4*32bit =16Byte=4個字(因為一個字為32bit)=2^2字=2位;
1)
主存容量為16MB=2^24個字節,1個32位字是由4個字節組成,所以主存字地址為22位.
CACHE容量為4KB=2^12個字節,同理,CACHE字地址為10位.
CACHE的塊為4個32位的字,所以塊內地址為2位
在直接映象中:
CACHE地址位=塊號位數+塊內地址位數==>塊號位數=CACHE地址位-塊風地址位=10-2=8
主存地址中的區號=主存地址位數-CACHE地址位數=22-10=12位
(2)
ABCDEF=1010 1011 1100 1101 1110 1111
該存儲單元在CACHE的位址為:
區號=1010 1011 1100 塊號=1101 1110 塊內地址=1111
在cache中的位置:塊號1101 1110 塊內地址1111
數據的存儲一般以"字"為單位進行。
但在計算機里我們保留對字節的尋址和編碼,不管是16位,還是32位,還是64位微處理器.象第二小題主存地址為ABCDEF(16進制)這是一個24位地址碼,而主存字地址為22位. 計算機只會按字進行操作,即它的傳輸運算,包括直接相連cache映象。 所以我們只管字,不管字節。
ABCDEF=1010 1011 1100 1101 1110 1111
在cache中的位置:塊號1101 1110 塊內地址11
注:后兩位為字節尋址,這里不用了。(ABCDEC,ABCDED,ABCDEE,ABCDEF這四個字節地址為同一字地址)在同一個CACHE塊內地址。