概述
在計算機存儲系統的層次結構中,介於中央處理器和主存儲器之間的高速小容量存儲器。它和主存儲器一起構成一級的存儲器。高速緩衝存儲器和主存儲器之間信息的調度和傳送是由硬體自動進行的,程式員感覺不到高速緩衝存儲器的存在,因而它對程式設計師是透明的。
一種特殊的存儲器子系統,其中複製了頻繁使用的數據以利於快速訪問。存儲器的高速緩衝存儲器存儲了頻繁訪問的RAM位置的內容及這些數據項的存儲地址。當處理器引用存儲器中的某地址時,高速緩衝存儲器便檢查是否存有該地址。如果存有該地址,則將數據返回處理器;如果沒有保存該地址,則進行常規的存儲器訪問。因為高速緩衝存儲器總是比主RAM存儲器速度快,所以當RAM的訪問速度低於微處理器的速度時,常使用高速緩衝存儲器。另見waitstate。
Cache的出現是基於兩種因素:首先,是由於CPU的速度和性能提高很快而主存速度較低且價格高,第二就是程式執行的局部性特點。因此,才將速度比較快而容量有限的SRAM構成Cache,目的在於儘可能發揮CPU的高速度。很顯然,要儘可能發揮CPU的高速度就必須用硬體實現其全部功能。
Cache與主存之間可採取多種地址映射方式,直接映射方式是其中的一種。在這種映射方式下,主存中的每一頁只能複製到某一固定的Cache頁中。由於Cache塊(頁)的大小為16B,而Cache容量為16KB。因此,此Cache可分為1024頁。可以看到,Cache的頁內地址只需4位即可表示;而Cache的頁號需用10位二進制數來表示;在映射時,是將主存地址直接複製,現主存地址為1234E8F8(十六進制),則最低4位為Cache的頁內地址,即1000,中間10位為Cache的頁號,即1010001111。Cache的容量為16KB決定用這14位編碼即可表示。題中所需求的Cache的地址為10100011111000。
Cache中的內容隨命中率的降低需要經常替換新的內容。替換算法有多種,例如,先入後出(FILO)算法、隨機替換(RAND)算法、先入先出(FIFO)算法、近期最少使用(LRU)算法等。這些替換算法各有優缺點,就以命中率而言,近期最少使用(LRU)算法的命中率最高。
作用

