cache的工作原理


在CPU的所有操作中,訪問內存是最頻繁的操作。由於一般微機中的主存儲器主要由MOS型動態RAM構成,其工作速度比CPU低一個數量級,加上CPU的所有訪問都要通過總線這個瓶頸,所以,縮短存儲器的訪問時間是提高計算機速度的關鍵。采用在CPU和內存之間加進高速緩沖存儲器cache的辦法較好地解決了這一問題。所謂“cache”原意是指勘探人員的藏物處,這里引申為“高速緩存”。在保證系統性能價格比的前提下,使用速度與CPU相當的SRAM芯片組成小容量的高速緩存器,使用低價格、小體積能提供更大存儲空間的DRAM芯片(或內存條)組成主存儲器。


  下面,以取指為例對cache的工作原理進行說明。命中率是高速緩存子系統操作有效性的一種測度,它被定義為高速緩存命中次數與存儲器訪問總次數之比,用百分率來表示,即


例如,若高速緩存的命中率為92%,則意味着CPU可用92%的總線周期從高速緩存中讀取數據。換句話說,僅有8%的存儲器訪問是對主存儲器子系統進行的。假設經過前面的操作cache中已保存了一個指令序列,當CPU按地址再次取指時,cache控制器會先分析地址,看其是否已在cache中,若在,則立即取來,否則,再去訪問內存。因為大多數程序有一個共同特點,即在第一次訪問了某個存儲區域后,還要重復訪問這個區域。CPU第一次訪問低速DRAM時,要插入等待周期。當CPU進行第一次訪問時,也把數據存到高速緩存區。因此,當CPU再訪問這一區域時,CPU就可以直接訪問高速緩存區,而不訪問低速主存儲器。因為高速緩存器容量遠小於低速大容量主存儲器,所以它不可能包含后者的所有信息。當高速緩存區內容已裝滿時,需要存儲新的低速主存儲器位置上的內容,以代替舊位置上的內容。高速緩存器的設計目標是使CPU訪問盡可能在高速緩存器中進行,其工作原理如圖5.25所示。

這里講述的讀/寫策略依然是針對CPU對存儲器的讀/寫訪問的,即cache讀操作實際上是CPU讀存儲器,cache寫操作實際上是CPU寫存儲器。在cache中應盡量存放CPU最近一直在使用的數據。當cache裝滿后,可將長期不用的數據刪除,以提高cache的使用效率。為保持cache中的數據與主存儲器中的數據的一致性,同時避免CPU在讀/寫過程中遺失新數據,確保cache中更新過的數據不會因覆蓋而消失,必須將cache中的數據及時更新並准確地反映到主存儲器。這里涉及CPU、cache與主存儲器三者之間的協調,使得讀/寫操作復雜化,從而也引入了一些新的方法與專業術語。

 

1.讀策略

讀策略又可分為以下兩種。


(1)貫穿讀出式(look through)


貫穿讀出式的原理如圖5.26所示。


  在這種方式下,cache位於CPU與主存之間,CPU對主存的所有數據請求都首先送到cache,由cache在自身查找。如果命中,則切斷CPU對主存的請求,並將數據送出;如果未命中,則將數據請求傳給主存。該方法的優點是降低了CPU對主存的請求次數,缺點是延遲了CPU對主存的訪問時間。


(2)旁路讀出式(look aside)


  旁路讀出式的原理如圖5.27所示。


  在這種方式中,CPU發出數據請求,並不是單通道地穿過cache,而是向cache和主存同時發出請求。由於cache速度更快,如果命中,則cache在將數據回送給CPU的同時,還來得及中斷CPU對主存的請求;若未命中,則cache不做任何動作,由CPU直接訪問主存。它的優點是沒有時間延遲,缺點是每次CPU都要訪問主存,這樣就占用了部分總線時間。

 

