計算機組成與設計(十二)—— 儲存層次結構(二)
快取記憶體的原理
cpu和記憶體的速度差距越來越大,計算機的效能受到影響,而快取記憶體的出現挽救了這一局面。
為什麼在cpu和主存直接新增一個容量很小、速度更快的快取記憶體能增加計算機的效能呢?
程式的區域性性原理
這是一個經驗性結論:計算機程式從時間和空間都表現出區域性性。
時間區域性性(Temporal Locality):最近被訪問的儲存單元(指令或資料)很快會被訪問
例如:
for(int i = 0;i < 100;i++) for(int j = 0;j < 100;j++) sum += a[i][j];
其中的sum、判斷指令、加法指令、遞增指令都會馬上被訪問
空間區域性性(Spatial Locality):正在被訪問的儲存單元附近單元很快會被訪問
例如,a[i][j]的附近的元素很快會被訪問
Cache對區域性性的利用
Cache對空間區域性性的利用
- 從主存中取出待訪問的資料時,會同時取回相鄰位置的主存單元的資料
- 以資料塊為單位與主存進行資料交換
Cache對時間區域性性的利用
- 儲存最近被頻繁訪問的資料元素
Cache的訪問過程
具體是如何實現的呢?示例過程:
1、由於是16個位元組對齊,所以從2010H開始讀取資料。每個塊16個位元組,所以最低位剛好表示在塊中的索引,倒數第二位表示塊的索引。所以第一次是分配表項1,為命中,將標籤設為20H,有效位改為1
2、對應的表項已經有資料且不是當前資料,當前表項資料和標籤都要替換
3、未命中,將資料存到cache的表項三,並返回32H
4、對應的表項1有資料(有效位為1),且標籤也相同,命中,根據低位找到資料並放回
看完了讀操作,我們再來看cache的寫操作。
Cache的寫策略
cache命中時
- 寫穿透(Write Through):資料同時寫入cache和主存(這樣保證了cache和記憶體中始終保持一致)
- 寫返回(Write Back):資料只寫入cache,僅當該資料塊被替換時才將資料寫回記憶體
cahce失效時
- 寫不分配(Write Non-allocate):直接將資料寫入記憶體
- 寫分配(Write Allocate):將該資料所在的塊讀入cache後,再將資料寫入cache
寫分配需要將資料讀入cache中再寫入,看起來比寫不分配要慢,但是根據區域性性的原理,現在寫入的資料等下很可能要使用,提前寫入cache能使後面的訪存效能大大提升。
所以在現在cache的設計中,寫創投和寫不分配往往是配套使用的,用於那些對效能要求不高但設計簡單的系統,對效能要求較高的,通常使用寫返回和寫分配。
對於如何去查詢、替換cache中的表項,與讀操作是類似的
平均訪存時間
所以可以得到平均訪存時間的計算公式:
平均訪存時間(Average Memrory Access Time) = 命中時間(Hit time) + 缺失率(Miss Rate) x 缺失代價(Miss Penalty)
減少平均訪存時間的三個途徑:
- 降低Hit Time:要求cache的容量小一點,cache的結構簡單一點
- 減少Miss Penalty:提升主存的效能、再增加一層cache
- 降低Miss Rate:增大cache的容量
Cache的對映策略
直接對映
例如,如果有一個8表項的cache,直接對映的情形如圖:
相當於模8
特點:計算規則簡單,缺點是如果交替的訪問兩個資料a,b(差能整除8),將會一直miss
二路組相聯
如果跟剛才一樣,交替訪問a,b,a被放在第一行第一個位置,然後b被放在第一行第二個,之後在訪問a,b時都能hit。
如果是交替訪問a,b,c呢?二路組相連也不行了
在不增加cache總的容量的情況下,還可以進一步切分,比如四路組相聯
是不是可以無限切分下去呢?最多全部展開,像這裡的八路組相聯。記憶體當中任一個資料塊都可以放到這個Cache當中的任何一個行中, 而不用通過地址的特徵來約定固定放在哪一個行,那這樣結構的Cache就叫做全相聯的cache。
是不是組數越多越好呢?當然不是,組數越多,確定行之後要比較的標籤也會變增加。這樣降低了缺失率,卻增加了命中時間。且話又說回來,增加了路數,還不一定能夠降低失效率,還跟替換策略有關。
參考資料:https://www.bilibili.com/video/av12666021/?p=45