【我所認知的BIOS】-->Cache(1)
LightSeed
2009-11-12
在文章前面我想說一下,CPU的cache是一個很有趣的部件,對它研究我目前也還僅僅處於486架構上的研究。因爲我手上也就只找到了《80486 System Architecture》這本書(這本書裏面講的非常非常詳細,我個人很喜歡這樣的書籍)。據說P4 CPU也有這樣一本書,不過在國內好像找不到,如果您是有這本的書的話,能否給我讓我瞧瞧?這樣的話,我會很感謝您的!
另外,由於關於cache的東西比較多(當然其實有兩個大的方向,就是數據一致性和運行機制,掌握了這兩個大的目標我想cache對於您來說就不算什麼難事了。),所以我準備把整理好的小結分成三篇文章放到blog裏。這樣可以降低每一篇文章的篇幅。否則篇幅太長,我擔心大家會睡着了。呵呵。。。(開玩笑啦。)
1、什麼cache
引用自互動百科裏面關於cache的定義:
Cache存儲器:電腦中爲高速緩衝存儲器,是位於CPU和主存儲器DRAM(Dynamic Random Access Memory)之間,規模較小,但速度很高的存儲器,通常由SRAM(Static Random Access Memory靜態存儲器)組成。CPU的速度遠高於內存,當CPU直接從內存中存取數據時要等待一定時間週期(在後續的時序圖中我們可以很清楚地看到這個等待週期。),而Cache則可以保存CPU剛用過或循環使用的一部分數據,如果CPU需要再次使用該部分數據時可從Cache中直接調用,這樣就避免了重複存取數據,減少了CPU的等待時間,因而提高了系統的效率。Cache又分爲L1 Cache(一級緩存)和L2 Cache(二級緩存),L1 Cache主要是集成在CPU內部,而L2 Cache集成在主板上或是CPU上。
2、cache的工作原理
同樣引用自互動百科:
cache的工作原理是基於程序訪問的局部性。對大量典型程序運行情況的分析結果表明,在一個較短的時間間隔內,由程序產生的地址往往集中在存儲器邏輯地址空間的很小範圍內。指令地址的分佈本來就是連續的,再加上循環程序段和子程序段要重複執行多次。因此,對這些地址的訪問就自然地具有時間上集中分佈的傾向。數據分佈的這種集中傾向不如指令明顯,但對數組的存儲和訪問以及工作單元的選擇都可以使存儲器地址相對集中。這種對局部範圍的存儲器地址頻繁訪問,而對此範圍以外的地址則訪問甚少的現象,就稱爲程序訪問的局部性。
根據程序的局部性原理,可以在主存和CPU通用寄存器之間設置一個高速的容量相對較小的存儲器,把正在執行的指令地址附近的一部分指令或數據從主存調入這個存儲器,供CPU在一段時間內使用。這時提高程序的運行速度有很大的作用。這個介於主存和CPU之間的高速小容量存儲器稱作高速緩衝存儲器(cache)。系統正是依據此原理,不斷地將與當前指令集相關聯的一個不太大塊後繼指令集從內存讀到cache,然後再與CPU高速傳送,從而達到速度匹配。
CPU對存儲器進行數據請求時,通常先訪問cache。由於局部性原理不能保證所訪問數據百分之百地在Cache中,這裏便存在一個命中率的說法。即CPU在任一時刻從Cache中可靠獲取數據的機率。命中率越高,快速正確獲取數據的可靠性就越大。Cache的存儲容量比主存的容量小得多,但不能太小,太小會使命中率太低;也沒有必要過大,過大不僅會增加成本,而且當容量超過一定值後,命中率隨容量的增加將不會有明顯地增長。只要Cache的空間與主存空間在一定範圍內保持適當比例的映射關係,Cache的命中率還是相當高的。一般規定Cache與內存的空間比爲4:1000,即128kB Cache可映射32MB內存;256kB Cache可映射64MB內存。在這種情況下,命中率都在90%以上。至於沒有命中的數據,CPU只好直接從內存獲取。獲取的同時,也把它拷進Cache。以備下次訪問。
3、cache的基本結構
cache通常由相聯存儲器實現。相聯存儲器的每一個存儲塊都具有額外的存儲信息,稱爲標籤(Tag)(後續會詳細講解)。當訪問相聯存儲器時,將地址和每一個標籤同時進行比較,從而對標籤相同的存儲塊進行訪問。
Cache的基本結構中分成三類:
①全相聯cache
②直接映像cache
③組相聯cache
不過手上目前只有486的資料,那麼我就和大家探討一下關於直接映像的這種結構工作過程。(筆者:486上的架構運行就是第二種。這裏我理解不正確的話還望大家指點哦。)其做法是,爲Cache中的每個塊位置分配一個索引字段,用Tag字段區分存放在Cache位置上的不同的塊。單路直接映像把主存儲器分成若干頁,主存儲器的每一頁與cache存儲器的大小相同,匹配的主存儲器的偏移量可以直接映像爲cache偏移量。Cache的Tag存儲器保存着主存儲器的頁地址(頁號)(筆者:通過這個頁號就可以算出main memory中的實際偏移)。從以上可以看出,直接映像cache優於全相聯Cache,能進行快速查找,其缺點是當空存儲器的組之間做頻繁調用時,cache控制器必須做多次轉換。關於這個機構在實際的486上是怎麼運行的,讓我們拭目以待。
4、cache的技術概要
4.1 讀取順序
CPU要讀取一個數據時,首先從Cache中查找,如果找到就立即讀取並送給CPU處理;如果沒有找到,就用相對慢的速度從內存中讀取並送給CPU處理,同時把這個數據所在的數據塊調入Cache中,可以使得以後對整塊數據的讀取都從Cache中進行,不必再調用內存。
正是這樣的讀取機制使CPU讀取Cache的命中率非常高(大多數CPU可達90%左右),也就是說CPU下一次要讀取的數據90%都在Cache中,只有大約10%需要從內存讀取。這大大節省了CPU直接讀取內存的時間,也使CPU讀取數據時基本無需等待。總的來說,CPU讀取數據的順序是先Cache後內存。
4.2 讀取命中率
CPU在Cache中找到有用的數據被稱爲命中,當Cache中沒有CPU所需的數據時(這時稱爲未命中hit miss),CPU才訪問內存。從理論上講,在一顆擁有2級Cache的CPU中,讀取L1 Cache的命中率爲80%。CPU從L1Cache中找到的有用數據佔數據總量的80%,剩下的20%從L2 Cache讀取。由於不能準確預測將要執行的數據,讀取L2的命中率也在80%左右(從L2讀到有用的數據佔總數據的16%)。
爲了保證CPU訪問時有較高的命中率,Cache中的內容應該按一定的算法替換。算法是“最近最少使用算法”(latest recently use LRU算法,後面會詳細探討一下關於LRU算法在486上的運用。),它是將最近一段時間內最少被訪問過的行(line)淘汰出局。這是一種高效、科學的算法,其計數器的判斷過程可以把一些頻繁調用後再不需要的數據淘汰出Cache,提高Cache的利用率。
4.3、WB&WT
WB和WT分別是write back和write through的縮寫。爲了保證cache和main memory的數據一致性而設計的數據更新方法。(筆者:在IA32 programming guide裏有比較詳細的介紹其他的屬性,不過WB和WT是兩種非常典型的方法,今天在這裏拿他們來做詳細的分析。)
①write through
在這種機制下,每當CPU把數據寫到cache中的時候,cache controller就會立即把數據寫入對應的main memory。(這種理解更新的機制叫做snarf,這個單詞網上還查不到翻譯的,所以也就沒有翻譯。)因此,main memory隨時跟蹤cache到最新的數據版本,從而也就不會有main memory將新的數據丟失的問題。不過這樣的話,也有一個顯而易見的缺點,每次更新數據的時候,都會有總線的操作,總線操作就過於頻繁,系統的性能會降低。
②write back
在這種機制下,cache每個區塊的標記中都要設置一個更新爲,CPU對cache中的一個區塊快寫入數據後,更新位置要好標記。(比如說爲1.)由於cache的速度比DRAM的速度可快了很多很多了,如果先check到cache中有需要更新的數據,那麼就會先更新cache中的數據,並且阻止總線把數據寫入到main memory中去。如果再次更新的話,cache會把原來存在cache中的數據先寫回(write back)到main memory,再做cache內部的數據更新。(筆者:後面會詳細講操作過程。)