1. 程式人生 > >主存與Cache的地址映射

主存與Cache的地址映射

來看 交通 結構 寫入 資料 需要 operate mri wol

  最近在復習計算機體系結構,選用的教材是名聞遐邇的《計算機體系結構 量化研究方法 第五版》(Computer Architecture A Quantitative Approach), 關於cache部分,書中著重講的是如何優化cache,提高cache性能,提出了10種優化策略,但是關於cache與內存(一般稱主存)之間的讀寫過程,cache與主存的地址映射書中講的比較少,所以本文參考了coursera上 北京大學陸俊林的《 計算機組成》以及上海交通大學鄧倩妮老師的《計算機體系結構》的相關ppt及參閱部分網上資料寫成,歡迎批評指正。

  CPU對存儲器的訪問,通常是一次讀寫一個字單元。當CPU

Cache不命中時,需將存儲在主存中的字單元連同其後若幹個字一同調入Cache中,之所以這樣做,是為了使其後的訪存能在Cache中命中。因此,主存和Cache之間一次交換的數據單位應該是一個數據塊。數據塊的大小是固定的,由若幹個字組成,且主存和Cache的數據塊大小是相同的。

Cache-主存層次實現的目標看,一方面既要使CPU的訪存速度接近於訪Cache的速度,另一方面為用戶程 序提供的運行空間應保持為主存容量大小的存儲空間。在采用Cache-主存層次的系統中,Cache對用戶程序而言是透明的,也就是說,用戶程序可以不需要知道Cache的存在。因此,CPU每次訪存時,依然和未使用Cache

的情況一樣,給出的是一個主存地址。但在Cache-主存層次中,CPU首先訪問的是Cache,並不是主存。為此,需要一種機制將CPU的訪主存地址轉換成訪Cache地址。而主存地址與Cache地址之間的轉換是與主存塊與 Cache塊之間的映射關系緊密聯系的,也就是說,當CPUCache未命中時,需要將欲訪問的字所在主存中的塊調入Cache中,按什麽樣的策略調入,直接影響到主存地址與Cache地址的對應關系,這也就是本小節要解決的主存與Cache的地址映射問題。

主要有三種地址映射方式,分別為全相聯映射、直接相聯映射和組相聯映射。

1. 全相聯映射

全相聯映射是指主存中任一塊都可以映射到Cache

中任一塊的方式,也就是說,當主存中的一塊需調入Cache時,可根據當時Cache的塊占用或分配情況,選擇一個塊給主存塊存儲,所選的Cache塊可以是Cache中的任意一塊。例如,設Cache共有2C塊,主存共有2M塊,當主存的某一塊j需調進Cache中時,它可以存入Cache的塊0、塊1、塊i或塊2C -1的任意一塊上。如圖4-28所示。

技術分享

4-28全相聯映射方式

在全相聯映射方式下,CPU的訪主存地址為如下形式:

技術分享

其中,M為主存的塊號,W為塊內的字號。而CPUCache的地址形式為:

技術分享

其中,CCache的塊號,W為塊內的字號。

主存地址到Cache地址的轉換是通過查找一個由相聯存儲器實現的塊表來完成的,其形成過程如圖4-29示。

技術分享

4-29全相聯映射的地址轉換

當 一個主存塊調入Cache中時,會同時在一個存儲主存塊號和Cache塊號映射表的相聯存儲器中進行登記。CPU訪存時,首先,根據主存地址中的主存塊號 M在相聯存儲器中查找Cache塊號,若找到,則本次訪Cache命中,於是將對應的Cache塊號取出,並送訪Cache地址的塊號C字段;緊接著將主 存地址的塊內字號W直接送Cache地址的塊內字號W字段,從而形成一個訪Cache的地址;最後根據該地址完成對Cache單元的訪問.

全相聯映射方式的優點是Cache的空間利用率高,但缺點是相聯存儲器龐大,比較電路復雜,因此只適合於小容量的Cache之用。

2. 直接相聯映射

直接相聯映射方式是指主存的某塊j只能映射到滿足如下特定關系的Cachei中:

ij mod 2C 4.2

技術分享

4-30直接相聯映射方式

上圖中,主存的第02C、2C1塊只能映射到Cache的第0塊,主存的第12C+12C1+1塊只能映射到Cache的第1塊,… … ,主存的第2C-12C1-12M-1塊只能映射到Cache的第2C-1塊。

在直接相聯映射方式下,CPU的訪主存地址為如下形式:

技術分享

其中,T為標誌號,CCache的塊號,W為塊內的字號。在這裏,原主存的塊號M實際上被分成了兩個字段:TC,其中C用於指出主存的塊可以映射的Cache的塊。一般來講,主存的塊數是Cache的塊數的整數倍,也就是說主存的塊數2M和Cache的塊數2C滿足關系式:2M=n·2C

