高速緩沖存儲器

高速緩沖存儲器

高速緩沖存儲器(Cache)其原始意義是指存取速度比一般隨機存取記憶體(RAM)來得快的一種RAM,一般而言它不像系統主記憶體那樣使用DRAM技術,而使用昂貴但較快速的SRAM技術,也有快取記憶體的名稱。

高速緩沖存儲器是存在于主存與CPU之間的一級存儲器, 由靜態存儲晶片(SRAM)組成,容量比較小但速度比主存高得多, 接近于CPU的速度。在電腦存儲系統的層次結構中,是介于中央處理器和主存儲器之間的高速小容量存儲器。它和主存儲器一起構成一級的存儲器。高速緩沖存儲器和主存儲器之間信息的調度和傳送是由硬體自動進行的。

高速緩沖存儲器最重要的技術指標是它的命中率

  • 中文名稱
    高速緩沖存儲器
  • 外文名稱
    Cache
  • 所屬科目
    電腦
  • 所屬領域
    硬體

組成結構

高速緩沖存儲器是存在于主存與CPU之間的一級存儲器, 由靜態存儲晶片(SRAM)組成,容量比較小但速度比主存高得多, 接近于CPU的速度。

主要由三大部分組成:

Cache存儲體:存放由主存調入的指令與資料塊。

地址轉換部件:建立目錄表以實現主存地址到快取地址的轉換。

替換部件:在快取已滿時按一定策略進行資料塊替換,並修改地址轉換部件。

工作原理

高速緩沖存儲器通常由高速存儲器、聯想存儲器、替換邏輯電路和相應的控製線路組成。在有高速緩沖存儲器的電腦系統中,中央處理器存取主存儲器的地址劃分為行號、列號和組內地址三個欄位。于是,主存儲器就在邏輯上劃分為若幹行;每行劃分為若幹的存儲單元組;每組包含幾個或幾十個字。高速存儲器也相應地劃分為行和列的存儲單元組。二者的列數相同,組的大小也相同,但高速存儲器的行數卻比主存儲器的行數少得多。

聯想存儲器用于地址聯想,有與高速存儲器相同行數和列數的存儲單元。當主存儲器某一列某一行存儲單元組調入高速存儲器同一列某一空著的存儲單元組時,與聯想存儲器對應位置的存儲單元就記錄調入的存儲單元組在主存儲器中的行號。

當中央處理器存取主存儲器時,硬體首先自動對存取地址的列號欄位進行解碼,以便將聯想存儲器該列的全部行號與存取主存儲器地址的行號欄位進行比較:若有相同的,表明要存取的主存儲器單元已在高速存儲器中,稱為命中,硬體就將存取主存儲器的地址對應為高速存儲器的地址並執行存取操作;若都不相同,表明該單元不在高速存儲器中,稱為脫靶,硬體將執行存取主存儲器操作並自動將該單元所在的那一主存儲器單元組調入高速存儲器相同列中空著的存儲單元組中,同時將該組在主存儲器中的行號存入聯想存儲器對應位置的單元內。

當出現脫靶而高速存儲器對應列中沒有空的位置時,便淘汰該列中的某一組以騰出位置存放新調入的組,這稱為替換。確定替換的規則叫替換演算法,常用的替換演算法有:最近最少使用演算法(LRU)、先進先出法(FIFO)和隨機法(RAND)等。替換邏輯電路就是執行這個功能的。另外,當執行寫主存儲器操作時,為保持主存儲器和高速存儲器內容的一致性,對命中和脫靶須分別處理。

存儲層次

主-輔存存儲層次 由于電腦主存容量相對于程式員所需要的容量來說總是太小,程式與資料從輔存調入主存是由程式員自己安排的,程式員必須花費很大精力和時間把大程式預先分成塊,確定好這些程式塊在輔存中的位置和裝入主存的地址,而且還要預先安排好程式運行時各塊如何和何時調入調出,因此存在存儲空間的分配問題。作業系統的形成和發展使得程式員盡可能擺脫主、輔存之間的地址定位,同時形成了支持這些功能的"輔助硬體",通過軟體、硬體的結合,把主存和輔存統一成了一個整體,如圖所示。這時,由主存、輔存形成了一個存儲層次,即存儲系統。從整體看,其速度接近于主存的速度,其容量則接近于輔存的容量,而每位的平均價格也接近于廉價的慢速的輔存平均價格。這種系統不斷發展和完善,就逐步形成了現在廣泛使用的虛擬存儲系統。在系統中,應用程式員可用機器指令地址碼對整個程式統一編址,如同程式員具有對應這個地址碼寬度的全部虛存空間一樣。該空間可以比主存實際空間大得多,以致可以存得下整個程式。這種指令地址碼稱為虛地址(虛存地址、虛擬地址)或邏輯地址,其對應的存儲容量稱為虛存容量或虛存空間;而把實際主存的地址稱為物理地址、實(存)地址,其對應的存儲容量稱為主存容量、實存容量或實(主)存空間

