高速緩存的原理
cpu和內存的速度差距愈來愈大,計算機的性能受到影響,而高速緩存的出現挽救了這一局面。緩存
爲何在cpu和主存直接添加一個容量很小、速度更快的高速緩存能增長計算機的性能呢?ide
程序的局部性原理
這是一個經驗性結論:計算機程序從時間和空間都表現出局部性。性能
時間局部性(Temporal Locality):最近被訪問的存儲單元(指令或數據)很快會被訪問spa
例如:設計
for(int i = 0;i < 100;i++) for(int j = 0;j < 100;j++) sum += a[i][j];
其中的sum、判斷指令、加法指令、遞增指令都會立刻被訪問3d
空間局部性(Spatial Locality):正在被訪問的存儲單元附近單元很快會被訪問code
例如,a[i][j]的附近的元素很快會被訪問blog
Cache對局部性的利用
Cache對空間局部性的利用
- 從主存中取出待訪問的數據時,會同時取回相鄰位置的主存單元的數據
- 以數據塊爲單位與主存進行數據交換
Cache對時間局部性的利用
- 保存最近被頻繁訪問的數據元素
Cache的訪問過程
具體是如何實現的呢?示例過程:索引
一、因爲是16個字節對齊,因此從2010H開始讀取數據。每一個塊16個字節,因此最低位恰好表示在塊中的索引,倒數第二位表示塊的索引。因此第一次是分配表項1,爲命中,將標籤設爲20H,有效位改成1內存
二、對應的表項已經有數據且不是當前數據,當前表項數據和標籤都要替換
三、未命中,將數據存到cache的表項三,並返回32H
四、對應的表項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。
是否是組數越多越好呢?固然不是,組數越多,肯定行以後要比較的標籤也會變增長。這樣下降了缺失率,卻增長了命中時間。且話又說回來,增長了路數,還不必定可以下降失效率,還跟替換策略有關。