寫在前面
擼程式碼只是程式設計師的一項最基本的技能,除此之外,還有很多知識需要程式設計師掌握。【程式設計師進階系列】專題,旨在分享程式設計師想要進一步提升自我,突破發展瓶頸的一系列技術。今天,我們來一起聊聊計算機中的層次化儲存結構。
文章已收錄到:
https://github.com/sunshinelyz/technology-binghe
https://gitee.com/binghe001/technology-binghe
層次化儲存結構
首先,問小夥伴們一個問題:計算機的儲存結構為什麼需要進行層次化的劃分呢?
說的直接一點:就是為了減少經濟成本。如果說,CPU的價格非常便宜的話,根本就不需要記憶體了。可以把所有的記憶體容量全部都做到CPU裡面去,就可以了。但是,事實上,CPU的記憶體是很精貴的,至今為止,CPU中基本上還是一級快取和二級快取。三級快取比較少見。而且,CPU中的儲存容量是非常小的,基本都是KB級別的儲存,CPU的記憶體容量也就幾KB,MB級別的CPU記憶體也是比較少見的。所以,出於經濟成本的考慮,計算機中的儲存結構是按照層次進行劃分的。
為了能夠讓小夥伴們更加清晰的理解層次化儲存結構,我們先來看一張圖。
由上圖,可以看出:
(1)層次化的儲存結構可以分為:CPU、Cache(快取記憶體)、主存(記憶體)、外存(輔存)。
(2)從上往下,速度越來越慢,容量越來越大。
區域性性原理是層次化儲存結構的支撐。
區域性性原理
一個編寫良好的計算機程式常常具有良好的區域性性。也就是說。它們傾向於引用臨近於其他最近引用過的資料項的資料項,或者最近引用過的資料項本身。這彙總傾向性,就被稱為區域性性原理,這是一個持久的概念,對硬體和軟體系統的設計和效能都有著極大的影響。
之所以有這個規律,很多人認為原因是:程式的指令大部分時間是順序執行的,而且程式的集合,如陣列等各種資料結構是連續存放的。
區域性性原理講的是:在一段時間內,整個程式的執行僅限於程式的某一部分,相應地,程式訪問的儲存空間也侷限於某個記憶體區域。主要分為兩類:
- 時間區域性性:如果程式中的某條指令一旦執行,則不久之後該指令可能再次被執行;如果某資料被訪問,則不久之後該資料可能再次被訪問。
- 空間區域性性:是指一旦程式訪問了某個儲存單元,則不久之後,其附近的儲存單元也將被訪問。
Cache
針對Cache相關的技術,我們主要來聊聊Cache的概念和映像相關的技術。
Cache-概念
這裡的Cache表示的是高速緩衝,在計算機的儲存體系系統中,Cache是除暫存器外訪問速度最快的層次。 使用Cache改善系統效能的依據是程式的區域性性原理 。
如果以h代表對Cache的訪問命中率,t1表示Cache的週期時間,t2表示主儲存器的週期時間,以讀操作為例,使用“Cache+主儲存器”的系統的平均週期為t3,則可以得出如下運算公式。
t3 = h * t1 + (1 - h) * t2
其中。(1 - h)又稱為失效率,也就是未命中率。
Cache-映像
Cache的映像分為三種,分別是:直接相聯映像、全相聯映像、組相聯映像。
- 直接相聯映像:硬體電路比較簡單,但衝突率最高。
- 全相連映像:電路難於設計和實現,只適用於小容量的Cache,衝突率比較低。
- 組相聯映像:直接相聯與全相聯的折中。
地址映像是將主存與Cache的儲存空間劃分為若干大小相同的頁(或稱為塊)。
例如,一臺計算機的主存容量為1GB,劃分為2048頁,每頁512KB;Cache的容量為8MB,劃分為16頁,每頁512KB。接下來,我們由此來詳細圖解直接相聯映像、全相聯映像和組相聯映像。
直接相聯映像
我們可以畫一組圖來表示Cache的直接映像。首先,我們先來簡單畫一個主存標記、Cache頁號和頁內地址的示意圖。如下所示。
如上圖所示,主存標記為7位,Cache頁號為4位,頁內地址為19位。
記錄主存區號的示意圖如下所示。
有了上面兩張圖的基礎後,我們再來看直接相聯映像的示意圖如下所示。
這裡,我們將容量為1GB的主存劃分成2048頁,總共127個區,每頁的容量為512KB。將容量為8MB的Cache劃分為16頁,每頁容量為512KB。
所謂直接相聯映像是指Cache中的0頁只能儲存主存中0頁的內容,這裡主存中0頁指的是每個區的0頁,比如上圖中的0區的0頁,1區的16頁,127區的2032頁等。
在直接相聯映像中,只需要記錄主存標記、Cache頁號和頁內地址就能夠快速的找到主存中的資料。
使用直接相聯映像有個缺點:那就是如果Cache中的0頁,儲存了主存中0區0頁的內容時,如果此時需要儲存主存1區中的16頁內容,就只能將主存0區中0頁的內容從Cache的0頁中清除,然後將主存1區中16頁的內容儲存到Cache中的0頁內。衝突率比較高。細心的小夥伴會發現:這其實是違背區域性性原理的。
直接相聯映像訪問速度最快,但衝突率最高。
全相連映像
我們先來看下全相聯映像的主存頁標記和頁內地址的示意圖,如下所示。
此時,使用11位來標識主存頁標記,使用19位來標識頁內地址。
使用全相連映像需要記錄主存與Cache的對應關係,如下圖所示。
接下來,我們來看看全相連映像的示意圖,如下所示。
從圖中可以看出,Cache中的任何一個也,都可以儲存主存中的任何一個頁。
使用全相連映像訪問速度最慢,衝突率最低。
組相聯映像
組相聯映像本質上是直接相聯映像和全相聯映像的折中。同樣的,我們先來看組相連映像的儲存示意圖。
此時,在組相連映像中,Cache組號使用3位表示,組內頁號使用1位表示,頁內地址使用19位表示。其中,3位的Cache組號,1位的組內頁號和前面的7位構成了主存頁標記;3位的Cache組號,1位的組內頁號和19號的頁內地址構成了Cache地址。
接下來,我們再來看看主存與Cache的對應關係,如下圖所示。
組相連的映像示意圖如下所示。
由上圖可知,在組相連映像中,主存的組與Cache的組是組相聯映像關係,而在組內則是通過直接相聯映像來訪問和儲存資料。
好了,我已經肝不動了。今天就到這兒吧,我是冰河,大家有啥問題可以在下方留言,也可以加我微信:sun_shine_lyz,我拉你進群,一起交流技術,一起進階,一起牛逼~~