一、Cache - 主存的映射方式
全相聯映射:主存塊可以放在 Cache 的任意位置。
直接映射:每個主存塊只能放到一個特定的位置:
Cache塊號 = 主存塊號 % Cache總塊數
組相聯映射:Cache塊分為若幹組,每個主存塊可放到特定分組中的任意一個位置: 組號 = 主存塊號 % 分組數
(一)、全相聯映射(隨意放)
CPU 訪問主存地址 1…1101001110:
①主存地址的前22位🚌🫲,對比Cache中所有塊的標記;
②若標記匹配且有效位=1,則Cache命中🎹,訪問塊內地址為 001110 的單元🛳。
③若未命中或有效位 = 0,則正常訪問主存。
(二)、直接映射(只能放固定位置)
直接映射🏈,主存塊在Cache中的位置 = 主存塊號 % Cache總塊數🎏🛩。
若 Cache總塊數 = 2 n 2^n2n 則主存塊號末尾n位直接反映它在Cache 中的位置👲👂🏻。將主存塊號的其余位作為標記即可🆙。
此時主存地址為:
CPU 訪問主存地址 0…01000 001110 :
①根據主存塊號的後 3位確定Cache行 。
②若主存塊號的前 19 位與Cache標記匹配且有效位=1,則Cache命中,訪問塊內地址為 001110 的單元𓀎。
③若未命中或有效位=0♠️,則正常訪問主存。
(三)、組相聯映射(可放到特定分組)
n 路組相聯映射 —— n塊為一組
eg:2路組相聯映射——2塊為一組
組相聯映射,所屬分組 = 主存塊號 %分組數
CPU 訪問主存地址1…1101001110 👨🦰:
①根據主存塊號的後 2位確定所屬分組號💡。
②若主存塊號的前20位與分組內的某個標記匹配且有位=1💆🏼♂️, 則Cache命中🚏,訪問塊內地址為 001110的單元🤸🏻。
③若未命中或有效位=0,則正常訪問主存。
(四)Cache - 主存的映射方式總結
二、Cache 替換算法
前面介紹了 Cache 與主存的映射,說明了 Cache塊映射到主存塊的位置👰🏽♀️。但是未說明當 Cache 內存滿了時應該選擇哪個 Cache 進行替換,這當中涉及到 Cache 替換算法。
(一)、隨機算法(RAND)
隨機算法(RAND, Random)——若Cache已滿,則隨機選擇一塊替換。
隨機算法——實現簡單🧑🏿,但完全沒考慮局部性原理,命中率低,實際效果很不穩定。
(二)、先進先出算法(FIFO)
先進先出算法(FIFO, First In First Out)—— 若Cache已滿,則替換最先被調入Cache 的塊。
先進先出算法 —— 實現簡單🎆🍫,最開始按#0#1#2#3放入Cache👩🏽🦹🏽♂️,之後輪流替換 #0#1#2#3 。FIFO依然沒考慮局部性原理,最先被調入Cache的塊也有可能是被頻繁訪問的👶🛡。
(三)、近期最少使用算法(LRU)
近期最少使用算法(LRU, Least Recently Used )—— 為每一個Cache塊設置一個“計數器
”,用於記錄每個 Cache 塊已經有多久沒被訪問了⌚️。當 Cache 滿後替換“計數器”最大的🍣。
①命中時,所命中的行的計數器清零,比其低的計數器加1,其余不變👩;
②未命中且還有空閑行時🔌,新裝入的行的計數器置0⛹️♀️,其余非空閑行全加1🥄;
③未命中且無空閑行時🧖🏼♀️,計數值最大的行的信息塊被淘汰,新裝行的塊的計數器置0👱🏻♀️,其余全加1。
(四)、最不經常使用算法(LFU)
最不經常使用算法(LFU, Least Frequently Used )—— 為每一個Cache塊設置一個“計數器”🟡♚,用於記錄每個Cache塊被訪問過幾次。當Cache滿後替換“計數器”最小的。
新調入的塊計數器=0,之後每被訪問一次計數器+1。需要替換時,選擇計數器最小的一行。
(五)、Cache 替換算法的總結
三、Cache 寫策略
(一)、寫命中
1. 寫回法
寫回法(write-back) —— 當CPU對Cache寫命中時,只修改Cache的內容,而不立即寫入主存,只有當此塊被換出時才寫回主存👩🏿🔬。
減少了訪存次數🛖,但存在數據不一致的隱患✴️。
2. 全寫法
全寫法(寫直通法,write-through) —— 當CPU對Cache寫命中時,必須把數據同時寫入 Cache 和主存👨⚕️,一般使用寫緩沖(write buffer)。使用寫緩沖*️⃣,CPU寫的速度很快,若寫操作不頻繁,則效果很好。若寫操作很頻繁👌🏿,可能會因為寫緩沖飽和而發生阻塞。
訪存次數增加🤰🏿,速度變慢,但更能保證數據一致性。Cache塊被替換時無需寫回👱🏽。
(二)、寫不命中
1. 寫分配法
寫不命中時,把主存中的塊調入Cache🫳,在Cache中修改🦇。
搭配寫回法使用。
寫回法(write-back) —— 當CPU對Cache寫命中時,只修改Cache 的內容,而不立即寫入主存,只有當此塊被換出時才寫回主存💆🏻♀️。
2. 非寫分配法
非寫分配法(not-write-allocate)——當 CPU 對 Cache 寫不命中時只寫入主存🧒,不調入Cache👨🏿🦱。搭配全寫法使用。
全寫法(寫直通法,write-through) —— 當 CPU 對 Cache 寫命中時,必須把數據同時寫入Cache 和主存,一般使用寫緩沖(write buffer)。
(三)🤌、多級Cache
現代計算機常采用多級Cache🤷🏿♀️,離CPU越近的速度越快,容量越小⛎,離CPU越遠的速度越慢,容量越大🧙🏼♂️🗓。
(四)、Cache 寫策略的總結
鏈接:https://blog.csdn.net/weixin_43848614/article/details/126822596
作者:何為xl