在直接相聯映射方式下,標誌號T是隨Cache的每個塊一起存儲的,其地址轉換過程如圖4-31所示。

技術分享

4-31直接相聯映射的地址轉換

當一個主存塊調入 Cache中時,會同時將主存地址的T標誌存入Cache塊的標誌字段中。當CPU送來一個訪存地址時,首先,根據該主存地址的C字段找到Cache的相 應塊,然後將該塊標誌字段中存放的標誌與主存地址的T標誌進行比較,若相符,說明主存的塊目前已調入該Cache塊中,則命中,於是使用主存地址的W字段 訪問該Cache塊的相應字單元;若不相符,則未命中,於是使用主存地址直接訪主存。

直接相聯映射方式的優點 是比較電路最簡單,但缺點是Cache塊沖突率較高,從而降低了Cache的利用率。由於主存的每一塊只能映射到Cache的一個特定塊上,當主存的某塊 需調入Cache時,如果對應的Cache特定塊已被占用,而Cache中的其它塊即使空閑,主存的塊也只能通過替換的方式調入特定塊的位置,不能放置到 其它塊的位置上。

3. 組相聯映射

以上兩種方式各有優缺 點,而且非常有趣的是,它們的優缺點正好相反,也就是說,對於全相聯映射方式來說為優點的恰是直接相聯映射方式的缺點,而對於全相聯映射方式來說為缺點的 恰是直接相聯映射方式的優點。那麽,可否找到一種能較好地兼顧這兩種方式的優點的映射方式呢?下面我們就來看看組相聯映射方式 在這種方式下,將Cache分成2u組,每組包含2v塊。主存的塊與Cache的組之間采用直接相聯映射,而與組內的各塊則采用全相聯映射。也就是說,主存的某塊只能映射到Cache的特定組中的任意一塊。主存的某塊jCache的組k之間滿足如下關系:

kj mod 2u 4.3

設主存共有22u塊(即Ms+u),則它們的映射關系如下圖4-32示。

技術分享

4-32組相聯映射方式

圖中,主存的塊02u、2u1(2s-1)2u可以映射到Cache的第0組的任意一塊,主存的塊12u+12u1+1(2s-1)2u+1可以映射到Cache的第1組的任意一塊,… … ,主存的塊2u-12u1-12M-1可以映射到Cache的第2u-1組的任意一塊。

在組相聯映射方式下,CPU的訪主存地址和訪Cache地址分別為如下形式:

技術分享

其中,uCache的組號,v為組內的塊號。Cache的塊號Cu+v,而主存的塊號Ms+u。也就是說,主存塊地址的後u位指出了主存的這一塊所能映射的Cache的組。

與全相聯映射方式類似的是,在組相聯映射方式下,主存地址到Cache地址的轉換也是通過查找一個由相聯存儲器實現的塊表來完成的,其形成過程如圖4-33所示。

技術分享

4-33組相聯映射的地址轉換

當一個主存塊調入Cache中時,會同時將其主存塊地址的前s位寫入一個由相聯存儲器實現的快表的對應Cache塊項的s字段中。例如,設主存的某塊調入Cache的第1組的第2塊中,則在快表的組13項的s字段會登記下該主存塊地址的前s位。

CPU訪存時,首先,根據主存地址中的主存塊號中的u字段找到快表的相應組,然後將該組的所有項的前s位同時與主 存地址的s字段作比較,若相符,則說明主存塊在Cache中,於是將Cache中該項的v字段取出,作為Cache地址的v字段,而Cache地址的uW字段直接由主存地址的uW字段形成,最後形成一個完整的訪Cache地址。當然,若比較結果是沒有相符項,則未命中,由主存地址直接訪主存。

其實,全相聯映射和直接相聯映射可以看成是組相聯映射的兩個極端情況。若u0vC,則Cache只包含1組,此即全相聯映射方式;若uCv0,則組內的塊數等於1,此即直接相聯映射。

在實際應用中,相聯映射方式每組的塊數一般取值較小,典型值為24816等,分別稱為兩路組相聯、四路組相 聯等。這樣一方面使得比較器的規模較小,實現較容易,例如兩路組相聯采用兩路比較,四路組相聯采用四路比較等;另一方面,Cache每組增加的可映射塊數 可有效減少沖突,提高Cache訪問的命中率。

1.高速緩沖存儲器的功能、結構與工作原理
高速緩沖存儲器是存在於主存與CPU之間的一級存儲器, 由靜態存儲芯片(SRAM)組成,容量比較小但速度比主存高得多, 接近於CPU的速度。 Cache的功能是用來存放那些近期需要運行的指令與數據。目的是提高CPU對存儲器的訪問速度。為此需要解決2個技術問題:一是主存地址與緩存地址的映象及轉換; 二是按一定原則對Cache的內容進行替換。
Cache的結構和工作原理如圖2.3.1所示。


