lightseed
2009-11-12
另外,由於關於cache的東西比較多(當然其實有兩個大的方向,就是資料一致性和執行機制,掌握了這兩個大的目標我想cache對於您來說就不算什麼難事了。),所以我準備把整理好的小結分成三篇文章放到blog裡。這樣可以降低每一篇文章的篇幅。否則篇幅太長,我擔心大家會睡著了。呵呵。。。(開玩笑啦。)
引用自互動百科裡面關於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上。
同樣引用自互動百科:
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。以備下次訪問。
cache通常由相聯儲存器實現。相聯儲存器的每乙個儲存塊都具有額外的儲存資訊,稱為標籤
(tag)(後續會詳細講解)。當訪問相聯儲存器時,將位址和每乙個標籤同時進行比較,從而對標籤相同的儲存塊進行訪問。
cache的基本結構中分成三類:
①全相聯cache
②直接映像cache
③組相聯cache
不過手上目前只有486的資料,那麼我就和大家**一下關於直接映像的這種結構工作過程。(筆者:486上的架構執行就是第二種。這裡我理解不正確的話還望大家指點哦。)其做法是,為cache中的每個塊位置分配乙個索引字段,用tag欄位區分存放在cache位置上的不同的塊。單路直接映像把主儲存器分成若干頁,主儲存器的每一頁與cache儲存器的大小相同,匹配的主儲存器的偏移量可以直接映像為cache偏移量。cache的tag儲存器儲存著主儲存器的頁位址(頁號)(筆者:通過這個頁號就可以算出main memory中的實際偏移)。從以上可以看出,直接映像cache優於全相聯cache,能進行快速查詢,其缺點是當空儲存器的組之間做頻繁呼叫
時,cache控制器必須做多次轉換。關於這個機構在實際的486上是怎麼執行的,讓我們拭目以待。
cpu要讀取乙個資料時,首先從cache中查詢,如果找到就立即讀取並送給cpu處理;如果沒有找到,就用相對慢的速度從記憶體中讀取並送給cpu處理,同時把這個資料所在的資料塊調入cache中,可以使得以後對整塊資料的讀取都從cache中進行,不必再呼叫記憶體。
正是這樣的讀取機制使cpu讀取cache的命中率
非常高(大多數cpu可達90%左右),也就是說cpu下一次要讀取的資料90%都在cache中,只有大約10%需要從記憶體讀取。這大大節省了cpu直接讀取記憶體的時間
,也使cpu讀取資料時基本無需等待。總的來說,cpu讀取資料
的順序是先cache後記憶體。
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的利用率
。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內部的資料更新。(筆者:後面會詳細講操作過程。)
我所認知的BIOS Cache 1
lightseed 2009 11 12 另外,由於關於cache的東西比較多 當然其實有兩個大的方向,就是資料一致性和執行機制,掌握了這兩個大的目標我想cache對於您來說就不算什麼難事了。所以我準備把整理好的小結分成三篇文章放到blog裡。這樣可以降低每一篇文章的篇幅。否則篇幅太長,我擔心大家會...
我所認知的BIOS ADU exe
by lightseed 2009 5 12 在學習的過程中,肯定會要用不少的工具,作為底層的 engineer 那麼用的工具大多是 dos下。在 dos下所用的工具對於一般的人來說 相對於當今流行的圖形介面的作業系統 總是感覺比較陌生,也批著一層神秘的面紗。那麼今天我就以我最常用的 adu.exe...
我所認知的 ANT DESIGN
由於工作的關係對於 react 並沒有過度的深入,因此對 ant design 並無太多了解。當然也是因為工作中存在大量的 angular 專案,後來ng zorro antd的發布引起我極大的關注。當我決定基於ng zorro antd發布一款企業後台管理模板 ng alain 之前,我深深被 a...