在計算機技術發展過程中,主存儲器存取速度一直比中央處理器操作速度慢得多,使中央處理器的高速處理能力不能充分發揮,整個計算機系統的工作效率受到影響。有很多方法可用來緩和中央處理器和主存儲器之間速度不匹配的矛盾,如採用多個通用暫存器、多存儲體交叉存取等,在存儲層次上採用高速緩衝存儲器也是常用的方法之一。很多大、中型計算機以及新近的一些小型機、微型機也都採用高速緩衝存儲器。
高速緩衝存儲器的容量一般只有主存儲器的幾百分之一,但它的存取速度能與中央處理器相匹配。根據程式局部性原理,正在使用的主存儲器某一單元鄰近的那些單元將被用到的可能性很大。因而,當中央處理器存取主存儲器某一單元時,計算機硬體就自動地將包括該單元在內的那一組單元內容調入高速緩衝存儲器,中央處理器即將存取的主存儲器單元很可能就在剛剛調入到高速緩衝存儲器的那一組單元內。於是,中央處理器就可以直接對高速緩衝存儲器進行存取。在整個處理過程中,如果中央處理器絕大多數存取主存儲器的操作能為存取高速緩衝存儲器所代替,計算機系統處理速度就能顯著提高。
原理
高速緩衝存儲器通常由高速存儲器、聯想存儲器、替換邏輯電路和相應的控制線路組成(見圖)。在有高速緩衝存儲器的計算機系統中,中央處理器存取主存儲器的地址劃分為行號、列號和組內地址三個欄位。於是,主存儲器就在邏輯上劃分為若干行;每行劃分為若干的存儲單元組;每組包含幾個或幾十個字。高速存儲器也相應地劃分為行和列的存儲單元組。二者的列數相同,組的大小也相同,但高速存儲器的行數卻比主存儲器的行數少得多。聯想存儲器用於地址聯想,有與高速存儲器相同行數和列數的存儲單元。當主存儲器某一列某一行存儲單元組調入高速存儲器同一列某一空著的存儲單元組時,與聯想存儲器對應位置的存儲單元就記錄調入的存儲單元組在主存儲器中的行號。當中央處理器存取主存儲器時,硬體首先自動對存取地址的列號欄位進行解碼,以便將聯想存儲器該列的全部行號與存取主存儲器地址的行號欄位進行比較:若有相同的,表明要存取的主存儲器單元已在高速存儲器中,稱為命中,硬體就將存取主存儲器的地址映射為高速存儲器的地址並執行存取操作;若都不相同,表明該單元不在高速存儲器中,稱為脫靶,硬體將執行存取主存儲器操作並自動將該單元所在的那一主存儲器單元組調入高速存儲器相同列中空著的存儲單元組中,同時將該組在主存儲器中的行號存入聯想存儲器對應位置的單元內。
當出現脫靶而高速存儲器對應列中沒有空的位置時,便淘汰該列中的某一組以騰出位置存放新調入的組,這稱為替換。確定替換的規則叫替換算法,常用的替換算法有:最近最少使用法(LRU)、先進先出法(FIFO)和隨機法(RAND)等。替換邏輯電路就是執行這個功能的。另外,當執行寫主存儲器操作時,為保持主存儲器和高速存儲器內容的一致性,對命中和脫靶須分別處理:①寫操作命中時,可採用寫直達法(即同時寫入主存儲器和高速存儲器)或寫回法(即只寫入高速存儲器並標記該組修改過。淘汰該組時須將內容寫回主存儲器);②寫操作脫靶時,可採用寫分配法(即寫入注存儲器並將該組調入高速存儲器)或寫不分配法(即只寫入主存儲器但不將該組調入高速存儲器)。
高速緩衝存儲器的性能常用命中率來衡量。影響命中率的因素是高速存儲器的容量、存儲單元組的大小、組數多少、地址聯想比較方法、替換算法、寫操作處理方法和程式特性等。採用高速緩衝存儲器技術的計算機已相當普遍。有的計算機還採用多個高速緩衝存儲器,如系統高速緩衝存儲器、指令高速緩衝存儲器和地址變換高速緩衝存儲器等,以提高系統性能。隨著主存儲器容量不斷增大,高速緩衝存儲器的容量也越來越大。
瀏覽器快取
快取用於存儲一些臨時的檔案。在瀏覽網頁的過程中,網頁會自動存儲在用戶的硬碟上。下次再瀏覽相同的網站的時候,系統會自動從硬碟中調出該網頁,既節省了時間也減少了網路的交換。用戶可以自行設定快取方便其上網的需要。電腦中還存在高速緩衝存儲器和硬碟快取。快取的種類:本地伺服器快取、網頁快取、硬碟快取、一級高速快取、二級高速快取。
簡單理解
cache是一個高速小容量的臨時存儲器,可以用高速的靜態存儲器晶片實現,或者集成到CPU晶片內部,存儲CPU最經常訪問的指令或者運算元據。
cache的基本原理
CPU與cache之間的數據交換是以字為單位,而cache與主存之間的數據交換是以塊為單位。一個塊由若干定長字組成的。當CPU讀取主存中一個字時,便發出此字的記憶體地址到cache和主存。此時cache控制邏輯依據地址判斷此字當前是否在cache中:若是,此字立即傳送給CPU;若非,則用主存讀周期把此字從主存讀出送到CPU,與此同時,把含有這個字的整個數據塊從主存讀出送到cache中。由始終管理cache使用情況的硬體邏輯電路來實現LRU替換算法
地址鏡像與變換
由於主存容量遠大於高速快取的容量,因此兩者之間就必須按一定的規則對應起來。高速快取的地址鏡像就是指按什麼規則把主存塊裝入高速快取中。地址變換是指當按某種鏡像方式把主存塊裝入高速快取後,每次訪問高速快取時,如何把主存的物理地址或虛擬地址變換成高速快取的地址,從而訪問高速快取中的數據。
鏡像和變換的方式有四種:直接鏡像、全相連鏡像、組相連鏡像、區段相連鏡像。
Buffer和Cache的區別
buffer與cache操作的對象就不一樣。
buffer(緩衝)是為了提高記憶體和硬碟(或其他I/0設備)之間的數據交換的速度而設計的。
cache(快取)是為了提高cpu和記憶體之間的數據交換速度而設計,也就是平常見到的一級快取、二級快取、三級快取。
cpu在執行程式所用的指令和讀數據都是針對記憶體的,也就是從記憶體中取得的。由於記憶體讀寫速度慢,為了提高cpu和記憶體之間數據交換的速度,在cpu和記憶體之間增加了cache,它的速度比記憶體快,但是造價高,又由於在cpu內不能集成太多積體電路,所以一般cache比較小,以後intel等公司為了進一步提高速度,又增加了二級cache,甚至三級cache,它是根據程式的局部性原理而設計的,就是cpu執行的指令和訪問的數據往往在集中的某一塊,所以把這塊內容放入cache後,cpu就不用在訪問記憶體了,這就提高了訪問速度。當然若cache中沒有cpu所需要的內容,還是要訪問記憶體的。
緩衝(buffers)是根據磁碟的讀寫設計的,把分散的寫操作集中進行,減少磁碟碎片和硬碟的反覆尋道,從而提高系統性能。linux有一個守護進程定期清空緩衝內容(即寫入磁碟),也可以通過sync命令手動清空緩衝。舉個例子吧:我這裡有一個ext2的隨身碟,我往裡面cp一個3M的MP3,但隨身碟的燈沒有跳動,過了一會兒(或者手動輸入sync)隨身碟的燈就跳動起來了。卸載設備時會清空緩衝,所以有些時候卸載一個設備時要等上幾秒鐘。
修改/etc/sysctl.conf中的vm.swappiness右邊的數字可以在下次開機時調節swap使用策略。該數字範圍是0~100,數字越大越傾向於使用swap。默認為60,可以改一下試試。--兩者都是RAM中的數據。
簡單來說,buffer是即將要被寫入磁碟的,而cache是被從磁碟中讀出來的。
buffer是由各種進程分配的,被用在如輸入佇列等方面。一個簡單的例子如某個進程要求有多個欄位讀入,在所有欄位被讀入完整之前,進程把先前讀入的欄位放在buffer中保存。
cache經常被用在磁碟的I/O請求上,如果有多個進程都要訪問某個檔案,於是該檔案便被做成cache以方便下次被訪問,這樣可提高系統性能。
讀取命中率
CPU在Cache中找到有用的數據被稱為命中,當Cache中沒有CPU所需的數據時(這時稱為未命中),CPU才訪問記憶體。從理論上講,在一顆擁有2級Cache的CPU中,讀取L1Cache的命中率為80%。也就是說CPU從L1Cache中找到的有用數據占數據總量的80%,剩下的20%從L2Cache讀取。由於不能準確預測將要執行的數據,讀取L2的命中率也在80%左右(從L2讀到有用的數據占總數據的16%)。那么還有的數據就不得不從記憶體調用,但這已經是一個相當小的比例了。在一些高端領域的CPU(像Intel的Itanium)中,我們常聽到L3Cache,它是為讀取L2Cache後未命中的數據設計的—種Cache,在擁有L3Cache的CPU中,只有約5%的數據需要從記憶體中調用,這進一步提高了CPU的效率。為了保證CPU訪問時有較高的命中率,Cache中的內容應該按一定的算法替換。一種較常用的算法是“最近最少使用算法”(LRU算法),它是將最近一段時間內最少被訪問過的行淘汰出局。因此需要為每行設定一個計數器,LRU算法是把命中行的計數器清零,其他各行計數器加1。當需要替換時淘汰行計數器計數值最大的數據行出局。這是一種高效、科學的算法,其計數器清零過程可以把一些頻繁調用後再不需要的數據淘汰出Cache,提高Cache的利用率。
工作原理
高速緩衝存儲器通常由高速存儲器、聯想存儲器、替換邏輯電路和相應的控制線路組成。在有高速緩衝存儲器的計算機系統中,中央處理器存取主存儲器的地址劃分為行號、列號和組內地址三個欄位。於是,主存儲器就在邏輯上劃分為若干行;每行劃分為若干的存儲單元組;每組包含幾個或幾十個字。高速存儲器也相應地劃分為行和列的存儲單元組。二者的列數相同,組的大小也相同,但高速存儲器的行數卻比主存儲器的行數少得多。聯想存儲器用於地址聯想,有與高速存儲器相同行數和列數的存儲單元。當主存儲器某一列某一行存儲單元組調入高速存儲器同一列某一空著的存儲單元組時,與聯想存儲器對應位置的存儲單元就記錄調入的存儲單元組在主存儲器中的行號。
當中央處理器存取主存儲器時,硬體首先自動對存取地址的列號欄位進行解碼,以便將聯想存儲器該列的全部行號與存取主存儲器地址的行號欄位進行比較:若有相同的,表明要存取的主存儲器單元已在高速存儲器中,稱為命中,硬體就將存取主存儲器的地址映射為高速存儲器的地址並執行存取操作;若都不相同,表明該單元不在高速存儲器中,稱為脫靶,硬體將執行存取主存儲器操作並自動將該單元所在的那一主存儲器單元組調入高速存儲器相同列中空著的存儲單元組中,同時將該組在主存儲器中的行號存入聯想存儲器對應位置的單元內。
當出現脫靶而高速存儲器對應列中沒有空的位置時,便淘汰該列中的某一組以騰出位置存放新調入的組,這稱為替換。確定替換的規則叫替換算法,常用的替換算法有:最近最少使用法(LRU)、先進先出法(FIFO)和隨機法(RAND)等。替換邏輯電路就是執行這個功能的。另外,當執行寫主存儲器操作時,為保持主存儲器和高速存儲器內容的一致性,對命中和脫靶須分別處理:
①寫操作命中時,可採用寫直達法(即同時寫入主存儲器和高速存儲器)或寫回法(即只寫入高速存儲器並標記該組修改過。淘汰該組時須將內容寫回主存儲器);
②寫操作脫靶時,可採用寫分配法(即寫入主存儲器並將該組調入高速存儲器)或寫不分配法(即只寫入主存儲器但不將該組調入高速存儲器)。高速緩衝存儲器的性能常用命中率來衡量。影響命中率的因素是高速存儲器的容量、存儲單元組的大小、組數多少、地址聯想比較方法、替換算法、寫操作處理方法和程式特性等。
採用高速緩衝存儲器技術的計算機已相當普遍。有的計算機還採用多個高速緩衝存儲器,如系統高速緩衝存儲器、指令高速緩衝存儲器和地址變換高速緩衝存儲器等,以提高系統性能。隨著主存儲器容量不斷增大,高速緩衝存儲器的容量也越來越大。