天天看點

Cache – 主存的位址映射及相關計算問題

在開始本篇博文之前,首先來介紹下問題背景,以便于初學者能更好的了解(當然其實我也是個小白),如果大家已經了解問題背景,直接跳過下面兩段,不用聽我多BB。

對于Cache,即高速緩存,是用來解決主存與CPU速度不比對問 題,Cache的出現使得CPU可以不直接通路主存而直接與高速Cache交換資訊。由于程式通路的局部性原理可以很容易設想隻要将 CPU近期要用到的程式和資料提前從主存送到Cache,那麼就可以做到CPU在一定時間内隻通路Cache,這樣CPU與高速Cache進行通信,就大大提高了計算機的運作速度。

在Cache – 主存的位址映射之前,首先要将主存與Cache都分成若幹塊,每塊又包括若幹個字,并使得它們的大小相同(即快内的字數相同)。在劃分好塊後,下面要做的就是将主存塊與Cache塊形成映射就行了。而這裡的映射則是通過塊的位址形成映射關系。對于位址映射,首先将主存位址分成兩塊,高n1位為主存的快位址,低n2位為快内位址。Cache同理也是這樣劃分。這裡我原來一直有一個誤區,就是認為字塊中存放的是資料位址,其實不然,字塊中存放的就是真正使用的資料,隻是映射時使用位址來映射。在一切準備就緒後,就可以進行映射了,下面開始本篇博文的正文。

Cache – 主存的位址映射方式有很多,有直接映射,全相聯映射,組相聯映射。

1.直接映射

在這種映射方式下,每個主存塊至于一個緩存塊相對應,映射關系為:

i=j mod C 或 i=j mod 2c

其中,i為緩存塊号,j為主存塊号。在這種取模方式下,很容易就知道每個緩存塊對應若幹個主存塊。

不廢話直接上圖:

Cache – 主存的位址映射及相關計算問題

下面針對該映射方式,舉一個小例子:

當緩存接收到CPU發送來的主存位址後,隻需根據中間c位字段(假設為00…01)找到緩存塊1,然後根據字塊1的”标記”是否與主存位址的高t位相符合,若符合且有效位為1(這裡的有效位用來識别Cache存儲塊中的額資料是否有效,因為有時Cache中的資料是無效的,例如,在初始時刻Cache中的額内容為空,是無意義的),則表示該Cache塊已和主存中的某塊建立了對應關系,則可根據b位塊内位址從Cache塊中取得對應的字,即找到CPU發來的主存位址在緩存中所對應的資訊;若不符合,或者有效位為”0”,則主存讀入心得字塊來代替舊的字塊,同時将資訊送往CPU,并修改Cache“标記”位。如果有效位為”0”,還得将有效位置為 “1”。

小結:直接相聯映射方式的缺點是不靈活,每個主存塊隻能按照取模固定地映射到某個緩存塊,即使緩存内其他塊空着,也不能用來映射。因而如果程式恰好要重複地使用對應同一緩存塊的不同主存塊,那麼久需要不同的替換,這樣會降低命中率。

2.全相聯映射

為了解決直接相聯映射不靈活的問題,出現了全相聯映射。全相聯映射不是通過字塊号來尋找字塊,而是将主存位址中的标記與緩存中每個字塊的标記進行比較,如果找到與之相同标記的緩存塊,則表明所通路的主存位址在緩存中,之後在Cache中找到緩存塊後,再根據主存位址的低b位找到快内位址,這樣就找到對應的字,也就是需要的資料。因而在這種映射方式下,主存位址中隻需要主存字塊标記和字塊内位址就行。具體的映射和主存位址格式如下:

Cache – 主存的位址映射及相關計算問題

小結:全相聯映射允許将主存中的每一字塊映射到Cache中的任意一塊位置上。顯然這種映射方式相對于直接映射,更加靈活,因而命中率也更高,縮小了塊沖突。

由于需要将主存位址中的标記與每一個緩存塊的标記進行比較,也就使其具有了”按内容尋址”的特點。同時也因為這個特點,所需的邏輯電路較多,成本也比較高,實際的Cache還要采用各種措施來減少比較次數。

3.組相聯映射

針對上述直接映射和全相聯映射出現的問題,現在出現一種折中的映射方式,即下面介紹的組相聯映射。該映射方式将所有Cache分為Q組,每組有R塊,則有以下關系:

i =j mod Q

其中i,j的含義與直接映射中的含義一緻。上述表達式意思即為某一主存塊按模Q将其映射到緩存的第i組内,具體步驟即主存位址格式如下:

Cache – 主存的位址映射及相關計算問題

這裡之是以說組相聯映射是直接映射和全相聯映射的折中,是因為按照直接映射中取模的方式,某個主存塊映射到Cache中的組是固定的,但是在組内,又按照全相聯映射原則,”按内容尋址”,即通過主存字塊标記可以映射到該組中任意一塊Cache塊。

這樣就更好了解了該映射方式下主存的位址格式,首先通過組位址找到Cache塊所在的組,之後按照全相聯映射方式,通過群組内的每一塊比較主存字塊标記來尋找需要的具體字塊,最後通過字塊内位址在Cache塊中找到有效的實體位址。

這裡看似主存位址很複雜,其實隻要知道Cache一共有多少組即可确定組位址的位數,之後字塊内位址與前面兩種映射方式所說的一緻,最後通過總位數減去組位址位數和字塊内位址位數即得主存字塊标記位數。

