高速緩沖存儲器(每年必考)
一、概述
1. 問題的提出
- 避免 CPU “空等” 現象
- CPU 和 主存(DRAM)之間速度的差異
緩存 | 主存 |
---|---|
容量小 | 容量大 |
速度高 | 速度低 |
- 程序訪問的局部性原理
- 空間的局部性(馮·諾依曼機,重復訪問):空間局部性是指如果一個存儲單元被訪問,則該單元鄰近的單元也可能很快被訪問。
- 時間的局部性:時間局部性是指如果一個存儲單元被訪問,則可能該單元會很快被再次訪問。這是因為程序存在着循環。
2. Cache 的工作原理
Cache 保存的信息只是主存中最急需執行的若干塊的副本。用主存地址的塊號字段訪問 Cache 標記,並將取出的標記和主存地址的標記字段相比較。若相等,說明訪問 Cache 有效,稱 Cache 命中;若不相等,說明訪問Cache 無效,稱 Cache 不命中或失效。
(1)主存和緩存的存儲:主存和緩存按塊存儲,塊的大小相同
(2)命中與未命中
緩存共有 C 塊,主存共有 M 塊(M >> C)
-
命中:主存塊調入緩存,主存塊與緩存塊建立了對應關系,用標記記錄與某緩存塊建立了對應關系的主存塊號
-
未命中:主存塊未調入緩存,主存塊與緩存塊未建立對應關系
(3)Cache 的命中率 -
CPU 訪問的信息在 Cache 中的比率
-
命中率與 Cache 的容量與塊長有關,一般每塊可取 4~8 個字
-
塊長取一個存取周期從主存調出的信息長度,同時塊長取多少存儲字與多體交叉也有關系
(4)Cache -主存系統的效率 -
假設 Nc 為訪問 Cache 的總命中次數,Nm 為訪問內存的總次數,則命中率為:h = Nc /(Nc+Nm)
-
設 Cache 命中率為 h,訪問 Cache 的時間為 tc,訪問主存的時間按為 tm(tc << tm)
-
平均訪問時間(同步)=h × tc+(1-h) × tm ——————> 同步:地址線傳輸會到達Cache也會到達內存,如果數據在 Cache 中命中,那么數據直接送到 CPU ,內存不動;如果沒中就到內存中傳輸。
-
平均訪問時間(異步)=tc + (1-h) × tm ——————> 異步:首先訪問 Cache,如果沒命中再次訪問內存,從內存中取出數據。h × tc+(1-h) × (tc+tm)
-
無特殊說明全按同步計算
-
-
效率 e 與命中率有關
- e = 訪問 Cache 的時間 / 平均訪問時間 × 100%
例題:假設 Cache 的工作速度是主存的5倍,且 Cache 被訪問命中概率為 95 %,則采用 Cache 后存儲器的性能提高了多少?
設 Cache 速度為 t,內存為 5t,( 5t / (0.95×t+0.05×5t) )- 1
- e = 訪問 Cache 的時間 / 平均訪問時間 × 100%
3. Cache 的基本結構
4. Cache 的讀寫操作
(1)Cache 的讀操作
當 CPU 發出讀請求時,如果 Cache 命中,就直接對 Cache 進行讀操作,與主存無關;如果 Cache 不命中,則仍需訪問主存,並把該塊信息一次從主存調入Cache內。若此時Cache已滿,則須根據某種替換算法,用這個塊替換掉Cache中原來的某塊信息。
(2)Cache 的寫操作
由於 Cache 中保存的只是主存的部分副本,這些副本與主存中的內容能否保持一致,是 Cache 能否可靠工作的一個關鍵問題。當 CPU 發出寫請求時,如果 Cache 命中,有可能會遇到 Cache 與主存中的內容不一致的問題。處理的方法有:寫直達法和寫回法。(命中的情況下)如果寫 Cache 不命中,就直接把信息寫入主存(寫直達法),並有兩種處理方法:寫分配法和非寫分配法(不加載到高速緩存中)。
- 寫直達法(Write through):寫操作時數據寫入 Cache 又寫入主存
- 寫操作時間就是訪問主存的時間,讀操作時不涉及對貯存的寫操作,更新策略比較容易實現。
- 寫回法(Write back):寫操作時只把數據寫入 Cache 而不寫入主存,當 Cache 數據被替換出去時才寫回主存
- 寫操作時間就是訪問 Cache 的時間,讀操作 Cache 失效發生數據替換時,被替換的塊需寫回主存,增加了 Cache 的復雜性(簡單的說就是我先把數據放到 Cache 中,啥時候 Cache 不要了,再將主存中的數據替換)
- 寫回法在 Cache 需要增加修改位(dirty bit)與標記放在一起,不論是寫回法還是寫直法還需要一個有效位(存在位)與標記並行,來判斷訪問是否是Cache,也就是是否命中。
5. Cache 的改進(注意有的高校可能會考多級Cache的命中率)
- 增加 Cache 的級數
- 片載(片內)Cache
- 片外 Cache
- 統一緩存和分立緩存
流水線工作解決結構相關性(結構冒險)————> 把指令與數據分離即可解決- 分為指令 Cache 和數據 Cache
- 與主存結構有關
- 與指令執行的控制方式有關(是否流水)
二、Cache - 主存的地址映射
1. 直接映射
直接映像是指主存中的每一個塊只能被放置到 Cache 中惟一的一個指定位置,若這個位置已有內容,則產生塊沖突,原來的塊將無條件地被替換出去。直接映像方式是最簡單的地址映象方式,成本低,易實現,地址變換速度快,而且不涉及其它兩種映像方式中的替換算法問題。但這種方式不夠靈活,Cache的塊沖突概率最高、空間利用率最低。
- 可能會發生沖突,導致高速緩存造成浪費
例如增加一個標記位,假如現在有 50 組[編號 0 ~ 49]學生要考試,每組學生10人[學生編號 000 ~ 499,前兩位組號,中間行號,最后一位列號],只有一個房間進行考試,該房間是 10 × 10 座位,行列編號分別從0~9。現隨機抽取組號進行考試,不巧抽取123、223、323、423進行考試,在同一座位考試究竟誰來考試??發生沖突。
- i:第 i 個緩存塊,j:第 j 個主存塊,C:Cache 的塊數;(i=j%C)
- 每個緩存塊 i 可以和若干個主存塊對應
- 每個主存塊 j 只能和一個緩存塊對應
- 比較器后進行有效位判斷,如果標記相同但里面存儲內容不同,訪問的是主存在 Cache 中沒有命中
2. 全相聯映像
全相聯映像就是讓主存中任何一個塊均可以映像裝入到 Cache 中任何一個塊的位置上。全相聯映像方式比較靈活,Cache的塊沖突概率最低、空間利用率最高,但是地址變換速度慢,而且成本高,實現起來比較困難。
3. 組相聯映射(看教材吧,主存可能不一樣)
組相聯映像將主存空間按 Cache 大小等分成區后,再將 Cache 空間和主存空間中的每一區都等分成大小相同的組。讓主存各區中某組中的任何一塊,均可直接映像裝入Cache中對應組的任何一塊位置上,即組間采取直接映像,而組內采取全相聯映像。
下圖為:二路組相聯
標記 | 組號 | Cache 塊地址 | 字塊內地址 |
---|
主存不分組(某一主存塊 j 按模 Q 映射到緩存的第 i 組中的任何一塊)
標記 | 組地址 | 字塊內地址 |
---|
小結:
直接 | 某一主存塊只能固定映射到某一緩存塊 |
---|---|
全相聯 | 某一主存塊能映射到任一緩存塊 |
組相聯 | 某一主存塊只能映射某一緩存組中的人一塊 |
三、替換算法(主要針對組相聯)
1. 先進先出(FIFO)
按調入Cache的先后決定淘汰的順序,即在需要更新時,將最先進入Cache的塊作為被替換的塊。這種方法要求為每塊做一記錄,記下它們進入Cache的先后次序。這種方法容易實現,而且系統開銷小。其缺點是可能會把一些需要經常使用的程序塊(如循環程序)也作為最早進入Cache的塊替換掉。
2. 近期最少使用(LRU)算法(局部性)
LRU算法是把 CPU 近期最少使用的塊作為被替換的塊。這種替換方法需要隨時記錄Cache中各塊的使用情況,以便確定哪個塊是近期最少使用的塊。LRU算法相對合理,但實現起來比較復雜,系統開銷較大。通常需要對每一塊設置一個稱為“年齡計數器”的硬件或軟件計數器,用以記錄其被使用的情況。
四、試題
1. 假設主存容量為 512 KB,Cache 容量為 4KB,每個子塊為16字,誒個字 32 位
(1)Cache 地址有多少位?可容納多少塊?
(2)主存地址有多少位?可容納多少塊?
(3)在直接映射方式下,主存的第幾塊映射到 Cache 的第5塊(假設開始字塊為第1塊)?
(4)畫出直接映射方式下主存地址字段中各段的位數。
解析:地址線的位數與容量有關
512KB = 219 B
4KB = 212 B
16 個字 = 24
32bit/8 = 4B = 22B
答案:
(1)由於地址線的位數與容量有關,故Cache 地址有 12 位;212/(24×22)= 64(塊)
(2)19;8K
(3)第 5 個緩存塊,j:第 j 個主存塊,C:Cache 的塊數**;(5=j%64)————> 假設開始字塊為第1塊(這里規定從 1 開始,如果題目不說一般從 0 開始)
(4)
標記 | Cache塊地址 | 塊內地址 |
---|---|---|
19-6=7 | 12-6=6 | 6 |
2. 假設主存容量為 512K×16位,Cache 容量為 4096×16位,塊長為4個16位字,訪存地址為字地址。
(1)直接映射方式下,設計主存地址格式
(2)全相聯映射方式下,設計主存地址格式
(3)二路組相聯映射方式下,設計主存地址格式
(4)若主存容量為 512×32位,塊長不變,在四路組相聯映射方式下,設計主存地址格式
答案:按字編址,每個字2B
(1)直接映射:Cache 地址線(地址線的位數與容量有關)= Cache塊地址線 + 塊內地址線
標記 | Cache塊地址 | 塊內地址 |
---|---|---|
19-10=9 | 12-2=10 | 2 |
(2)全相聯
標記 | Cache塊內地址 |
---|---|
17 | 2 |
(3)二路組相聯,Cache塊兩塊一組
標記 | Cache塊地址 | 塊內地址 |
---|---|---|
17-9=8 | 210/2=29(二路) | 2 |
(4)塊長不變,Cache塊地址地址線 + 標記地址線 + 塊內地址線 = 主存所需要的地址線
標記 | Cache塊地址 | 塊內地址 |
---|---|---|
20-8-2=10 | 210/22=28(四路) | 2 |
注:為什么主存需要20根地址線?
若主存容量為 512×32位,按字編址
- 512KB = 219 B
- 32bit/8 = 4B = 22B
- 主存容量= 219B × 22B / 2B = 220 ————> 20根地址線