主要由三大部分組成:
Cache存儲體:存放由主存調入的指令與數據塊。
地址轉換部件:建立目錄表以實現主存地址到緩存地址的轉換。
替換部件:在緩存已滿時按一定策略進行數據塊替換,並修改地址轉換部件。
2.地址映象與轉換
地址映象是指某一數據在內存中的地址與在緩沖中的地址,兩者之間的對應關系。下面介紹三種地址映象的方式。
1.全相聯方式
地址映象規則:主存的任意一塊可以映象到Cache中的任意一塊
(1) 主存與緩存分成相同大小的數據塊。
(2) 主存的某一數據塊可以裝入緩存的任意一塊空間中。
全相聯方式的對應關系如圖2.3.2所示。如果Cache的塊數為Cb,主存的塊數為Mb,則映象關系共有Cb×Mb種。
圖2.3.3示出了目錄表的格式及地址變換規則。 目錄表存放在相關(聯)存儲器中,其中包括三部分:數據塊在主存的塊地址、存入緩存後的塊地址、及有效位(也稱裝入位)。由於是全相聯方式,因此,目錄表的容量應當與緩存的塊數相同。
舉例:某機主存容量為1M,Cache的容量為32KB, 每塊的大小為16個字(或字節)。 劃出主、緩存的地址格式、 目錄表格式及其容量。
容量:與緩沖塊數量相同即211=2048(或32K/16=2048)。
優點:命中率比較高,Cache存儲空間利用率高。
缺點:訪問相關存儲器時,每次都要與全部內容比較,速度低,成本高,因而應用少。
2.直接相聯方式
地址映象規則: 主存儲器中一塊只能映象到Cache的一個特定的塊中。
(1) 主存與緩存分成相同大小的數據塊。
(2) 主存容量應是緩存容量的整數倍,將主存空間按緩存的容量分成區,主存中每一區的塊數與緩存的總塊數相等。
(3) 主存中某區的一塊存入緩存時只能存入緩存中塊號相同的位置。
圖2.3.4示出了直接相聯映象規則。 可見,主存中各區內相同塊號的數據塊都可以分別調入緩存中塊號相同的地址中,但同時只能有一個區的塊存入緩存。由於主、緩存塊號相同,因此,目錄登記時,只記錄調入塊的區號即可。
圖2.3.5示出了主、 緩沖地址格式、目錄表的格式及地址變換規則。主、緩存塊號及塊內地址兩個字段完全相同。目錄表存放在高速小容量存儲器中,其中包括二部分:數據塊在主存的區號和有效位。目錄表的容量與緩存的塊數相同。
地址變換過程:用主存地址中的塊號B去訪問目錄存儲器, 把讀出來的區號與主存地址中的區號E進行比較, 比較結果相等,有效位為1,則Cache命中,可以直接用塊號及塊內地址組成的緩沖地址到緩存中取數;比較結果不相等,有效位為1, 可以進行替換,如果有效位為0,可以直接調入所需塊。
優點:地址映象方式簡單,數據訪問時,只需檢查區號是否相等即可,因而可以得到比較快的訪問速度,硬件設備簡單。
缺點:替換操作頻繁,命中率比較低。
舉例:上例中,主存容量為1M, Cache的容量為32KB,每塊的大小為16個字(或字節)。劃出主、緩存的地址格式、目錄表格式及其容量。
容量:與緩沖塊數量相同即211=2048(或32K/16=2048)。
3.組相聯映象方式
組相聯的映象規則:
(1) 主存和Cache按同樣大小劃分成塊。
(2) 主存和Cache按同樣大小劃分成組。
(3) 主存容量是緩存容量的整數倍,將主存空間按緩沖區的大小分成區,主存中每一區的組數與緩存的組數相同。
(4) 當主存的數據調入緩存時,主存與緩存的組號應相等,也就是各區中的某一塊只能存入緩存的同組號的空間內,但組內各塊地址之間則可以任意存放, 即從主存的組到Cache的組之間采用直接映象方式;在兩個對應的組內部采用全相聯映象方式。
圖2.3.6示出了組相聯的映象關系, 圖中緩存共分Cg個組,每組包含有Gb塊; 主存是緩存的Me倍,所以共分有Me個區, 每個區有Cg組,每組有Gb塊。那麽, 主存地址格式中應包含4個字段:區號、區內組
號、組內塊號和塊內地址。 而緩存中包含3個字段:組號、組內塊號、塊內地址。主存地址與緩存地址的轉換有兩部分,組地址是按直接映象方式,按地址進行訪問,而塊地址是采用全相聯方式,按內容訪問。組相聯的地址轉換部件也是采用相關存儲器實現,見圖2.3.7。
相關存儲器中每個單元包含有: 主存地址中的區號E與組內塊號B,兩者結合在一起,其對應的字段是緩存塊地址b。相關存儲器的容量,應與緩存的塊數相同。當進行數據訪問時,先根據組號,在目錄表中找到該組所包含的各塊的目錄,然後將被訪數據的主存區號與組內塊號,與本組內各塊的目錄同時進行比較。如果比較相等,而且有效位為“1”則命中。
可將其對應的緩存塊地址b送到緩存地址寄存器的塊地址字段,與組號及塊內地址組裝即形成緩存地址。如果比較不相等,說明沒命中,所訪問的數據塊尚沒有進入緩存,則進行組內替換;如果有效位為0,則說明緩存的該塊尚未利用, 或是原來數據作廢,可重新調入新塊。
優點:塊的沖突概率比較低,塊的利用率大幅度提高,塊失效率明顯降低。
缺點:實現難度和造價要比直接映象方式高。

