Cache與主存之間的直接對映,全相聯對映和組項聯對映以及其地址變換
Cache與主存之間的直接對映,全相聯對映和組項聯對映以及其地址變換
首先先解釋一些比較基礎的東西
1.cache是什麼?
Cache是高速緩衝儲存器,位於CPU和主存之間,比較小,速度比較快。
2.為什麼要有cache?
Cache類似與word裡的剪下板,在word的剪下板中,儲存著最近幾次複製或者剪下的內容,這樣的話可以提高複製貼上的效率,不需要每一次都回到原來的地方crtl+c。cache也一樣,裡面儲存著最近幾次cpu從主存中呼叫的資料,當計算機需要再次呼叫這些資料時,無需再去主存中尋找,可以直接從cache中取得。
3.從cache中取資料的指令和從主存中取資料的指令有區別嗎?
很多人會認為從cache中取資料和從主存中取資料使用的是不同的指令,但其實不是這樣的,cpu取資料指令的執行順序是先去cache中尋找,未命中後再取主存中尋找。因此在呼叫資料時,cpu發出的指令中的地址使用的是主存地址。
例如:
Ldr r1,0x32
其中0x32指的是主存地址
4.Tag與valid位儲存位置
Tag與valid位也儲存在cache中,但他們儲存在cache中的CAM中,和資料是分開儲存的。但二者之間是有對應關係的。二者對應組成一個cache line(可以百度一下),因此,cache的儲存空間是和系統一致的,這裡認為是32位,tag和valid是另外儲存的,很多人由於cache line的圖示表示方法而對cache的儲存位數產生了疑惑,希望上述的說明可以幫助解決。
5.對於一個確定的硬體,cache的地址,與主存的地址是不變的,不同的對映方式變化的是對映關係而非地址本身。
塊的概念(Block)
首先,arm中的地址,是以位元組(Byte)標記的,意思是假設一個位元組的地址是a,那麼a+1指的是其下一個位元組。一個字包含有四個位元組。說明一個字覆蓋了四個地址。
那麼塊(Block)指的是把幾個字結合在一起考慮,打個比方,如果把對映問題比作分配車位停車問題,那麼塊的概念就好比每家每戶有幾輛車一樣,如果每一家都只有一輛車,那麼我們的車位就是以一個一個來分配,如果每家每戶都有兩輛車,那麼就以兩個車位為一組進行分配,如果每家都有三輛車,那麼車位就以三個三個為一組分配……因此可以看出,不管每家每戶的車輛數n到底是多少,只要車位以n個為一組,那麼問題的解決過程是完全一樣的。
那麼不同的塊究竟會有什麼樣的影響?答案就是offset的位數,這個問題接下來討論。
地址的劃分
有一片16位的空間,我用二進位制對其編號,現在我訴說如下的分組方式:
兩個為一組,四組為一區
那麼每一個空間就有一個位置的文字描述。
(寫完這些我已經不認識“第”這個字了。。)
如此繁瑣的表示方式,可以用二進位制進行簡化。比如區有兩個,那麼就用0和1表示,組有四個,就以00、01、10、11分別表示,來簡化我的漢字表示。
神奇的事情是,以這種方式翻譯後的二進位制數碼,和在沒有分組之前的編號是一樣的。也就是說,原來的二進位制碼也就可以表示為:區號1位+組號兩位+個數1位。
讀者可以嘗試更多數位,各種不同的劃分方式,結果是一樣的。若讀者學習過數字邏輯,可以更清楚地理解我想表達的意思。
現在回到offset的問題。Offset用於標記塊內的資料位置。如果是兩個位元組,注意是位元組,為一塊,那麼為了標記這兩個資料,那麼offset就是其地址中的最後一位,就像上述的例子中,每組有兩個,那麼最後一位就是對其的標記,如果是四個位元組為一塊,那麼offset就是地址的最後兩位,如果是八個位元組,就是最後三位。
因此塊的劃分只要cache和主存保持一致,並相應的在地址後留出相匹配的offset位,本質上是沒有任何區別的。
上述所說也是後續地址變換的基礎,請讀者務必理解,並且最好用較多的二進位制數位嘗試。
對映方式
大概看懂了前面這些就可以說對映方式了。
對映方式說明大概是是一張圖+地址劃分+tag內容+尋找方式
直接對映
在圖示的例子中,cache有八塊,那麼主存就劃分為以8塊為一組的n組,每一組的塊x,能且只能放入cache的塊x中。
直接對映的地址劃分
Cache地址:塊號+offset
主存地址:組號+塊號+offset
但是cache中只能儲存一個資料,我們怎麼知道cache的塊x究竟儲存的時哪一組的塊x呢?那麼我們就需要tag位。
直接對映的tag位:組號,就是主存的前幾位。
尋找地址的時候,首先,cpu發出的指令中包含了他需要資料的主存地址,其中包括了塊號和offset,這就是可能儲存這一資料的cache地址,因此,計算機“前往”這一部分所指向的cache,然後地址中還包含著組號,計算機“前往”這個cache對應的tag中,看裡面儲存的tag是不是一致,一致即為命中,不一致說明這個資料不在cache裡,計算機只能老老實實地“前往”主存中尋找資料。
讀者要著重理解,在這種對映關係下,對應的主存地址=組號+cache地址,而tag是cache真正儲存的那一個資料的組號,所以有些地方所寫的“主存地址=tag+cache地址“”是有些許不合適的。
全相聯對映
全相聯我沒有畫箭頭,因為對映關係很簡單,主存中的所有塊,都可以放在cache中的任意一塊中。
Cache地址:cache塊號+offset
主存地址=主存塊號+offset
Tag中內容:主存塊號
尋找內容時,計算機“拿著”主存的地址,“前往”cache,將手中主存地址中包含的塊資訊,與所有的tag一個一個比較,如果找到,那麼立即命中,拿走資料,如果沒命中,那麼不好意思,之前的一切都是徒勞,計算機只能“前往”主存中尋找。
`
組相聯對映
先將cache分為2組,每組4塊,而主存中以2個為一組,每組第一塊,可以放在cache組0中,每組第二塊,可以放在cache組1中。到這一部分還和直接對映沒什麼區別,但是一個資料可以放在一個組中,,具體放在這個組中的第幾塊,是沒有限制的。這和全相聯一致。
Cache地址:組號+組內塊號+offset
主存地址:主存組號+組內塊號+offset
Tag:主存組號
Cpu指令中包含著主存地址,先根據其中的““組內塊號”,尋找cache中對應的“組號”。對於這一組cache,計算機將其的tag依次與主存地址中的“主存組號”相對比,命中得資料,非命中不得資料,去主存中尋找。
請讀者一定要深刻理解寫在最前面的二進位制碼的劃分與分組,最好用多位,多分組方式進行嘗試!對理解後續內容有很大幫助。
相關文章
- 修改對映地址
- JPA關係對映系列四:many-to-many 關聯對映
- Mybatis實體關聯對映MyBatis
- mybatis關聯關係對映MyBatis
- 業務物件對映到表之間的關聯問題!!物件
- MyBatis實現一對一關聯對映MyBatis
- Hibernate 的關聯關係對映
- hibernate 關係對映之 主鍵關聯一對一
- 【Docker】Docker基礎-埠對映與容器互聯Docker
- day07-MyBatis的關聯對映01MyBatis
- Three.js進階篇之9 - 紋理對映和UV對映JS
- 多重對映
- MyBatis系列之對映檔案之sql、Parameters、cache和cache-refMyBatisSQL
- 基於直接地址對映的CMAC神經網路Mac神經網路
- MyBatis(四) 對映器配置(自動對映、resultMap手動對映、引數傳遞)MyBatis
- Scala學習(四)---對映和元組
- TypeScript 之對映型別TypeScript型別
- juniper SRX 地址埠對映設定
- ASM file和file alias之間的對映關係!ASM
- Generic:型別和值之間的對映 (轉)型別
- HDR與色調對映
- mybatis入門基礎(四)----輸入對映和輸出對映MyBatis
- UI與實體的對映UI
- Mybatis學習筆記(5)-高階對映之多對多對映MyBatis筆記
- JavaEE MyBatis關聯對映之多對多(教材學習筆記)JavaMyBatis筆記
- 埠對映,內網網站對映外網訪問,透過80埠對映實現內網網站
- ElasticSearch中的對映Elasticsearch
- NDK java的對映Java
- JPA關係對映系列五:many-to-many 關聯表存在額外欄位關係對映
- [非專業翻譯] Mapster - 對映前&對映後
- 如何管理資料模型與業務模型之間對映?模型
- iOS JSON與Object之間的對映 ObjectMapper For SwiftiOSJSONObjectAPPSwift
- Mybatis學習筆記(4)-高階對映之一對多對映MyBatis筆記
- Mybatis學習筆記(3)—高階對映之一對一對映MyBatis筆記
- 思考工具之概念對映 | Untools
- python字元對映表和字元替換Python字元
- wince6.0下的實體地址對映和共享
- NAT(PAT)與埠對映(轉)