還有另外一個值得注意的概念,那就是“行填充”。


  每當CPU由主存儲器讀入數據時,同時還要將該數據復制到cache中。即使當前CPU僅讀一個字節,cache控制器也總是要將主存儲器中包含該字節的一個完整的cache行復制到cache中。一個cache行占據32個字節,這種從主存儲器向cache傳送一行數據的操作就稱為cache行填充(line fill),這是考慮到數據與代碼往往具有連續性,CPU下一次所需的數據或代碼通常還是處在上一次的數據或代碼附近,即同處一cache行中的可能性最大,這樣處理就提高了cache的命中率。由此可見,cache中的數據是由空到滿逐行建立起來的。


  cache行的容量過小時,會產生頻繁的行填充操作,整機效率不會有明顯提高。然而當一行的容量空間過大時,填充一行所需的時間較長,而且可能有許多數據並不是CPU最近所需要的,從而造成過大的浪費,這樣也不會使整機效率顯著上升。因此必須折中各種因素來選擇cache行的大小。Intel體系的32位微處理器中一個cache行由32個字節組成,並且cache控制器用后面即將討論的突發模式傳送數據塊,一次突發傳送一個cache行的32個字節,其傳輸速率比常規訪問幾乎高出一倍。


  就cache整體容量而言,也有同cache行類似的矛盾。cache容量過小將起不到明顯改善系統性能的效果;增加cache容量自然可以存儲更多的信息,但隨之也就增加了成本,且搜索大容量的cache還不如搜索小容量的速度快。可見,cache的容量要兼顧多種因素,選擇適中,一般取主存儲器的幾十分之一或者幾百分之一。


  每當CPU所需的數據或代碼不在cache中而出現未命中時,cache控制器就必須在主存儲器中讀取數據,這段時間較長且需要等待。此時,cache控制器使“准備好”或類似的信號變為無效,於是CPU插入等待時鍾周期,cache控制器將訪問主存儲器,將所需數據傳送給CPU。

 

2.替換策略

  當cache已經裝滿后,主存儲器中新的數據還要不斷地替換掉cache中過時的數據,這就產生了cache塊數據的替換策略。那么應替換哪些cache塊才能提高命中率呢?理想的替換策略應該使得cache中總是保存着最近將要使用的數據,不用的數據則被替換掉,這樣才能保證很高的命中率。目前,使用較多的是隨機(random)替換、先入先出(FIFO)替換與近期最少使用(LRU)替換三種策略。


(1)隨機(random)替換策略


  隨機替換是不顧cache塊過去、現在及將來使用的情況而隨機地選擇某塊進行替換,這是一種最簡單的方法。


(2)先入先出(FIFO)替換策略


  先入先出(FIFO)替換策略的基本思想是:根據進入cache的先后次序來替換,先調入的cache塊被首先替換掉。這種策略不需要隨時記錄各個塊的使用情況,容易實現,且系統開銷小。其缺點是一些需要經常使用的程序塊可能會被調入的新塊替換掉。


(3)近期最少使用(LRU)替換策略


  近期最少使用LRU(least recently used)替換策略的基本思想是:把CPU近期最少使用的塊作為被替換的塊。這種替換算法相對合理,命中率最高,是目前最常采用的方法。它需要隨時記錄cache中各塊的使用情況,以便確定哪個塊是近期最少使用的塊,實現起來比較復雜,系統開銷較大。

  不管是哪種策略,它們都只能用硬件電路來實現,試想若依靠軟件的話,cache的“高速”含義就毫無意義了。

 

3.寫策略

 以上討論的都是CPU讀數據的情況,另一種是CPU寫數據的情況。cache控制器同樣會判斷其地址是否定位在cache中。如果在,CPU的數據就會寫到cache中。對於進一步的主存儲器操作,cache控制器有以下幾種主要的寫策略。


(1)通寫方式(write through)


  通寫方式的原理如圖5.28所示。

2)回寫方式(write back)


  回寫方式的原理如圖5.29所示。


  為了盡量減少對主存的訪問次數,克服通寫方式中每次數據寫入都要訪問主存,從而導致系統寫速度降低並占用總線時間的弊病,又有了回寫方式。它的工作原理是:數據一般只寫到cache,而不寫入主存,從而使寫入的速度加快。但這樣有可能出現cache中的數據得到更新而對應主存中的數據卻沒有變(即數據不同步)的情況。此時可在cache中設置一個標志地址及數據陳舊的信息,只有當cache中的數據被再次更改時,才將原更新的數據寫入主存相應的單元中,然后接受再次更新的數據。這樣就保證了cache和主存中的數據不產生沖突。

 

3)失效(invalidation)


  當系統中存在其他微處理器或DMA操作的系統部件時,主存儲器即成為共享存儲器。它們之中的任何一方對主存儲器都有可能覆蓋寫入。此時cache控制器必須通報有關的cache行,它們的數據由於主存儲器已被修改而成為無效,這種操作就稱為cache失效。


免責聲明!

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



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