擼代碼只是程序員的一項最基本的技能,除此以外,還有不少知識須要程序員掌握。【程序員進階系列】專題,旨在分享程序員想要進一步提高自我,突破發展瓶頸的一系列技術。今天,咱們來一塊兒聊聊計算機中的層次化存儲結構。git
文章已收錄到:程序員
https://github.com/sunshinelyz/technology-binghegithub
https://gitee.com/binghe001/technology-binghe數組
首先,問小夥伴們一個問題:計算機的存儲結構爲何須要進行層次化的劃分呢?緩存
說的直接一點:就是爲了減小經濟成本。若是說,CPU的價格很是便宜的話,根本就不須要內存了。能夠把全部的內存容量所有都作到CPU裏面去,就能夠了。可是,事實上,CPU的內存是很精貴的,至今爲止,CPU中基本上仍是一級緩存和二級緩存。三級緩存比較少見。並且,CPU中的存儲容量是很是小的,基本都是KB級別的存儲,CPU的內存容量也就幾KB,MB級別的CPU內存也是比較少見的。因此,出於經濟成本的考慮,計算機中的存儲結構是按照層次進行劃分的。bash
爲了可以讓小夥伴們更加清晰的理解層次化存儲結構,咱們先來看一張圖。
微信
由上圖,能夠看出:數據結構
(1)層次化的存儲結構能夠分爲:CPU、Cache(高速緩存)、主存(內存)、外存(輔存)。性能
(2)從上往下,速度愈來愈慢,容量愈來愈大。設計
局部性原理是層次化存儲結構的支撐。
一個編寫良好的計算機程序經常具備良好的局部性。也就是說。它們傾向於引用臨近於其餘最近引用過的數據項的數據項,或者最近引用過的數據項自己。這彙總傾向性,就被稱爲局部性原理,這是一個持久的概念,對硬件和軟件系統的設計和性能都有着極大的影響。
之因此有這個規律,不少人認爲緣由是:程序的指令大部分時間是順序執行的,並且程序的集合,如數組等各類數據結構是連續存放的。
局部性原理講的是:在一段時間內,整個程序的執行僅限於程序的某一部分,相應地,程序訪問的存儲空間也侷限於某個內存區域。主要分爲兩類:
針對Cache相關的技術,咱們主要來聊聊Cache的概念和映像相關的技術。
這裏的Cache表示的是高速緩衝,在計算機的存儲體系系統中,Cache是除寄存器外訪問速度最快的層次。 使用Cache改善系統性能的依據是程序的局部性原理 。
若是以h表明對Cache的訪問命中率,t1表示Cache的週期時間,t2表示主存儲器的週期時間,以讀操做爲例,使用「Cache+主存儲器」的系統的平均週期爲t3,則能夠得出以下運算公式。
t3 = h * t1 + (1 - h) * t2
其中。(1 - h)又稱爲失效率,也就是未命中率。
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,我拉你進羣,一塊兒交流技術,一塊兒進階,一塊兒牛逼~~