Cache與主存之間的直接對映,全相聯對映和組項聯對映以及其地址變換

dyw99111發表於2019-03-21

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依次與主存地址中的“主存組號”相對比,命中得資料,非命中不得資料,去主存中尋找。

請讀者一定要深刻理解寫在最前面的二進位制碼的劃分與分組,最好用多位,多分組方式進行嘗試!對理解後續內容有很大幫助。

相關文章