有個需要記住的小知識點:若每組内有n塊Cache塊,則該種映射方式又稱為n路組相聯。

其實這裡有個轉化方式,當r=0,即每組内有 2r=20=1 塊,那麼此時組相聯即變為直接相聯,同理,r=c,每組内有 2r=2c 塊,即所有的Cache字塊都在一組,那麼此時組相聯即變為全相聯映射。

空口吹誰都會,下面将通過兩個例子更加詳細和直覺地介紹下主存位址格式(這兩題都是唐朔飛老師《計算機組成原理》中的題目,我将用自己的語言平實簡單表達出來,希望大家更好的了解):

例1.假設主存容量為512KB,Cache容量為4KB,每個字塊為16個字,每個字為32位。問:

(1).Cache位址為多少位?可容納多少塊?

(2).主存位址為多少位?可容納多少塊?

(3).在直接映射方式下,主存的第幾塊映射到Cache中的第五塊(設起始字塊号為1)

(4).畫出直接映射方式下主存位址字段中各段的位數。

答:

(1).這裡沒有說按照字還是位元組編址,那麼按照其給的容量的格式,可以得出其預設按照位元組編址。那麼根據容量的計算方法:位址數*字長,則Cache的4KB可得位址數為4K,即 212 個資料單元,每個資料單元為8位,即一個位元組B,那麼就可以得到位址為12位,每塊有16*32位,則4KB的Cache可容納的塊數為:4KB/(16*32位)=64塊。

(2).同一理可得到主存位址為19位,可容納 213 =8192塊.

(3).Cache共有64塊,則按照主存塊号按照64取模為5的主存塊都會映射到Cache中的第5塊,則滿足要求的主存塊号為 5,64+5,2∗64+5,......,213−64+5

(4).要求主存位址格式,首先可以求字塊内位址,由于按照位元組編址,即按照位元組訪存,則最小資料單元為位元組,那麼每個字塊内有 16∗32/8=64 個最小訪存單元,每個單元有一個位址,那麼字塊内就有64個位址,這樣的話字塊内位址就需要6位,即在直接映射下主存位址中b=6,由于Cache共有64個字塊,是以需要6位即有 26 位址才能通路到每個Cache塊,即c=位,是以最終 主存字塊标記位數=主存位址數-字塊位址數-字塊内位址數,即t=19-6-6=7位,是以得到主存位址格式為:

Cache – 主存的位址映射及相關計算問題

例2.假設主存容量為512K*16位,Cache容量為4096*16位,塊長為4個16位的字,訪存位址為字。

(1).在直接映射下,設計主存的位址格式。

(2).在全相聯映射下,設計主存的位址格式。

(3).在二路組相聯映射方式下,設計主存的位址格式。

(4).若主存容量為512K*32位,塊長不變,在四路組相聯映射下,設計主存的位址格式。

答:

(1).按照例1中,用容量除以塊大小得到塊的個數,個數為:(4096*16位)/4*16位=1024= 210 ,是以Cache塊位址位數為10,即c=10,由于這裡按照字訪存,主存位址也很容易得到為19位,對于字塊内位址,字塊内共有4*16位/16位=4個訪存單元,是以就有4個字塊内位址,是以字塊内位址就有2位,即b=2,是以最後求得主存字塊标記有19-10-2=7位,得到主存字塊位址格式:

Cache – 主存的位址映射及相關計算問題

(2).在全相聯映射下,主存位址僅由字塊内位址和主存字塊标記構成,而字塊内位址在(1)中求得為2位,是以這裡的字塊内位址為19-2=17位。此時的主存位址格式為:

Cache – 主存的位址映射及相關計算問題

(3).在二路組相聯映射中,每組有兩個字塊,是以一共有 210/2=29 組,故組位址有9位,即q=9,由于每個字塊到這裡都是沒有變化的,是以字塊内位址仍為2位,即b=2,是以主存字塊标記為19-9-2=8位,故得到主存位址格式為:

Cache – 主存的位址映射及相關計算問題

(4).主存容量為512K*32位,即雙字寬存儲器,即每次可以通路兩個字(最小訪存單元),這裡的訪存位址單元仍為字沒有變,并且塊長仍為4個16位的字,是以字塊内位址仍為2位,而主存容量可以轉為512K*32位=1024K*16位,這樣就可以得到共有1024K個字,即 220 個資料單元,位址數為 220 ,是以主存位址有20位。同時,這裡改為四路相聯組映射,即每個Cache組内有4個Cache塊,是以共有 210/4=28 組,是以組位址為8位,即q=8,這樣得到主存字塊标記有20-8-2=10位,得到如下主存字塊位址格式:

Cache – 主存的位址映射及相關計算問題

總結:

1.直接映射為固定的映射關系,不靈活。

2.全相聯映射為靈活性映射關系,通過主存字塊标記,以按内容尋址的方式查找緩存塊。

3.組相聯映射為上述兩種的折中,主存塊被配置設定到固定組的任意一個緩存塊。

4.在求主存位址格式時,要找好各字段的位數,尤其要注意訪存位址單元是字還是位元組。

PS:不得不說雖然最近複習組成原理,作業系統,計算機網絡,複習到頭大,不過也确實讓我的新部落格也有了更多的素材,這才使得我的部落格稍微熱鬧起來。這篇部落格算是講的比較詳細了,因而相對于大神來說廢話也比較多,其實是比較照顧比我還小白的小白,是以小白可以好好看看,大神可以點過贊之後直接繞道,哈哈~總之,祝大家複習好運~

繼續閱讀