主-輔存存儲層次

CACHE-主存存儲層次

當用虛地址訪問主存時,機器自動地把它經輔助軟體、硬體變換成主存實地址。查看這個地址所對應的單元內容是否已經裝入主存,如果在主存就進行訪問,如果不在主存內就經輔助軟體、硬體把它所在的那塊程式和資料由輔存調入主存,而後進行訪問。這些操作都不必由程式員來安排,也就是說,對套用程員員是透明的。 主-輔存層次解決了存儲器大容量要求和低成本之間的矛盾。 在速度方面,電腦的主存和CPU直保持了大約一個數量級的差距。顯然這個差距限製了CPU速度潛力的發揮。為了彌合這個差距,僅採用一種工藝的單一存儲器是行不通的,必須進一步從電腦系統結構和組織上去研究。設定高速緩沖存儲器(Cache)是解決存取速度的重要方法。在CPU和主存中間設定高速緩沖存儲器,構成高速快取(Cache)-主存層次,要求Cache在速度上能跟得上CPU的要求。Cache-主存間的地址映象和調度吸取了比它較早出現的主-輔存存儲層次的技術,不同的是因其速度要求高,不是由軟、硬體結合而完全由硬體來實現,如圖所示。

地址映象與轉換

地址映象是指某一資料在記憶體中的地址與在緩沖中的地址,兩者之間的對應關系。下面介紹三種地址映象的方式。

1.全相聯方式

地址映象規則:主存的任意一塊可以映象到Cache中的任意一塊

(1) 主存與快取分成相同大小的資料塊。

(2) 主存的某一資料塊可以裝入快取的任意一塊空間中。如果Cache的塊數為Cb,主存的塊數為Mb,則映象關系共有Cb×Mb種。

目錄表存放在相關(聯)存儲器中,其中包括三部分:資料塊在主存的塊地址、存入快取後的塊地址、及有效位(也稱裝入位)。由于是全相聯方式,因此,目錄表的容量應當與快取的塊數相同。

優點:命中率比較高,Cache存儲空間利用率高。

缺點:訪問相關存儲器時,每次都要與全部內容比較,速度低,成本高,因而套用少。

2.直接相聯方式

地址映象規則: 主存儲器中一塊隻能映象到Cache的一個特定的塊中。

(1) 主存與快取分成相同大小的資料塊。

(2) 主存容量應是快取容量的整數倍,將主存空間按快取的容量分成區,主存中每一區的塊數與快取的總塊數相等。

(3) 主存中某區的一塊存入快取時隻能存入快取中塊號相同的位置。

主存中各區內相同塊號的資料塊都可以分別調入快取中塊號相同的地址中,但同時隻能有一個區的塊存入快取。由于主、快取塊號相同,因此,目錄登記時,隻記錄調入塊的區號即可。主、快取塊號及塊內地址兩個欄位完全相同。目錄表存放在高速小容量存儲器中,其中包括二部分:資料塊在主存的區號和有效位。目錄表的容量與快取的塊數相同。

優點:地址映象方式簡單,資料訪問時,隻需檢查區號是否相等即可,因而可以得到比較快的訪問速度,硬體設備簡單。

缺點:替換操作頻繁,命中率比較低。

3.組相聯映象方式

組相聯的映象規則:

(1) 主存和Cache按同樣大小劃分成塊。

(2) 主存和Cache按同樣大小劃分成組。

(3) 主存容量是快取容量的整數倍,將主存空間按緩沖區的大小分成區,主存中每一區的組數與快取的組數相同。

(4) 當主存的資料調入快取時,主存與快取的組號應相等,也就是各區中的某一塊隻能存入快取的同組號的空間內,但組內各塊地址之間則可以任意存放,即從主存的組到Cache的組之間採用直接映象方式;在兩個對應的組內部採用全相聯映象方式。

主存地址與快取地址的轉換有兩部分,組地址是按直接映象方式,按地址進行訪問,而塊地址是採用全相聯方式,按內容訪問。組相聯的地址轉換部件也是採用相關存儲器實現。

