《深刻理解計算機系統》自學歷程(一)模擬高速緩存邏輯(上)

《深刻理解計算機系統》筆記git

1、首先複習一下

  存儲越大尋址時間越慢、效率越低,雖然相對來講每個數據計算機都會用到,但在某一階段、某一個特定時間,使用到的數據範圍是相對固定的緩存

  處理器須要更快速的處理速度,須要快速獲得指令和數據,而這些指令和數據都是存在低級的存儲中(硬盤等本地存儲或網絡存儲),單純拿硬盤來講,讀取時間就包括了傳輸時間、旋轉時間、尋道時間,效率過低。爲了更快速的讓處理器獲得數據,更好的利用處理器的性能,現代處理器演化出了分支預測的功能單元,可讓處理器在未執行到某一個分支以前就經過投機先行計算(不在本次範圍內)。另外,除了內部的文件寄存器,計算機將處理器和主存之間增長了多級緩存,用來存放處理器須要用到的指令和數據。所以,處理器在活動時能夠經過分支預測等技術同步的將後續將會使用到的指令和數據加載到緩存中(指令高速緩存/數據高速緩存),可讓整個處理器流水線的效率更高。網絡

  注:L0,L1,L2,L3級緩存的效率都是成百倍的下降,L4主存的效率相比L1更是天差地別。客觀條件相同的狀況下,存儲越大尋址速度越慢。雖說從材料上面來講也有不一樣,不僅僅是大小的問題,但材料方面不在本次討論範圍內。性能

2、緩存

  緩存是低層次存儲的緩存,或者說是對低層次緩存的「凝練和融合」(L1是L2的緩存,L2是L3的緩存)。經過創建一套規則和邏輯,咱們將低層次存儲中的數據根據須要讀取到高層次緩存中。spa

  本次說到的高速緩存的結構劃分爲如下幾個部分(概念)設計

  組  行  數據塊指針

  S   E    blockcode

  

  一個高速緩存的大小(C)就是 S*E*B(blockSize)  其中 B S 必須是2的N次冪blog

 2.1 爲何要這麼劃分?

  咱們須要一套機制,將內存地址與高速緩存的索引之間創建關係,上面說的方式就是其中一種。索引

  S表明了高速緩存的組數,E表明了每組中的行數,B表明每行中的數據塊大小,經過這S值和B值,咱們就能夠對內存地址進行掩碼處理,並獲得相應的組值和數據塊偏移。

       簡單分步驟的說:

    1)計算機中的信息是用二進制表示的。

    2)S組都是 2的N次冪,表明他們都是經過範圍的2進制位數表示的(若是S=5,那麼值就多是0,1,10,11,100,101;但三位二進數還有1十、111的值,就沒法用三位截取地址的方式來計算組索引了)

    3)B數據塊也是2的N次冪,緣由同S。

  因此 s = log2(S) 就是 組索引在地址中的位數,b = log2(B)就是數據塊偏移的位數。

  1000 1000 1000 1000

     t             s            b

 2.2 t是什麼?

  t表明標識,設想一下,既然是緩存,那麼就是將低級存儲進行緩存,大小必定是比低級存儲更小,因此速度更快。更小表明着較多的數據要使用較小的位置,也就是說多個地址的數據使用一個緩存位置來存數(覆蓋什麼規則後期再談),那麼久須要一個標識來表示這個緩存單元中的數究竟是哪一個內存的,不然讀取數據的時候都不知道該讀哪一個了。

  t的公式是  memAddrLength - b - s。就是說,去掉組索引位和數據塊偏移位,剩下的就是標識位了。

  

 2.3 結果呢,整體來講高速緩存到底什麼樣子?

  經過組和行咱們把高速緩存劃分紅了一個樹形結構,當須要讀取低級存儲的時候,先將地址根據t s b的規則進行拆分,經過s找到相應的組(組數*行數*高速緩存單元的大小),再經過標識找到對應的行,而後根據塊偏移把數據讀出來。總的來講就是這麼簡單。

  實際上呢還有很多細節的問題,好比若是不命中怎麼辦?若是命中的時候對應的高速緩存單元還沒熱身怎麼辦(沒讀取數據)?若是如今內存地址對應的組都已經寫滿了應該替換哪個? 等等,這些計算機如今都有相應的策略,感興趣的同窗能夠去看看書。

 

3.我要作什麼

  我準備用C語言本身寫一個高速緩存的機制試試,首先我沒有低級存儲(目前還不會硬件),低級存儲是用一個指針加一部份內存空間抽象的。而高速緩存也同樣,也在內存裏,用一個指針加一部份內存空間抽象的。寫這個的目的是爲了讓本身更好的理解高速緩存的原理。

  實現的功能是:

    1)實現高速緩存讀功能,能夠根據內存地址進行掩碼處理獲得對應的t s b值並從「高速緩存空間」中獲取到高速緩存單元。

    2)實現高速緩存的寫功能,如今計劃使用直寫的方式,即直接寫入到「低級存儲」中不根據高速緩存的寫狀態進行處理。

  

  目前進行了組件設計和活動圖設計,圖以下:

  1)組件圖:

  

 

   2)交互圖

3)讀活動圖

4)寫活動圖

 

 

 代碼後續會放到 git@code.aliyun.com:qdxiayongming/C.learn.git

 望有有經驗的朋友指正。

相關文章
相關標籤/搜索