編寫緩存友好代碼

  • 上篇文章講了高速緩存,高速緩存位於CPU內部,處理器進出的數據都要先通過高速緩存,不命中的再到外邊處理,即高速緩存會攔截處理器所有請求。
  • 值得注意的是,高速緩存是透明的,即雖然有這樣機制存在,可是上層應用程序徹底感覺不到緩存的攔截、處理操做
  • cash結構以二維陣列形式存儲,包含SEB三個參數,S是組的數量,E每組塊的數量,B是每塊儲存的字節。S/E/B都是2的整數次冪
  • 每一塊包括v,b部分,這裏要注意v不算在B裏邊。映射的基本思路是將處理器給出的地址劃分紅三段。b塊內偏移量,s組索引,t與tag作匹配,再根據請求指令的數據寬度讀數據
緩存類型 內容 優點 劣勢
直接映射高速緩存 E=1,每組只有一個塊 結構簡單,實現速度快 組中只有一個緩存塊,易產生衝突不命中,致使緩存性能降低
組相連高速緩存 E>1,每組包含多個塊,是最經常使用的電路緩存結構,又稱爲E路組相連高速緩存 兼顧了靈活性和實現速度
全相連高速緩存 S=1,只有一組。只要把地址分爲塊偏移量和tag兩部分,不須要組索引 靈活性高,數據能夠緩存到任意指令塊 結構複雜,實現速度慢

寫策略

高速緩存的讀操做簡單,不涉及數據變化;而寫策略會致使數據出現不一致問題,爲什麼?

在存儲層次中,一份數據有可能在不一樣層次上有多份拷貝。緩存

從命中和未命中兩種狀況討論寫策略

命中包括直寫和回寫
  • 直寫:一次性把全部路徑上要修改的數據全修改掉。是從悲觀角度考慮,即認爲只要有數據不一致的狀況,就可能致使出現錯誤。如插U盤沒有彈出直接拔出,編寫文檔斷電再次開機出現恢復文檔,就是因爲沒有采用直寫策略。可是這種策略要將數據所有修改,所以只在可靠性要求較高的狀況下使用直寫操做,從而避免某個時間段出現數據不一致的狀況
  • 回寫:命中後只把命中的緩存部分改掉,下邊的暫且不關心;當修改的數據塊被替換時,再向下一級緩存替換數據。使用dirty標誌位表示數據在緩存過程當中是否被修改過。當此緩存塊被替換時,檢查是否被置位,若被置位則更新到下一級緩存中,以此類推,一次次更新。回寫方式效率高,可是短期內數據可能不一致。在系統斷電或特殊狀況可能致使數據差別,即原本應該更新可是卻沒變。處理器中高速緩存主要採起回寫策略,目的是提升性能
寫不命中寫分配和寫非分配
  • 寫分配:寫入數據時,寫入數據不在緩存中,則先加入緩存中。即寫分配會致使緩存的更新
  • 寫非分配:未命中就一次修改到內存中,直接改,不會致使緩存更新
整體
  • 緩存的寫策略理論上有四種,可是真正使用中只用兩種。直寫策略和非寫分配策略都是悲觀策略,都要更新到最底層,通常捆綁使用;寫分配和回寫是樂觀策略,注重效率,通常捆綁使用。高速緩存主要採起回寫+寫分配

緩存的進一步理解

  • Intel處理器的i7高速緩存處理器有四個核,每一個核都有寄存器,寄存器下邊是一級緩存(包括數據緩存和指令緩存),一級緩存中指令和數據是分開存儲的。值得注意的是,在馮諾依曼體系結構中數據和指令同時存儲,比較簡單;而哈佛結構中指令和體系分開存儲,有分別的處理器。所以咱們能夠看到,現代計算機中,哈弗結構不是消失了,而是和馮諾依曼結構作了進一步融合。即微觀上是哈佛結構,把指令和數據分開存儲了。一級緩存下是二級緩存,多個二級緩存共用一個三級緩存,而後纔是內存
緩存對性能十分重要,那麼咱們如何評價緩存性能呢?
  • 緩存性能主要由未命中率、命中時間和未命中懲罰三者決定。
  • 未命中率是統計學上的概念,一級高速緩存容量較小,未命中率爲3~10%偏高;二級高速緩存容量變大,未命中率小於1%。一般,緩存容量越大,未命中率越低,可是成本越高
  • 命中時間:訪問高速緩存命中時,從裏邊取數據須要的時間。一級緩存:1~2時鐘週期;二級:5~20個時鐘週期
  • 未命中懲罰:訪問緩存未命中時,須要花費多少時間從下層緩存取數據,即緩存未命中須要的額外時間。假設計算機只有一級高速緩存,此時未命中會直接訪問內存(50~200個時鐘週期)
  • 如何計算緩存系統性能:經過平均訪問時間來看=命中時間乘命中率+未命中懲罰乘未命中率。因爲一級緩存的性能大約是內存的100倍,未命中懲罰過高,主要由命中率決定。(極小的命中率差別就能致使極大的性能差距)QQ圖片20200506213127.png
相關文章
相關標籤/搜索