優點:塊的沖突概率比較低,塊的利用率大幅度提高,塊失效率明顯降低。

缺點:實現難度和造價要比直接映象方式高。

替換策略

1. 根據程式局部性規律可知:程式在運行中,總是頻繁地使用那些最近被使用過的指令和資料。這就提供了替換策略的理論依據。綜合命中率、實現的難易及速度的快慢各種因素,替換策略可有隨機法、先進先出法、最近最少使用法等。

(1).隨機法(RAND法)

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

(2).先進先出法(FIFO法)

先進先出法是選擇那個最先調入的那個塊進行替換。當最先調入並被多次命中的塊,很可能被優先替換,因而不符合局部性規律。這種方法的命中率比隨機法好些,但還不滿足要求。先進先出方法易于實現,

(3).最近最少使用法(LRU法)

LRU法是依據各塊使用的情況, 總是選擇那個最近最少使用的塊被替換。這種方法比較好地反映了程式局部性規律。 實現LRU策略的方法有多種。

2 在多體並行存儲系統中,由于 I/O 設備向主存請求的級別高于 CPU 訪存,這就出現了 CPU 等待 I/O 設備訪存的現象,致使 CPU 空等一段時間,甚至可能等待幾個主存周期,從而降低了 CPU 的工作效率。為了避免 CPU 與 I/O 設備爭搶訪存,可在 CPU 與主存之間加一級快取,這樣,主存可將 CPU 要取的信息提前送至快取,一旦主存在與 I/O 設備交換時, CPU 可直接從快取中讀取所需信息,不必空等而影響效率。

3 目前提出的演算法可以分為以下三類(第一類是重點要掌握的):

(1)傳統替換演算法及其直接演化,其代表演算法有 :①LRU( Least Recently Used)演算法:將最近最少使用的內容替換出Cache ;②LFU( Lease Frequently Used)演算法:將訪問次數最少的內容替換出Cache;③如果Cache中所有內容都是同一天被快取的,則將最大的文檔替換出Cache,否則按LRU演算法進行替換 。④FIFO( First In First Out):遵循先入先出原則,若當前Cache被填滿,則替換最早進入Cache的那個。

(2)基于快取內容關鍵特征的替換演算法,其代表演算法有:①Size替換演算法:將最大的內容替換出Cache②LRU- MIN替換演算法:該演算法力圖使被替換的文檔個數最少。設待快取文檔的大小為S,對Cache中快取的大小至少是S的文檔,根據LRU演算法進行替換;如果沒有大小至少為S的對象,則從大小至少為S/2的文檔中按照LRU演算法進行替換;③LRU-Threshold替換演算法:和LRU演算法一致,隻是大小超過一定閾值的文檔不能被快取;④Lowest Lacency First替換演算法:將訪問延遲最小的文檔替換出Cache。

(3)基于代價的替換演算法,該類演算法使用一個代價函式對Cache中的對象進行評估,最後根據代價值的大小決定替換對象。其代表演算法有:①Hybrid演算法:演算法對Cache中的每一個對象賦予一個效用函式,將效用最小的對象替換出Cache;②Lowest Relative Value演算法:將效用值最低的對象替換出Cache;③Least Normalized Cost Replacement(LCNR)演算法:該演算法使用一個關于文檔訪問頻次、傳輸時間和大小的推理函式來確定替換文檔;④Bolot等人 提出了一種基于文檔傳輸時間代價、大小、和上次訪問時間的權重推理函式來確定文檔替換;⑤Size-Adjust LRU(SLRU)演算法:對快取的對象按代價與大小的比率進行排序,並選取比率最小的對象進行替換。

作用介紹

在電腦技術發展過程中,主存儲器存取速度一直比中央處理器操作速度慢得多,使中央處理器的高速處理能力不能充分發揮,整個電腦系統的工作效率受到影響。有很多方法可用來緩和中央處理器和主存儲器之間速度不匹配的矛盾,如採用多個通用暫存器、多存儲體交叉存取等,在存儲層次上採用高速緩沖存儲器也是常用的方法之一。很多大、中型電腦以及新近的一些小型機、微型機也都採用高速緩沖存儲器。

