Cache是我們經常關心的話題,K6-Ⅲ的推出引出了一種全新的緩衝結構即Tri-level Cache設計思想。那麼對於微機系統而言,Cache到底有什麼作用?它的工作原理又是如何的呢?
一、使用Cache的必要性 所謂Cache即高速緩衝儲存空間,它位於CPU與主存即DRAM(Dynamic RAM 動態儲存裝置器)之間,是通常由SRAM(Static RAM 靜態儲存空間)構成的規模較小但存取速度很快的儲存空間。 目前電腦主要使用的記憶體為DRAM,它具有價格低、容量大等特點,但由於使用電容儲存資訊,存取速度難以提高,而CPU每執行一條指令都要訪問一次或多次主存,DRAM的讀寫速度遠低於CPU速度,因此為了實現速度上的匹配,只能在CPU指令周期中插入wait狀態,高速CPU處於等待狀態將大大降低系統的執行效率。 SRAM由於其採用了與CPU相同的製作工藝,因此與DRAM相比,它的存取速度快,但體積大、功耗大,價格很高,不可能也不必要將所有的記憶體都採用SRAM。 因此為瞭解決速度與成本的矛盾就產生了一種分級處理的方法,即在主存和 CPU之間加裝一個容量相對較小的SRAM作為高速緩衝儲存空間。 當採用Cache後,在Cache中儲存著主存中部分內容的副本(稱為儲存空間映象), CPU在讀寫資料時,首先訪問Cache(由於Cache的速度與CPU相當,所以CPU可以在零等待狀態下完成指令的執行),只有當Cache中無 CPU所需的資料時(這稱之"未命中",否則稱為"命中"),CPU才去訪問主存。而目前大容量Cache能使CPU訪問Cache命中率高達90%- 98%,從而大大提高了CPU訪問資料的速度,提高了系統的效能。
二、使用Cache的可行性 對大量的典型程式的運行情況分析結果表明,在一個較短的時間內,由程式產生的地址往往集中在儲存空間邏輯地址空間的很小範圍內。在多數情況下,指令是順序執行的,因此指令地址的分布就是連續的,再加上迴圈程式段和子程式段要重複執行多次,因此對這些地址的訪問就自然具有時間上集中分布的趨向。資料的這種集中傾向不如指令明顯,但對數組的訪問以及工作單元的選擇都可以使儲存空間地址相對集中。這種對局部範圍的儲存空間地址的頻繁訪問,而對此範圍以外的地址則訪問甚少的現象稱為程式訪問的局部性。根據程式的局部性原理,在主存和CPU之間設定Cache,把正在執行的指令地址附近的一部分指令或資料從主存裝入 Cache中,供CPU在一段時間內使用,是完全可行的。
三、Cache的基本工作原理 傳統的Socket架構下通常採用兩級緩衝結構,即在CPU中整合了一級緩衝(L1 Cache),在主板上裝二級緩衝(L2 Cache);而SlotⅠ架構下的L2 Cache則與CPU做在同一塊電路板上,以核心速度或者核心速度的一半運行,速度比Socket下的以系統外頻啟動並執行L2 Cache更快,能夠更大限度發揮高主頻的優勢,當然對Cache工藝要求也越高。CPU首先在L1 Cache中尋找資料,如找不到,則在L2Cache中尋找;若資料在L2 Cache中,控制器在傳輸資料的同時,修改L1 Cache;若資料既不在L1 Cache中,又不在L2 Cache中,Cache控制器則從主存中擷取資料,將資料提供給CPU的同時修改兩級Cache。K6-Ⅲ則比較特殊,64KB L1 Cache,256KB Full Core Speed L2 Cache,原先主板上的緩衝實際上就成了L3 Cache。根據有關測試表明:當512K-2MB的三級緩衝發揮作用時,系統效能還可以有2%~10%的提高;Tri-level成為PC系統出現以來提出的解決高速CPU與低速記憶體之間瓶頸最為細緻複雜的方案。而且,今後Cache的發展方向也是大容量、超高速。 在主存-Cache儲存體系中,所有的指令和資料都存在主存中,Cache只是存放主存中的一部分程式塊和資料區塊的副本,只是一種以塊為單位的儲存方式。Cache和主存被分為塊,每塊由多個位元組組成。由上述的程式局部性原理可知,Cache中的程式塊和資料區塊會使CPU要訪問的內容大多數情況下已經在Cache中,CPU的讀寫操作主要在CPU和Cache之間進行。CPU訪問儲存空間時,送出訪問單元的地址,由地址匯流排傳送到Cache控制器中的主存地址寄存器MA,主存—Cache地址轉換機構從MA擷取地址並判斷該單元內容是否已在Cache中存有副本,如果副本已存在Cache中,即命中。當命中時,立即把訪問地址變換成它在Cache中的地址,然後訪問Cache。 如果CPU要訪問的內容不在Cache中,即不命中,則CPU轉去直接存取主存,並將包含此儲存單元的整個資料區塊(包括該塊資料的地址資訊)傳到 Cache中,使得以後的若干次對記憶體的訪問可轉化為對Cache的訪問。若Cache儲存空間已滿,則需在替換控制組件的控制下,根據某種替換演算法/策略,用此塊資訊替換掉Cache中的原來的某塊資訊。 所以,要想提高系統效率,必須提高Cache命中率,而Cache命中率的提高則取決於Cache的映象方式和Cache重新整理演算法等一系列因素;同時 Cache中內容應與主存中的部分保持一致,也就是說,如果主存中的內容在調入Cache之後發生了變化,那麼它在Cache中的映象也應該隨即改變,反之,當CPU修改了Cache中的內容後,主存中的相應內容也應作修改。 從上面的簡單介紹中,我們知道了Cache也是一類儲存空間,它是為瞭解決CPU與主存之間速度匹配問題而設定的,且不能由使用者直接定址訪問。下篇將就Cache映象問題、重新整理問題和保持資料一致性問題作簡要論述。 四、地址映像 所謂映象問題是指如何確定Cache中的內容是主存中的哪一部分的拷貝,即必須應用某種函數把主存地址映象到Cache中定位,也稱地址映象。當資訊按這種方式裝入Cache中後,執行程式時,應將主存地址變換為Cache地址,這個變換過程叫作地址變換。地址映象方式通常採用直接映象、全相聯映象、 組相聯映象三種。 1.直接映象 每個主存地址映像到Cache中的一個指定地址的方式,稱為直接映象方式。在直接映象方式下,主存中儲存單元的資料只可調入Cache中的一個位置,如果主存中另一個儲存單元的資料也要調入該位置則將發生衝突。地址映像的方法一般是將主存空間按Cache的尺寸分區,每區內相同的塊號映像到Cache 中相同的塊位置。一般地,Cache被分為2N塊,主存被分為同樣大小的2M塊,主存與Cache中塊的對應關係可用如下映像函數表示:j = i mod 2N。式中,j是Cache中的塊號,i是主存中的塊號。 直接映象是一種最簡單的地址映像方式,它的地址變換速度快,而且不涉及其他兩種映像方式中的替換策略問題。但是這種方式的塊衝突機率較高,當稱序往返訪問兩個相互衝突的塊中的資料時,Cache的命中率將急劇下降,因為這時即使Cache中有其他空閑塊,也因為固定的地址映像關係而無法應用。 2.全相聯映象 主存中的每一個字塊可映像到Cache任何一個字塊位置上,這種方式稱為全相聯映像。這種方式只有當Cache中的塊全部裝滿後才會出現塊衝突,所以塊衝突的機率低,可達到很高的Cache命中率;但實現很複雜。當訪問一個塊中的資料時,塊地址要與Cache塊表中的所有地址標記進行比較已確定是否命中。在資料區塊調入時存在著一個比較複雜的替換問題,即決定將資料區塊調入Cache中什麼位置,將Cache中那一塊資料調出主存。為了達到較高的速度,全部比較和替換都要用硬體實現。 3.組相聯映象 組相聯映象方式是直接映象和全相聯映象的一種折衷方案。這種方法將儲存空間分為若干組,各組之間是直接映像,而組內各塊之間則是全相聯映像。它是上述兩種映像方式的一般形式,如果組的大小為1,即Cache空間分為2N組,就變為直接映像;如果組的大小為Cache整個的尺寸,就變為了全相聯映像。組相聯方式在判斷塊命中及替換演算法上都要比全相聯方式簡單,塊衝突的機率比直接映像的低,其命中率也介於直接映像和全相聯映像方式之間。 五、替換策略和一致性問題的處理方法 Cache和儲存空間一樣具有兩種基本操作,即讀操作和寫操作。 當CPU發出讀操作命令時,根據它產生的主存地址分為兩種情形: 一種是需要的資料已在Cache中,那麼只需直接存取Cache,從對應單元中讀取資訊到資料匯流排; 另一種是需要的資料尚未裝入Cache,CPU需從主存中讀取資訊的同時,Cache替換組件把該地址所在的那Block Storage內容從主存拷貝到 Cache中;若Cache中相應位置已被字塊佔滿,就必須去掉舊的字塊。常見的替換策略有兩種: 1.先進先出策略(FIFO) FIFO(First In First Out)策略總是把最先調入的Cache字塊替換出去,它不需要隨時記錄各個字塊的使用方式,較容易實現;缺點是經常使用的塊,如一個包含迴圈程式的塊也可能由於它是最早的塊而被替換掉。 2.最近最少使用原則(LRU) LRU(Least Recently Used)策略是把當前近期Cache中使用次數最少的那塊資訊塊替換出去,這種替換演算法需要隨時記錄Cache中字塊的使用方式。LRU的平均命中率比 FIFO高,在組相聯映像方式中,當分組容量加大時,LRU的命中率也會提高。 當CPU發出寫操作命令時,也要根據它產生的主存地址分為兩種情形:一種是不命中時,只向主存寫入資訊,不必同時把這個地址單元所在的整塊內容調入Cache中;另一種是命中時,這時會遇到如何保持Cache與主存的一致性問題,通常有三種處理方式: 1.直寫式(write through) 即CPU在向Cache寫入資料的同時,也把資料寫入主存以保證Cache和主存中相應單中繼資料的一致性,其特點是簡單可靠,但由於CPU每次更新時都要對主存寫入,速度必然受影響。
2.緩寫式(post write) 即CPU在更新Cache時不直接更新主存中的資料,而是把更新的資料送入一個緩衝器暫存,在適當的時候再把緩衝器中的內容寫入主存。在這種方式下,CPU不必等待主存寫入而造成的時延,在一定程度上提高了速度,但由於緩衝器只有有限的容量,只能鎖存一次寫入的資料,如果是連續寫入,CPU仍需要等待。
3.回寫式(write back) 即CPU只向Cache寫入,並用標記加以註明,直到Cache中被寫過的塊要被進入的資訊塊取代時,才一次寫入主存。這種方式考慮到寫入的往往是中間結果,每次寫入主存速度慢而且不必要。其特點是速度快,避免了不必要的冗餘寫操作,但結構上較複雜。
此外,還有一種設定不可Cache區(Non-cacheable Block)的方式,即在主存中開闢一塊地區,該地區中的資料不受Cache控制器的管理,不能調入Cache,CPU只能直接讀寫該地區的內容。由於該地區不與Cache發生關係,也就不存在資料不一致性問題。目前微機系統的BIOS設定程式大多允許使用者佈建不可Cache區的首地址和大小。