C語言實現LRU緩存(一)


LRU緩存概念

 

基本概念:緩存(Cache):Cache被稱為高速緩存,是介於CPU和內存之間的高速小容量存儲器,其容量遠小於內存,但速度卻可以接近CPU的頻率。

 

概念拓展:如今高速緩存的概念已被擴充,不僅在CPU和主內存之間有Cache,而且在內存和硬盤之間也有Cache(磁盤緩存),乃至在硬盤與網絡之間也有某種意義上的Cache──稱為Internet臨時文件夾或網絡內容緩存等。凡是位於速度相差較大的兩種硬件之間,用於協調兩者數據傳輸速度差異的結構,均可稱之為Cache。

 

工作原理:

當CPU發出內存訪問請求時,會先查看 Cache 內是否有請求數據。

如果存在(命中),則直接返回該數據

如果不存在(失效),再去訪問內存 —— 先把內存中的相應數據載入緩存,再將其返回處理器

 

提供“高速緩存”的目的是讓數據訪問的速度適應CPU的處理速度,通過減少訪問內存的次數來提高數據存取的速度。

 

Cache原理:

Cache 技術所依賴的原理是”程序執行與數據訪問的局部性原理“,這種局部性表現在兩個方面:

  1. 時間局部性:如果程序中的某條指令一旦執行,不久以后該指令可能再次執行,如果某數據被訪問過,不久以后該數據可能再次被訪問。
  2. 空間局部性:一旦程序訪問了某個存儲單元,在不久之后,其附近的存儲單元也將被訪問,即程序在一段時間內所訪問的地址,可能集中在一定的范圍之內,這是因為指令或數據通常是順序存放的。

 

時間局部性是通過將近來使用的指令和數據保存到Cache中實現。

空間局部性通常是使用較大的高速緩存,並將 預取機制 集成到高速緩存控制邏輯中來實現。

 

Cache替換策略

Cache的容量是有限的,當Cache的空間都被占滿后,如果再次發生緩存失效,就必須選擇一個緩存塊來替換掉。常用的替換策略有以下幾種:

隨機算法(Rand):隨機法是隨機地確定替換的存儲塊。設置一個隨機數產生器,依據所產生的隨機數,確定替換塊。這種方法簡單、易於實現,但命中率比較低。

 

  1. 先進先出算法(FIFO, First In First Out):先進先出法是選擇那個最先調入的那個塊進行替換。當最先調入並被多次命中的塊,很可能被優先替換,因而不符合局部性規律。這種方法的命中率比隨機法好些,但還不滿足要求。

 

  1. 最久未使用算法(LRU, Least Recently Used):LRU法是依據各塊使用的情況, 總是選擇那個最長時間未被使用的塊替換。這種方法比較好地反映了程序局部性規律。

 

  1. 最不經常使用算法(LFU, Least Frequently Used):將最近一段時期內,訪問次數最少的塊替換出Cache。

 

LRU緩存實現就是使用了雙向鏈表+hash思想。

 

 

TDD(測試驅動開發)

測試驅動開發,英文全稱Test-Driven Development,簡稱TDD,是一種不同於傳統軟件開發流程的新型的開發方法。它要求在編寫某個功能的代碼之前先編寫測試代碼,然后只編寫使測試通過的功能代碼,通過測試來推動整個開發的進行。這有助於編寫簡潔可用和高質量的代碼,並加速開發過程。

 

基本原理:

測試驅動開發的基本思想就是在開發功能代碼之前,先編寫測試代碼,然后只編寫使測試通過的功能代碼,從而以測試來驅動整個開發過程的進行。這有助於編寫簡潔可用和高質量的代碼,有很高的靈活性和健壯性,能快速響應變化,並加速開發過程。

 

測試驅動開發過程:

① 快速新增一個測試

② 運行所有的測試(有時候只需要運行一個或一部分),發現新增的測試不能通過

③ 做一些小小的改動,盡快地讓測試程序可運行,為此可以在程序中使用一些不合情理的方法

④ 運行所有的測試,並且全部通過

⑤ 重構代碼,以消除重復設計,優化設計結構

 

優勢:

1) TDD根據客戶需求編寫測試用例,對功能的過程和接口都進行了設計,而且這種從使用者角度對代碼進行的設計通常更符合后期開發的需求。因為關注用戶反饋,可以及時響應需求變更,同時因為從使用者角度出發的簡單設計,也可以更快地適應變化。

2) 出於易測試和測試獨立性的要求,將促使我們實現松耦合的設計,並更多地依賴於接口而非具體的類,提高系統的可擴展性和抗變性。而且TDD明顯地縮短了設計決策的反饋循環,使我們幾秒或幾分鍾之內就能獲得反饋。

3) 將測試工作提到編碼之前,並頻繁地運行所有測試,可以盡量地避免和盡早地發現錯誤,極大地降低了后續測試及修復的成本,提高了代碼的質量。在測試的保護下,不斷重構代碼,以消除重復設計,優化設計結構,提高了代碼的重用性,從而提高了軟件產品的質量。

4) TDD提供了持續的回歸測試,使我們擁有重構的勇氣,因為代碼的改動導致系統其他部分產生任何異常,測試都會立刻通知我們。完整的測試會幫助我們持續地跟蹤整個系統的狀態,因此我們就不需要擔心會產生什么不可預知的副作用了。

5) TDD所產生的單元測試代碼就是最比較好的開發者文檔,它們展示了所有的API該如何使用以及是如何運作的,而且它們與工作代碼保持同步,永遠是最新的。

6) TDD可以減輕壓力、降低憂慮、提高我們對代碼的信心、使我們擁有重構的勇氣,這些都是快樂工作的重要前提。

7)快速的提高了開發效率。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM