計組-高速緩存

高速緩存

爲了減低成本,增長cpu訪問主存的性能,通常都會在主存與cpu之間增長小容量的緩存,能夠採用這種方式的一個很主要緣由就是程序執行的局部性。算法

程序的局部性

自我理解程序的局部性就是大多數時候程序都是按照代碼一行行的執行可能發生條件轉移指令可是程序跳轉的範圍也不是特別的大。下面來一個專業的解釋:在一段時間內,僅會執行程序的一部分,而在這段時間內要執行的指令和數據都放置在某個存儲區域內。數組

  1. 時間局部性緩存

    當程序訪問某個存儲位置的時候可能會屢次訪問該位置,好比熱點方法,循環中的代碼以及數據。數據結構

  2. 空間局部性併發

    當程序訪問了某個存儲單元,其附近的存儲單元也將被訪問,訪問主存中的數組,代碼,數據結構有較強的空間局部性。ide

緩存概覽

咱們增長了高速緩存以後但願cpu能夠直接在緩存中能夠直接取到數據這樣,cpu須要數據的時候確定先訪問緩存,咱們的緩存,咱們須要一種查找機制來判斷是否命中緩存(須要的內容在緩存中),沒有命中緩存稱之爲數據缺失,發生缺失的時候從主存拿到數據所須要的時間稱之爲缺失補償。通常緩存跟主存都被劃分爲以爲單位的固定大小數據塊,緩存跟主存交換數據的時候都是以塊爲單位,這樣數據缺失的時候相鄰的數據也被添加到了緩存之中,充分利用了空間局部性,提升了命中率。性能

塊過大會致使程序的時間局部性受到影響,好比a在塊blockA中b在BlockB中,可是這兩個塊放在緩存中相同位置(塊越大他倆在緩存之中放置相同位置的機率就越大,也跟置換規則有關),須要頻繁的訪問a,b就要發生頻繁的發生塊替換致使時間局部性受到影響。塊太小會影響程序的空間局部性。blog

進行數據分塊後,主存地址跟cache地址都可以分爲塊地址以及塊內偏移地址。他倆的偏移地址相同由於塊大小相同。索引

cache讀,寫流程

cache讀流程

當cpu拿到要訪問的地址之後首先訪問緩存若是數據在緩存中就直接返回數據到cpu。若是發生缺失,就要訪問主存當中相應的數據塊,若是此時緩存已經滿了或者要載入的位置有數據衝突則要發生塊替換。並更新查找表。內存

image-20210525000941225

cache寫流程

寫的流程相比讀流程要複雜一些,寫的時候首先在cache之中進行數據查找,若是發生缺失則要判斷是否爲寫分配策略或者不是寫分配策略,寫分配策略意味着要發生塊替換,不是寫分配策略則直接寫入數據到主存而且寫入流程結束(標識數據爲髒數據,cache塊數據跟主存數據不一致),採用寫分配策略以及發生命中的狀況下在將cache中的數據更該過之後,可使用寫回或者寫穿策略,寫穿策略就是直接將cache中修改的數據,在主存中也修改一遍,寫回策略就是要等到發生塊替換的時候再將數據塊上的更改一併寫入主存之中,爲了標識一個cache數據塊是否跟主存相應數據塊發生了變化咱們通常會使用一個bit的標識爲來標識cache塊來決定是否在塊替換的時候執行主存數據的更新.

image-20210525002629802

cache實現的關鍵技術

  • 數據查找

    怎樣快速判斷相應的主存地址是否在cache中

  • 地址映射

    主存中的數據塊是任意放置仍是按照必定規則

  • 替換策略

    cache滿的時候應該替換調哪一塊內存

  • 寫入策略

    如何保證cache與主存數據的一致性,寫回仍是寫穿策略

數據查找

數據查找通常使用相聯存儲器(CAM)進行查找,CAM根據要查找的Key併發查找。

地址映射

  1. 全相聯:主存塊映射到任意cache塊

  2. 直接相聯:各個主存塊只能夠映射都特定的主存塊

  3. 組相聯:主存塊能夠映射到cache固定組的任意位置

  4. 全相聯:
    因爲主存塊的數據能夠映射到cache的任意位置,因此只有當cache滿時纔會發生塊替換,這樣主存的利用率高,可是查找數據的時候比較滿,由於每一個cache行都要查看是否匹配。
    查找數據時直接並行比較全部cache行的主存地址,若是相同而且有效位爲1則代表查找的數據在cache當中。如果寫命中則將更改cache中的數據,而且髒數據位置爲1;若是是讀命中,就輸出cache行中offset處的數據。

特色:cache利用率高;cache衝突率低;查找的時候併發比較全部的行,硬件成本高適合小容量緩存。

  1. 直接相聯:

    將cache行標上序號(假設一共有n個cache行),主存塊號 對 n求餘 就是 該主存塊 能夠映射的cache行號,也就是說從主存頭部數據塊開始的n個數據塊,他們是不會發生cache衝突的,由於他們位於同一個。這樣咱們能夠將主存塊劃分一個區號區內行索引塊內偏移,這樣查找的適合能夠根據行號快速定位到cache行而後比較cache行的區號就行,查找更簡單。

特色:cache利用率低,發生cache衝突的概率較高,查找成本低,適合大容量存儲。

  1. 組相聯:

    組相聯算是上述兩個的結合物,首先將cache劃分位行數相同的不一樣的組,而後根據主存的前幾位對組的數量求餘,獲得的餘數就對應主存能夠放置的組號,接下來跟直接相聯不一樣的是它再也不根據主存地址肯定組內行號而是隨便放置,使用主存地址的中間幾位做爲標識肯定要找的目標cache行。

特色:cache利用率以及衝突發生概率都屬於中等水平

替換算法

  1. 先進先出算法(FIFO)

    要給每一個數據塊一個時間戳,或者時間計數。
    特色:沒有考慮程序訪問的局部性,命中率低

  2. 最不常用(LFU)

    給每一個數據塊一個初始值每次訪問就將該值+1,當要替換的時候將計數最小的丟棄。
    特色:只能夠反應歷史總訪問狀況,不能反映近期訪問狀況。

  3. 近期最少使用(LRU)

    當訪問命中的時候就將cache行對應的計數置爲0,其餘行的計數+1,替換的時候先替換值最大的cache行

    LRU在數據結構中的應用,並無採用給每一個元素一個計數的方式而是採用鏈表將各個元素穿起來,若是訪問了某個元素就將其放在鏈表的尾部或者頭部,替換的時候直接從鏈表的另外一端開始替換。

  4. 隨即替換

    隨機選取cache行進行替換,不用比較計數器,步驟簡單,並且快速,可是衝突的概率可能要大於LRU,以及LFU。

寫入策略

  1. 寫回法

    當寫命中的時候只修改cache行中的數據,不修改主存當中對應的數據,而是將cache的髒數據位置爲1,當該cache行要發生替換的時候再去同步主存的數據。會致使cache與主存的數據不一致,DMA操做可能會取到不是最新的數據。

  2. 寫穿法當寫命中的時候同時將cache行以及主存數據修改。缺點:cache對cpu的寫操做沒有緩衝功能。

相關文章
相關標籤/搜索