高速緩沖存儲器的容量一般隻有主存儲器的幾百分之一,但它的存取速度能與中央處理器相匹配。根據程式局部性原理,正在使用的主存儲器某一單元鄰近的那些單元將被用到的可能性很大。因而,當中央處理器存取主存儲器某一單元時,電腦硬體就自動地將包括該單元在內的那一組單元內容調入高速緩沖存儲器,中央處理器即將存取的主存儲器單元很可能就在剛剛調入到高速緩沖存儲器的那一組單元內。于是,中央處理器就可以直接對高速緩沖存儲器進行存取。在整個處理過程中,如果中央處理器絕大多數存取主存儲器的操作能為存取高速緩沖存儲器所代替,電腦系統處理速度就能顯著提高。

讀取命中率

CPU在Cache中找到有用的資料被稱為命中,當Cache中沒有CPU所需的資料時(這時稱為未命中),CPU才訪問記憶體。從理論上講,在一顆擁有2級Cache的CPU中,讀取L1Cache的命中率為80%。也就是說CPU從L1Cache中找到的有用資料佔資料總量的80%,剩下的20%從L2Cache讀取。由于不能準確預測將要執行的資料,讀取L2的命中率也在80%左右(從L2讀到有用的資料佔總資料的16%)。那麽還有的資料就不得不從記憶體調用,但這已經是一個相當小的比例了。在一些高端領域的CPU中,我們常聽到L3Cache,它是為讀取L2Cache後未命中的資料設計的-種Cache,在擁有L3Cache的CPU中,隻有約5%的資料需要從記憶體中調用,這進一步提高了CPU的效率。

為了保證CPU訪問時有較高的命中率,Cache中的內容應該按一定的演算法替換。一種較常用的演算法是"最近最少使用演算法"(LRU演算法),它是將最近一段時間內最少被訪問過的行淘汰出局。因此需要為每行設定一個計數器,LRU演算法是把命中行的計數器清零,其他各行計數器加1。當需要替換時淘汰行計數器計數值最大的資料行出局。這是一種高效、科學的演算法,其計數器清零過程可以把一些頻繁調用後再不需要的資料淘汰出Cache,提高Cache的利用率。

Cache的替換演算法對命中率的影響。 當新的主存塊需要調入Cache並且它的可用空間位置又被佔滿時,需要替換掉Cache的資料,這就產生了替換策略(演算法)問題。根據程式局部性規律可知:程式在運行中,總是頻繁地使用那些最近被使用過的指令和資料。這就提供了替換策略的理論依據。 替換演算法目標就是使Cache獲得最高的命中率。Cache替換演算法是影響代理快取系統性能的一個重要因素,一個好的Cache替換演算法可以產生較高的命中率。常用演算法如下:

(1)隨機法(RAND法) 隨機替換演算法就是用亂數發生器產生一個要替換的塊號,將該塊替換出去,此演算法簡單、易于實現,而且它不考慮Cache塊過去、現在及將來的使用情況,但是沒有利用上層存儲器使用的"歷史信息"、沒有根據訪存的局部性原理,故不能提高Cache的命中率,命中率較低。

(2)先進先出法(FIFO法) 先進先出(First-In-First-Out,FIFO)演算法。就是將最先進入Cache的信息塊替換出去。FIFO演算法按調入Cache的先後決定淘汰的順序,選擇最早調入Cache的字塊進行替換,它不需要記錄各字塊的使用情況,比較容易實現,系統開銷小,其缺點是可能會把一些需要經常使用的程式塊(如迴圈程式)也作為最早進入Cache的塊替換掉,而且沒有根據訪存的局部性原理,故不能提高Cache的命中率。因為最早調入的信息可能以後還要用到,或者經常要用到,如迴圈程式。此法簡單、方便,利用了主存的"歷史信息", 但並不能說最先進入的就不經常使用,其缺點是不能正確反映程式局部性原理,命中率不高,可能出現一種異常現象。

(3)近期最少使用法(LRU法) 近期最少使用(Least Recently Used,LRU)演算法。這種方法是將近期最少使用的Cache中的信息塊替換出去。該演算法較先進先出演算法要好一些。但此法也不能保證過去不常用將來也不常用。 LRU法是依據各塊使用的情況,總是選擇那個最近最少使用的塊被替換。這種方法雖然比較好地反映了程式局部性規律,但是這種替換方法需要隨時記錄Cache中各塊的使用情況,以便確定哪個塊是近期最少使用的塊。LRU演算法相對合理,但實現起來比較復雜,系統開銷較大。通常需要對每一塊設定一個稱為計數器的硬體或軟體模組,用以記錄其被使用的情況。

相關詞條

其它詞條