主存與Cache的地址映射

由於Cache比主存小的多,因此必須使用一種機制將主存地址定位到Cache中,即地址映射。這個映射過程全部由硬件實現,對程序員透明。

1. 地址映射方法:

采用查表法(用專用快速硬件實現表格)
表中內容:映射的Cache地址、標記(命中判斷)、有效位

2. 地址映射的三種方式:

(1)全相聯映射方式

· 任一主存塊能映射到Cache中任意行(主存塊的容量等於Cache行的容量),見圖1:

· 映射過程:(見圖2)

① 存入Cache:塊表標記中存放主存的塊號
 
② 檢索:訪問主存地址的塊號與所有Cache行標記比較(圖2陰影區)

· 符合, 即數據在Cache中,形成訪問Cache的地址(地址映射),訪問Cache;
· 不符合:訪問主存,並將該塊調入Cache。

· 優點:靈活,不易產生沖突;
缺點:比較電路難於實現,且效率低,速度慢。

技術分享

技術分享

例:設訪問存儲器地址的塊號序列為22、26、22、26、16、4、16、18,采用全相聯映射方式時,Cache行分配情況(見圖3)。

技術分享

全相聯映射方式實例演示

(2)直接映射方式

直接映射方式實例演示

· 某一主存塊只能能映射到Cache的特定行,見圖4:

i = j  mod m    其中: i:Cache的行號;
j:主存的塊號;
m:Cache的總行數。

· 映射過程:(見圖5)

① 存入Cache:快表標記中存放主存地址的區號
(將塊地址分為二部分:· 塊(行)地址 · 標記(區號))

② 檢索:根據訪問主存地址的中間字段(行號),找到Cache快表中的這一行,讀取該行中的標記字段與主存地址高位字段(區號)比較(圖5陰影區)

· 符合:即數據在Cache中,形成訪問Cache的地址(地址映射),訪問Cache;
· 不符合:訪問主存,並將該塊調入Cache。
· 優點:硬件簡單,成本低;
缺點:容易產生沖突,易"顛簸",不能有效利用Cache空間。

顛簸:例:頻繁訪問主存地址塊序列0、m、0、m,則Cache中  第0行信息只能頻繁調進調出,即出現顛簸現象。

技術分享

例:訪問存儲器地址序列為22、26、22、26、16、4、16、18,采用直接映射方式時,Cache行分配情況(見圖6)。

技術分享

(3)組相聯映射方式
 
組相聯映射方式實例演示

組相聯映射方式   是全相聯映射方式和直接相聯映射方式的結合,結合兩者的優點

· 方法:把Cache分為若幹組,每組含有若幹行。
組間直接映射,組內全相聯映射。 (圖7)

· 映射過程:(見圖8)

① 存入Cache:快表標記中存放主存地址的區號及塊號(將塊地址分為三部分: · 塊(行)地址· 組號· 標記(區號))

② 檢索:根據訪問主存地址的第二字段(組號),找到Cache中的相應組,讀取該組中的每一行標記字段與主存地址高位字段(區號)及塊號比較(圖8陰影區)
· 符合:即數據在Cache中,形成訪問Cache的地址(地址映射),訪問Cache;
· 不符合:訪問主存,並將該塊調入Cache。

· 優點:結合上面兩種的優點。

① 因為組內行數較少,比較器容易實現;
② 組內又有靈活性,沖突大大減少。

技術分享

技術分享

例1:設Cache有8個行,分成2個組,設訪問存儲器地址的塊號序列為22、26、22、26、16、4、16、18,采用組相聯映射方式時,Cache行分配情況(見圖9)。

技術分享

摘自:主存與Cache的地址映射

主存與Cache的地址映射

Cache和主存的三種映射方式

主存與Cache的地址映射