- 上次主要講了磁盤如何訪問,訪問時間分爲哪三部分,邏輯磁區號以及固態硬盤SSD。並引入了程序局部性原理、存儲器層次結構和緩存思想。
- 因爲存儲器相對CPU發展慢的多,所以計算機系統主要瓶頸是存儲器性能瓶頸。咱們經過創建存儲器層次結構的解決方法,運用緩存思想、程序局部性原理(包括時間局部性和空間局部性)解決了這一問題
- 下邊咱們討論緩存的工做機制和高速緩存案例
緩存中讀取數據的狀況
- 緩存工做機制:用小存儲區域作高速緩存,CPU請求數據時先通過第k層,看第k層有沒有這個數據,這層沒有,再到下層查詢。而後將數據塊從下層加載到上一層,此時若此層已滿,要犧牲此層的區域
命中(hit)
- 命中即在第k層裏有這個數據。值得一提的是,因爲空間局部性的存在(訪問此字節數據,其附近數據在未來可能被訪問),咱們在緩存數據時不是隻緩存如今須要的這部分,而是將這部分附近的都要緩存進來。所以咱們將存儲的數據分紅塊,每次緩存時將一整塊都緩存進來。
未命中(miss)
- 未命中即請求數據在緩存塊中沒有,這時咱們要一直往下層找,直到找到,而後把這一塊數據放到緩存裏,同時把請求的數據放處處理器中。這時就要考慮兩個問題了,一個是映射,即咱們把這塊數據放到上層存儲設備的哪一區域內;另外一個是替換,即若上層已經滿了,咱們要犧牲那塊原來的數據塊來替換他。
- 咱們先來看替換,替換的基本原則是將將來一段時間內那塊最不可能使用的換出去,咱們設計了兩種推理猜想算法
- LRU(rencently):將最後一次使用時間離如今最遠的丟掉。
- LFU(fluently):在緩存塊中放計數器,把使用次數最少的換出去。
- 瞎蒙:隨機丟出去一個
值得注意的是,咱們不推薦用人工智能、機器學習預測,這樣可能準確性會更高,可是因爲緩存須要短期完成,而機器算法一算就是半天,不符合實際。由此看出替換算法不能太過複雜算法
緩存未命中分爲三種狀況
冷未命中 |
第一次嘗試訪問時,必定沒有加載到緩存中,因此必定不會命中 |
衝突不命中 |
與替換策略有關,若有一種替換策略是第i列數據只能進入緩存的第i塊。先讓0進去,再讓8進去時就要把0換出來,0再進去時又得把8換出來。因爲緩存的儲存結構致使頻繁的換入換出 |
容量不命中 |
若是當前須要使用的熱區很是大或者程序空間局部性特徵很是差,會使頻繁訪問的塊超過緩存的存儲空間(緩存太小或者工做集過大) |
- 緩存不光存在於硬件中,軟件如瀏覽器一樣有緩存機制。第一次加載網頁圖片可能較慢,但不遠後的將來再次加載就會很快,由於瀏覽器已經將這些圖片存儲到磁盤上。
設計緩存中須要考慮的問題
- 緩存的數據其實是內存中的哪個位置的數據。cpu發的地址是內存地址,若要判斷是否在緩存中存在,須要有東西在緩存塊中記錄這一緩存塊的原始地址。
- 數據塊被緩存時,要緩存到緩存的哪一個緩存塊裏
- 寫入緩存時的數據同步問題。寫操做會改變數據,而在存儲體系中,一個數據可能有多個副本存在,咱們改數據時改動的是哪一個數據;若沒有全改,而致使產生數據不一致時,如何數據同步。對於數據同步策略,咱們一般加一個標誌位來表示數據是否被改動,若標誌位被置位,要考慮數據同步。髒數據標誌位,描述數據有沒有被改動。
高速緩存算法
- CPU芯片不僅包含處理器,處理器只是一部分,負責作最終指令運算。高速緩存也在CPU芯片中,處理器中出來的數據,首先通過高速緩存,請求現有緩存解決,若能解決就先在CPU芯片內部解決,不發送到CPU外。未命中的再發到CPU芯片外
- 值得注意的是,高速緩存的算法策略都是由硬件即電路來作,不是由軟件完成,所以很是快。
高速緩存的組織是一個二維結構,每一個塊是一個緩存的基本單位,假設有E個列,S個行,B是每一個塊能儲存多少字節,都是2的整數次冪。緩存容量=E * S*B瀏覽器
- 每一個塊除了存儲數據以外,還須要至少兩個字節表示一些信息。valid bit表示緩存塊是否緩存了數據;tag描述緩存塊與內存哪個區域創建了映射關係。
- 而CPU在請求數據發來地址時,會把這個地址拆爲組索引、塊內偏移量、tag三個部分。收到地址後,先根據組索引,肯定到緩存中哪一個組查找;而後把這一組中全部塊的tag與地址tag匹配,只有當valid bit爲1且tag能匹配上時,才表示這個塊命中;因爲請求的數據每每只是塊的一部分,還須要塊內偏移量決定從塊首偏移幾個字節;最後由地址指向的的數據類型決定讀取幾個字節,完成最終讀取。
- 值得注意的是,組索引s和塊內偏移量b位長都是S和B的二的整數冪的那個指數的位,這樣剛好能夠表示S和B中的每一個數
直接映射高速緩存
- 當E等於1,有S組,可是每組只有一個快,稱爲直接映射高速緩存。這樣由組索引能直接肯定塊,再比對此塊的tag和validbit 便可
直接映射高速緩存的替換策略比較簡單,這個進來那個出去;缺點是靈活性差,容易致使衝突未命中,致使性能降低緩存
組相連高速緩存
- 每組中有多個塊,衝突未命中獲得緩解,稱爲組相連高速緩存
- 在相同緩存大小的狀況下,增大E的值,每組中的塊多了,衝突未命中獲得緩解,提升性能;可是因爲總容量不變,B也不便,E越高,勢必致使分的組越少(S變少),甚至到到s=1,只有一組。
- S=1的高速緩存稱爲全相連高速緩存,靈活度最高,只有一組,全部內存地址映射都到這組,每一個塊能夠存儲內存中的任意塊。是最靈活的高速緩存,可是實現困難,須要全部塊的tag同時作匹配,並行度很是高,會帶來很是大的性能開銷,減慢速度。全相連高速緩存空間上利用最好,可是時間上利用更多。這裏又用到了trade-off來看待時間和空間,能夠說計算機作任何設計時採用的思想都是中庸之道,不須要性能或者利用率有一個作到最高,而是找一個平衡點
- 全相連高速緩存對於內存地址作解析時只須要分爲兩段,不須要組索引,由於只有一組