計算機系統一般都採用多級存儲器結構,如寄存器、主存、磁碟、光碟、磁帶等。這種多級存儲器的特點是從外存儲器到CPU中的寄存器逐級向上,存儲容量逐級減小,而存取速度逐級提高。由於上下兩級存儲器的速度可以相差l—2個數量級或者更高,因此,上一級和下一級存儲器的數據交換常常成為系統瓶頸,大大降低了系統的性能。為了解決這個問題,通常採用的辦法是在兩級存儲器之間增加一個高速緩衝存儲器Cache。
所謂Cache是一個速度等於或者接近上一級存儲器訪問速度的小容量存儲器,其中保存了下級存儲器中部分當前所需的數據,因此CPU可以直接從Cache中取得所需的數據,而不必訪問下一級存儲器。由於Cache的速度與上一級存儲器相當,因此保證了系統效率不會降低。Cache的設計依據是程序存取局部性原理,通常程序存取的一批數據總是存放在存儲器相鄰的單元中,只要把這一批數據同時調入cache中,即可保證近期內需要的數據都能在Caclle中訪問成功。為了實現上述目標,在設計Cache時必須做到以下兩點:
1.保證訪問Cache有較高的命中率;
2.訪問Cache與訪問下級存儲器的方式不變、容量不減。因此對於編程人員來說,Cache是完全透明的,也就是說,他們感覺不到Cache的存在。
由於Cache的容量比下級存儲器小l-2個數量級、要做到上述兩點,則必須考慮以下問題:
1.如何組織Cache,使得下級存儲器的每個部分都能夠在需要時調入Cache
2.採用何種替換策略、使得訪問cache的命中率最高;
3.採用什麼方法使得Cache和下級存儲器的數據具有—致性,即修改Cache後保證下級存儲器的內容也隨之修改(或者相反)。
通過上面的介紹,我們知道Cache也是一種存儲器,其工作速度很高,如Ll和L2 Cache就是為了解決PU和DRAM主存之間的速度匹配而設置的。因此主存Cache也可以看作是高速CPU和低速DRAM之間的接口。或者說,把Cache看成一個適配器來解決CPU和DRAM之間的速度匹配問題。
當CPU要從存儲器中讀取一個數據字時,它首先在Cache中查找。如果找到了,則立即從Cache中讀取並送到CPU中;如果在Cache中找不到,則用一個存儲器讀周期的時間從主存個讀出這個數據字送到CPU、並且把包含這個數據字的整個內存數據塊都從主存送到Cache中。之所以要把包含被讀數據字的整個內存數據塊都從主存送到Cache中是因為對存儲器的訪問具有局部性,也就是說連續讀取的數據宇一般在內存中都是連續存放的;調入一個數據塊後,將使得以後若干次的訪存都可以通過訪問Cache來完成。如果調度算法得當,Cache的命中率可以很高。這樣,從用戶的角度看來,整個存儲器(Cache+DRAM)就變成了既有Cache這樣高的速度,又有DRAM這樣的大容量的存儲系統了。這對於解決存儲器這個瓶頸是十分有效的。
綜上所述,Cache具有以下一些特點:
·Cache雖然也是一類存儲器.但是不能由用戶直接訪問。
·Cache的容量不大,其中存放的只是主存儲器中某一部分內容的拷貝,稱為存儲器映象。
·為了保證CPU訪問時有較高的命中率,Cache中的內容應該按一定的算法更換。
·Cache中的內容應該與主存中對應的部分保持一致。也就是說,如果主存守的內容在調入Cache之後發生了改變,那麼它在Cache中的拷貝也應該隨之改變。反過來,如果CPU修改了Cache中的內容,也應該修改主存中的相應內容。
現代的Cache系統常常採用分級組織的方法,在CPU中集成了一級Cache(L1),也稱為片內Cache;在主板上配置二級Cache(L2)。CPU中的片內Cache雖然容量較小,但是能夠以CPU相同的工作頻率工作,因此速度極快。一般情況下在L1未命中時,才在L2中查找。從賽揚處理器開始,甚至已經把L2集成到CPU內部了(K6-3處理器也內置了二級緩存,而這時相應的Socket 7主板上的二級緩存就成為「三級」緩存了)。
所謂存儲器映像問題就是如何組織Cache.使得下級存儲器的每個部分都能夠在需要時調入Cache,並且確定調入的內容放在Cache中的什麼地方,以便於準確迅速地查找。存儲器映像的方法主要有全相聯映像法、直接映象法和組相聯映象法。
全相聯映像法的基本思想是把一個主存塊的地址(塊號)和塊的內容都拷貝到Cache行中;由於塊地址也保存在Cache中,因此可以拷貝到Cache中的任意位置。此法的優點是靈活,但是查找比較困難,而且硬體的實現較為困難。
直接映像法的基本思想是一個主存塊只能拷貝到Cache中固定的行內。該按硬體成本低,但是由於一個Cache行要對應多個主存塊,在使用中當這些主存塊需要同時調入Cache時將發生衝突、增加調入調出的開銷。
組相聯映像法是上述兩種方法的折衷方案。其基本思想是把Cache分為m個組,每個組分為n行。主存塊分配時對組是固定的、而在組內的位置可以任意。這樣就綜合了兩者的優點,這是目前最常用的方法。
由於Cache的容量總是遠小於下一級存儲器的容量,因此Cache中只能是下級存儲器的部分映像。為了使下級存儲器的內容都能在需要時拷貝到Cache中,必須隨時替換Cache內容:即把當前不需要的內容調出Cache,騰出空間,調入當前需要的內存塊。在這種調入調出方法中,最重要的是替換的策略,即在需要時選擇Cache中的哪些行調出,再調入所需的內存塊。這種替換策略通常稱為調度算法,它是由硬體實現的。如果算法選擇不當,將大大增加調入調出的頻度。例如把一個當前不需要但是很快就將使用的行調出,必然會降低系統的效率。
常用算法有最不經常使用算法、最近最少使用算法。
最不經常使用算法(LFU算法)的思想是把最近一段時間內被訪問次數最少的行調出。因此需要對每一個行設置一個計數器,對該行的訪問次數計數、在需要時比較各個計數器的值,淘汰計數次數最少的數據行。這種算法的問題是明顯的、那些在程序前期被頻繁訪問而在後期不再使用的行,可能會在相當長的時間內不被淘沈而那些剛剛調入並將繼續反覆使用的行則可能因為其計數器中的值較小而頻道淘汰。這將嚴重影響系統的效率。
另一種較常用的算法是最近最少使用算法(LRU算法)。LRU算法的思想是將最近一段時間內最少被訪問過的行淘汰出局。因此也需要為每行設置一個計數器、但是計數方法與LFU算法不同。LRU算法是把命中行的計數器清零、其它各行計數器加1。當需要替換時淘汰行計數器計數值最大的數據行出局。
此外還有一些算法,鑑於篇幅不再贅述。
由於Cache中的內容只是主存中相應單元的「拷貝」。因此必須保持這兩處的數據絕對一致,否則就會產生錯誤。造成Cache和相應主存單元數據不一致的原因來自兩個方面。一是CPU讀人Cache數據作了修改後再寫入Cache,而主存中相應單元的內容並未隨之變化二是在有多個設備對主存訪問的情況下造成的。如多處理器或有DMA的系統,它們直接訪問主存儲器,修改了其中的內容,而cache中的相應數據卻末隨之修改。
1.CPU修改Cache後的處理
對於CPU修改了Cache的數據,如何使主存中相應單元的數據也隨之修改的問題。通常有三種不同的處理方式。
一種方式稱為「直寫式(write—through)」,其原理是在CPU向Cache寫入的同時,也把數據寫入主存儲器,以保證Cache和主存中相應單元數據的一致性。直寫式系統簡單可靠,但由於CPU每次更新Cache時都要對主存儲器寫入,習此速度受到了影響。
第二種方式稱為「緩衝直寫式(Posted Write)」,其原理是CPU在更新Cache時不直接更新主存中的數據,而是把更新的數據送入一個緩衝器中暫存,這樣CPU就不必等待主存寫入造成的延時而直接進入下一周期的操作在適當的時候再把緩衝器中的內容寫入主存中(例如在CPU讀Cache的同時;把緩衝器的內容寫入主存)。這種方式在一定程序上提高了速度,但由於緩衝器的容量有限,只能鎖存——次寫入的數據,如果發生連續的寫操作則CPU仍需要等待。上述的直寫式或緩衝直寫式不僅速度低,而且在很多時候向主存寫入是不必要的。例如CPU可能多次對同一個Cache單元更新內容,實際上只需把最後更新結果寫入主存即可,而不必更新一次Cache,就向主存寫入一次。根據這種思想提出了第三種方式,稱為「回寫式(Write—back)」。有的資料中也稱為「寫回」。這種方式的原理是CPU修改了Cache的內容後並不立即修改主存中相應的單元,而在被修改的Cache單元的內容將從Cache中淘汰時(如更換頁面)才把它寫入主存儲器的相應單元中。回寫式系統速度快,避免了不必要的冗餘寫操作,但結構上比較複雜。當前的微機普遍採回寫式系統。
2.多處理器或DMA直接訪問主存儲器後的處理
多處理器或DMA直接訪問主存儲器造成主存和cache中的數據不一致發生在以下情形:當主存中某單元內容調入Cache後,又由其它處理器或DMA更新了主存儲器該單元的內容。為了避免這種情況下的數據不一致,通常採用以下三種處理辦法。
一種辦法稱為「總線監視」,即由cache控制器隨時監視系統的地址總線,若有其它部件向主存中寫入了內容,則把Cache中相應單元的內容置為無效,CPU必須重新從主存中讀人該單元的內容。
第二種方式稱為「主存監視」、由Cache控制器監視所有主存儲器的讀寫操作所有對主存的訪問都必須通過Cache來完成。這樣,凡對主存的寫入也就對Cache中的相應單元進行拷貝從而保證了兩者數據的一致性。
第三種方式是設置「不可Cache區 (Non Cacheable Block)」,這種方式的基本思想是在主存中開闢一塊區域,該區域中數據不受cache控制器的管理,不能調入Cache,CPU只能直接讀寫該區域的內容。其它總線設備也只能把數據直接寫入該區域中。由於該區域不與Cache發生關係,也就不存在數據不一致的問題。不可Cache區方式是微機中最主要的方式,不少BIOS設置程序允許用戶設置不可Cache區的首地址和尺寸、以及可Cache區的地址範圍。
Cache在微機系統中獲得了廣泛應用。除了CPU中的cache外,硬碟、光碟甚至主存中部可找到它的蹤影。
1 CPU中的Cache
從486CPU開始,在CPU晶片內集成了Cache,稱為片內Cache。此時由於受到工藝上的限制,片內Cache的容量很小,只有8KB。片內Cache的最大優點是,CPU對它的訪問是在晶片內部進行的,不需要通過總線傳送數據因此速度很快;但是由於其容量很小,而處理器的時鐘頻率又很高,一旦出現片內cache末命中的情況,性能將明顯化。因此在處理器晶片之外的主板上再加Cache,稱為二級Cache(L2Cache),或稱為板載Cache。
在實際使用中,進入Cache的內容既可以是指令也可以是數據,而CPU對於這兩者的處理是不完全相同的。為了使系統效率達到最佳狀態,從Pentium處理器開始把片內Cache容量增加到16KB。其中指令CBche和數據Cache各佔8KB。
Intel公司在1995年末推出了Pentium Pro(P6),為了進一步改善系統性能,P6採用了雙穴封裝,即除了CPU外,還把256/5l2KB的二級Cache也封裝在同一個陶瓷片內。這樣,L2也能以處理器的時鐘高速運行,大大地提高了系統效率。
由於P6採用的方式成本很高,在InteI隨後推出的Pentium II中,把L2又從CPU陶瓷封裝中分立出來,和CPU共同安裝在一塊稱為SEC的卡盒內,而Pentium II處理器則採用了雙獨立總線結構,其中一條總線聯接L2高速緩存,另一條負責主存。由於Pentium II的L2隻能以CPU時鐘的一半工作。因此比Pentium Pro的L2慢一些。作為一種補償,Intel將Pentium II上的Ll高速緩存從16K加倍到32K,從而減少了對L2高速緩存的調用頻率。而在非Intel CPU中,L1的容量則更大,以期求得更好的系統性能。
為了匹配硬碟和主存在數據傳送速度上的矛盾,微機系統中毫無例外地採用了硬碟高速緩存,或稱為硬碟Cache。硬碟高速緩存分為兩種:硬體高速緩存和軟體高速緩存。軟體高速緩存是利用軟體工具(如Smart Drive)在系統主存中開闢的一塊區域作為數據傳送緩衝區,硬體高速緩存則是在磁碟控制器中安裝的一塊RAM,通過RAM緩衝區讀寫數據可以得到更高的訪問速度。早期硬碟中的cache很小,只有數十KB到數百KB,目前新型硬碟的高速緩存均達到2MB。在選購硬碟時除了注意容量、帶寬、轉速等參數外,還應該考慮Cache的容量,越大越好。當Cache容量大時,能夠保證較穩定的突發數據傳送;而如果Cache容量較小,在讀寫大型圖形或視頻文件時,由於連續傳送的數據量很大,緩衝區則不能表示出其優越性,使得數據傳送不再能處於突發傳送方式,而處於持續傳送方式,降低了數據帶寬。
3.光碟
以CD—ROM驅動器為例,其中配置的Cache通常為128KB或者256KB,高檔CD—ROM驅動器中的Cache容量可達512KB甚至更高。在CD ROM中配置Cache的目的仍然是作為光碟的高速緩存,以便減少讀盤的次數,這對於改善CD RoM的性能是很有好處的。
同樣,其它品種的光碟驅動器,如CD-R、CD—RW、M0、DVD—ROM等,也都配置了Cache。
4.主存儲器中的Cache
主存通常是採用DRAM(動態隨機存取存儲器)器件製作的,而Cache一般採用速度更高的SRAM(靜態隨機存取存儲器)製作。一種新型的增強DRAM)採用了在DRAM晶片上集成一個小容量SRAM的辦法,我們可以把這一小片SRAM稱為主存中的Cache。這個Cache在突髮式讀寫時非常有利,使DRAM晶片的性能得到了明顯的提高。