cache主存映射
- 一、三種映射方式
-
- 1. 全相聯映射
- 2. 直接映射
- 3. 組相聯映射
- 二、cache容量計算
-
- 1. 先計算cache行标記項位數
- 2. 再計算cache塊位數
- 3. 最後計算cache總容量
- 三、cache寫政策
-
- 1. 寫命中:
-
- (1)全寫法 Write Through
- (2)寫回法 Write Back
- 2. 寫不命中
-
- (1)寫配置設定法 Write Allocate
- (2)非寫配置設定法 Not Write Allocate
一、三種映射方式
假設計算機主存大小256MB,按位元組編址,資料cache有8行,行長64B。主存資料在cache裡應該怎麼存放?二者應該建立怎樣的對應關系?
【分析】行長即資料塊大小,主存和cache是以資料塊為機關進行資料交換的,是以主存塊大小 ≡ \equiv ≡cache塊大小
資料塊大小64B(26B),以位元組編址,占 6 位;
主存大小256MB(228B),以位元組編址,共占28位;
采用不同的映射方式,會對主存位址(28位)有不同的劃分方式:
1. 全相聯映射
cache的所有行均可用于存放主存任何一塊資料
(助記:空位子全都可以坐)
缺點:查找最慢,當cache塊裝滿的時候,可能需要周遊所有的cache行
主存位址結構劃分:
主存塊号 | 塊内位址 |
---|---|
22位 | 6位 |
查找政策:
假如通路位址為:1…1101 001110
- 用前22位依次與cache塊标記進行對比
- 如果标記比對且有效位為1,則cache命中,通路塊内位址為001110的單元
- 若cache不命中或有效位為0,則正常通路記憶體
2. 直接映射
每個主存塊隻能放到某個固定的cache行,每個主存塊所屬的cahe行是 主存塊号 % cache總行數
(助記:一家公司員工每天都是不假思索直接去自己所屬的公司)
缺點:是以多個塊會映射到同一行,這樣會産生不必要的換入換出,因為即使cache有空行,也不能利用。
(助記:公司有特定技能的人員需要,恰好目前團隊沒有這樣的人才,但是剛好公司人員已經飽和了,那麼就得有人先離開,新人再進來,這真是一個悲傷的故事)
針對上例,「0号,8号,16号……」主存塊被映射到0号cache行,「1号,9号,17号……」主存塊被映射到1号cache行,以此類推……
由于cache行總共8行(23),占 3 位;
而恰好主存塊号22位的後三位跟cache行号是一緻的,是以将主存塊号再拆分:
主存位址結構劃分:
主存塊号 | 塊内位址 |
---|---|
主存字塊标記(19位) + cache行号(3位) = 22位 | 6位 |
查找政策:
假如通路位址為:0…01000 001110
- 根據主存塊号後3位确定cache行号
- 如果主存塊号前19位與cache标記比對且有效位為1,則cache命中,通路塊内位址為001110的單元
- 若cache不命中或有效位為0,則正常通路記憶體
3. 組相聯映射
首先要對所有的cache行進行分組,每個主存塊隻能放到固定的cache組,每個主存塊所屬的cahe組是 主存塊号 % cache總組數
(壓軸出場的總是相對比較牛逼的,這種方式是上面兩種方式的結合,主存資料先找到自己對應的組,組内的空位随便放,這樣既提高了查找效率,又減少了因為沖突而導緻的換入換出次數)
仍然針對上例,以 2 路組相聯為例,cache行可被劃分為8/2=4組(22),占 2 位
「0号,4号,8号……」主存塊被映射到0号cache組,「1号,5号,9号……」主存塊被映射到1号cache行,以此類推……
而恰好主存塊号22位的後 2 位跟cache組号是一緻的,于是主存塊号就有了另外一種劃分方式:
主存位址結構劃分:
主存塊号 | 塊内位址 |
---|---|
主存字塊标記(20位) + cache組号(2位) = 22位 | 6位 |
查找政策:
假如通路位址為:1…0101 001110
- 根據主存塊号後2位确定cache組号
- 如果主存塊号前20位與cache分組内某行标記比對且有效位為1,則cache命中,通路塊内位址為001110的單元
- 若cache不命中或有效位為0,則正常通路記憶體
三種映射方式附圖:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2csMTR610as1GZop1MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL1czMxQDMxUTMwEjMxAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
二、cache容量計算
1. 先計算cache行标記項位數
所有的cache行都會對應一個标記項,用于标記目前cache行儲存的資料狀态,cache行标記項結構如下:
有效位 | 标記位 | 髒位 | 替換控制位 |
---|---|---|---|
1bit | 主存字塊标記 | 1bit | 與替換算法有關 |
* 有效位:(一定有)固定占 1 位,由于cache未裝進資料塊時,主存字塊标記預設為0,是以有效位是為了區分目前cache塊是沒裝資料還是裝了一個主存第0的資料
* 标記位:(一定有)主存字塊标記位數,用于辨別目前cache行存放的主存哪一行資料,計算方法見上
髒位:(特定條件下才有)也叫一緻性維護位,隻有當cache寫政策采用 寫回法 時,該位生效并且占 1 位
替換控制位: (特定條件下才有)或叫替換算法位,用于标記替換cache哪一行會被換出,在cache替換政策中,當采用LRU和LFU替換算法時,這個控制位會作為被換出的依據,見下圖
2. 再計算cache塊位數
題目中一般會以各種方式較為直覺的給出,cache塊大小和主存塊大小是一緻的,算出一個塊所占據的位數
資料位:由于主存塊和cache塊的交換是以 塊 為機關,是以資料位即就是一個資料塊的資料位數。
3. 最後計算cache總容量
根據cache總容量和cache塊大小求得cache行數,最後
c a c h e 總 容 量 = c a c h e 行 數 × ( c a c h e 行 标 記 項 位 數 + c a c h e 塊 位 數 ) cache總容量=cache行數\times(cache行标記項位數+cache塊位數) cache總容量=cache行數×(cache行标記項位數+cache塊位數)
【簡例】已知4K字cache,塊大小4個字,則:cache總1K行,cache行号占10位
又已知主存塊大小為4個字,每字32位,則資料塊總位數 32*4=128位
再根據塊大小4個字,按位元組編址,32*4/8=16 塊内位址占4位
主存位址32位,采用直接映射
主存字塊标記:32-10-4=18 為
1K *(1+1+18+128)= 1K *(20+128)= 148K
cache總容量 148K
三、cache寫政策
由于cache 中的資料塊是主存塊的副本,當對 Cache 中的内容進行變更時,就要考慮主存如何變更以及在什麼時機變更的問題~
寫操作也分為兩種情況:
寫命中(Write Hit):要寫的單元已經在 Cache 中
寫不命中(Write Miss):要寫的單元不在 Cache 中
1. 寫命中:
(1)全寫法 Write Through
(又名寫直達、直寫法、通過式寫)
同時修改 cache 和主存。需要頻繁寫主存,應用于資料準确率要求高,實時性高的場景。
(2)寫回法 Write Back
(又名寫回、回寫、一次性寫)
先修改 cache 暫不修改主存,當cache塊要被換出時(根據髒位判斷)一次性寫主存。應用于寫操作頻繁,寫密集型的場景。
2. 寫不命中
(1)寫配置設定法 Write Allocate
将主存塊調入 cache 中,然後更新相應的位址單元。這樣可以利用空間局部特性,但是每次都要先讀一個資料塊到 cache 塊,相對速度較慢
(2)非寫配置設定法 Not Write Allocate
直接修改主存資料塊裡的位址單元,不把主存調入 cache 中
通常,非寫配置設定法和全寫法搭配使用;寫配置設定法和寫回法搭配使用。
感謝你的認真閱讀,如果你覺得這篇文章對你有用,歡迎點贊和加關注。
如果你在計算機408的學習過程中還有難懂的問題,歡迎在評論區留言,我會在空閑時間挨個整理更新出來~