計算機中的層次化存儲是個什麼鬼?

寫在前面

擼代碼只是程序員的一項最基本的技能,除此以外,還有不少知識須要程序員掌握。【程序員進階系列】專題,旨在分享程序員想要進一步提高自我,突破發展瓶頸的一系列技術。今天,咱們來一塊兒聊聊計算機中的層次化存儲結構。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表示的是高速緩衝,在計算機的存儲體系系統中,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,我拉你進羣,一塊兒交流技術,一塊兒進階,一塊兒牛逼~~

相關文章
相關標籤/搜索