天天看點

計組——徹底搞懂cache主存映射cache容量及cache寫政策一、三種映射方式二、cache容量計算三、cache寫政策

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

  1. 用前22位依次與cache塊标記進行對比
  2. 如果标記比對且有效位為1,則cache命中,通路塊内位址為001110的單元
  3. 若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

  1. 根據主存塊号後3位确定cache行号
  2. 如果主存塊号前19位與cache标記比對且有效位為1,則cache命中,通路塊内位址為001110的單元
  3. 若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

  1. 根據主存塊号後2位确定cache組号
  2. 如果主存塊号前20位與cache分組内某行标記比對且有效位為1,則cache命中,通路塊内位址為001110的單元
  3. 若cache不命中或有效位為0,則正常通路記憶體

三種映射方式附圖:

計組——徹底搞懂cache主存映射cache容量及cache寫政策一、三種映射方式二、cache容量計算三、cache寫政策

二、cache容量計算

1. 先計算cache行标記項位數

所有的cache行都會對應一個标記項,用于标記目前cache行儲存的資料狀态,cache行标記項結構如下:

有效位 标記位 髒位 替換控制位
1bit 主存字塊标記 1bit 與替換算法有關

* 有效位:(一定有)固定占 1 位,由于cache未裝進資料塊時,主存字塊标記預設為0,是以有效位是為了區分目前cache塊是沒裝資料還是裝了一個主存第0的資料

* 标記位:(一定有)主存字塊标記位數,用于辨別目前cache行存放的主存哪一行資料,計算方法見上

髒位:(特定條件下才有)也叫一緻性維護位,隻有當cache寫政策采用 寫回法 時,該位生效并且占 1 位

替換控制位: (特定條件下才有)或叫替換算法位,用于标記替換cache哪一行會被換出,在cache替換政策中,當采用LRU和LFU替換算法時,這個控制位會作為被換出的依據,見下圖

計組——徹底搞懂cache主存映射cache容量及cache寫政策一、三種映射方式二、cache容量計算三、cache寫政策

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的學習過程中還有難懂的問題,歡迎在評論區留言,我會在空閑時間挨個整理更新出來~