最近在複習計算機體系結構,選用的教材是名噪一時的《計算機體系結構 量化研究方法 第五版》(Computer Architecture A Quantitative Approach), 關於cache部分,書中着重講的是如何優化cache,提升cache性能,提出了10種優化策略,可是關於cache與內存(通常稱主存)之間的讀寫過程,cache與主存的地址映射書中講的比較少,因此本文參考了coursera上 北京大學陸俊林的《 計算機組成》以及上海交通大學鄧倩妮老師的《計算機體系結構》的相關ppt及參閱部分網上資料寫成,歡迎批評指正。html
CPU對存儲器的訪問,一般是一次讀寫一個字單元。當CPU訪Cache不命中時,需將存儲在主存中的字單元連同其後若干個字一同調入Cache中,之因此這樣作,是爲了使其後的訪存能在Cache中命中。所以,主存和Cache之間一次交換的數據單位應該是一個數據塊。數據塊的大小是固定的,由若干個字組成,且主存和Cache的數據塊大小是相同的。程序員
從Cache-主存層次實現的目標看,一方面既要使CPU的訪存速度接近於訪Cache的速度,另外一方面爲用戶程 序提供的運行空間應保持爲主存容量大小的存儲空間。在採用Cache-主存層次的系統中,Cache對用戶程序而言是透明的,也就是說,用戶程序能夠不須要知道Cache的存在。所以,CPU每次訪存時,依然和未使用Cache的狀況同樣,給出的是一個主存地址。但在Cache-主存層次中,CPU首先訪問的是Cache,並非主存。爲此,須要一種機制將CPU的訪主存地址轉換成訪Cache地址。而主存地址與Cache地址之間的轉換是與主存塊與 Cache塊之間的映射關係緊密聯繫的,也就是說,當CPU訪Cache未命中時,須要將欲訪問的字所在主存中的塊調入Cache中,按什麼樣的策略調入,直接影響到主存地址與Cache地址的對應關係,這也就是本小節要解決的主存與Cache的地址映射問題。緩存
主要有三種地址映射方式,分別爲全相聯映射、直接相聯映射和組相聯映射。性能
1. 全相聯映射優化
全相聯映射是指主存中任一塊均可以映射到Cache中任一塊的方式,也就是說,當主存中的一塊需調入Cache時,可根據當時Cache的塊佔用或分配狀況,選擇一個塊給主存塊存儲,所選的Cache塊能夠是Cache中的任意一塊。例如,設Cache共有2C塊,主存共有2M塊,當主存的某一塊j需調進Cache中時,它能夠存入Cache的塊0、塊一、…、塊i、… 或塊2C -1的任意一塊上。如圖4-28所示。spa
圖4-28全相聯映射方式htm
在全相聯映射方式下,CPU的訪主存地址爲以下形式:blog
其中,M爲主存的塊號,W爲塊內的字號。而CPU訪Cache的地址形式爲:內存
其中,C爲Cache的塊號,W爲塊內的字號。ci
主存地址到Cache地址的轉換是經過查找一個由相聯存儲器實現的塊表來完成的,其造成過程如圖4-29示。
圖4-29全相聯映射的地址轉換
當 一個主存塊調入Cache中時,會同時在一個存儲主存塊號和Cache塊號映射表的相聯存儲器中進行登記。CPU訪存時,首先,根據主存地址中的主存塊號 M在相聯存儲器中查找Cache塊號,若找到,則本次訪Cache命中,因而將對應的Cache塊號取出,並送訪Cache地址的塊號C字段;緊接着將主 存地址的塊內字號W直接送Cache地址的塊內字號W字段,從而造成一個訪Cache的地址;最後根據該地址完成對Cache單元的訪問.
全相聯映射方式的優勢是Cache的空間利用率高,但缺點是相聯存儲器龐大,比較電路複雜,所以只適合於小容量的Cache之用。
2. 直接相聯映射
直接相聯映射方式是指主存的某塊j只能映射到知足以下特定關係的Cache塊i中:
i=j mod 2C (4.2)
圖4-30直接相聯映射方式
上圖中,主存的第0、2C、2C+一、… 塊只能映射到Cache的第0塊,主存的第一、2C+一、2C+1+一、… 塊只能映射到Cache的第1塊,… … ,主存的第2C-一、2C+1-一、…2M-1塊只能映射到Cache的第2C-1塊。
在直接相聯映射方式下,CPU的訪主存地址爲以下形式:
其中,T爲標誌號,C爲Cache的塊號,W爲塊內的字號。在這裏,原主存的塊號M實際上被分紅了兩個字段:T和C,其中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的特定組中的任意一塊。主存的某塊j與Cache的組k之間知足以下關係:
k=j mod 2u (4.3)
設主存共有2s×2u塊(即M=s+u),則它們的映射關係以下圖4-32示。
圖4-32組相聯映射方式
圖中,主存的塊0、2u、2u+一、…、(2s-1)2u能夠映射到Cache的第0組的任意一塊,主存的塊一、2u+一、2u+1+一、…、(2s-1)2u+1能夠映射到Cache的第1組的任意一塊,… … ,主存的塊2u-一、2u+1-一、…、2M-1能夠映射到Cache的第2u-1組的任意一塊。
在組相聯映射方式下,CPU的訪主存地址和訪Cache地址分別爲以下形式:
其中,u爲Cache的組號,v爲組內的塊號。Cache的塊號C=u+v,而主存的塊號M=s+u。也就是說,主存塊地址的後u位指出了主存的這一塊所能映射的Cache的組。
與全相聯映射方式相似的是,在組相聯映射方式下,主存地址到Cache地址的轉換也是經過查找一個由相聯存儲器實現的塊表來完成的,其造成過程如圖4-33所示。
圖4-33組相聯映射的地址轉換
當一個主存塊調入Cache中時,會同時將其主存塊地址的前s位寫入一個由相聯存儲器實現的快表的對應Cache塊項的s字段中。例如,設主存的某塊調入Cache的第1組的第2塊中,則在快表的組1第3項的s字段會登記下該主存塊地址的前s位。
CPU訪存時,首先,根據主存地址中的主存塊號中的u字段找到快表的相應組,而後將該組的全部項的前s位同時與主 存地址的s字段做比較,若相符,則說明主存塊在Cache中,因而將Cache中該項的v字段取出,做爲Cache地址的v字段,而Cache地址的u、 W字段直接由主存地址的u、W字段造成,最後造成一個完整的訪Cache地址。固然,若比較結果是沒有相符項,則未命中,由主存地址直接訪主存。
其實,全相聯映射和直接相聯映射能夠當作是組相聯映射的兩個極端狀況。若u=0,v=C,則Cache只包含1組,此即全相聯映射方式;若u=C,v=0,則組內的塊數等於1,此即直接相聯映射。
在實際應用中,相聯映射方式每組的塊數通常取值較小,典型值爲二、四、八、16等,分別稱爲兩路組相聯、四路組相 聯等。這樣一方面使得比較器的規模較小,實現較容易,例如兩路組相聯採用兩路比較,四路組相聯採用四路比較等;另外一方面,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中,造成訪問Cache的地址(地址映射),訪問Cache; · 優勢:靈活,不易產生衝突; 例:設訪問存儲器地址的塊號序列爲2二、2六、2二、2六、1六、四、1六、18,採用全相聯映射方式時,Cache行分配狀況(見圖3)。 |
全相聯映射方式實例演示
(2)直接映射方式
直接映射方式實例演示
· 某一主存塊只能能映射到Cache的特定行,見圖4: i = j mod m 其中: i:Cache的行號; · 映射過程:(見圖5) ① 存入Cache:快表標記中存放主存地址的區號 ② 檢索:根據訪問主存地址的中間字段(行號),找到Cache快表中的這一行,讀取該行中的標記字段與主存地址高位字段(區號)比較(圖5陰影區) · 符合:即數據在Cache中,造成訪問Cache的地址(地址映射),訪問Cache; 顛簸:例:頻繁訪問主存地址塊序列0、m、0、m,則Cache中 第0行信息只能頻繁調進調出,即出現顛簸現象。 例:訪問存儲器地址序列爲2二、2六、2二、2六、1六、四、1六、18,採用直接映射方式時,Cache行分配狀況(見圖6)。 |
(3)組相聯映射方式
組相聯映射方式實例演示
組相聯映射方式 是全相聯映射方式和直接相聯映射方式的結合,結合二者的優勢 · 方法:把Cache分爲若干組,每組含有若干行。 · 映射過程:(見圖8) ① 存入Cache:快表標記中存放主存地址的區號及塊號(將塊地址分爲三部分: · 塊(行)地址· 組號· 標記(區號)) ② 檢索:根據訪問主存地址的第二字段(組號),找到Cache中的相應組,讀取該組中的每一行標記字段與主存地址高位字段(區號)及塊號比較(圖8陰影區) · 優勢:結合上面兩種的優勢。 ① 由於組內行數較少,比較器容易實現; 例1:設Cache有8個行,分紅2個組,設訪問存儲器地址的塊號序列爲2二、2六、2二、2六、1六、四、1六、18,採用組相聯映射方式時,Cache行分配狀況(見圖9)。 |
參考: