加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入
  • 正文
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

看懂這些就能自制一塊多級(jí)存儲(chǔ)器?

2021/11/11
300
閱讀需 12 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

理想情況下,我們希望擁有無(wú)限大的內(nèi)存容量,這樣就可以立刻訪問任何一個(gè)特定的機(jī)器字,但我們不得不認(rèn)識(shí)到有可能需要構(gòu)建分層結(jié)構(gòu)的存儲(chǔ)器,每一層次容量都要大于前一層次,但其訪問速度也要更慢一些。

早在計(jì)算機(jī)剛被發(fā)明出來的時(shí)候,那些計(jì)算科學(xué)界的先驅(qū)們就已經(jīng)預(yù)測(cè)到之后的計(jì)算機(jī)結(jié)構(gòu)。

他們覺得以后的程序員們肯定都會(huì)幻想著擁有無(wú)限容量甚至是無(wú)限數(shù)量的快速存儲(chǔ)器。

但是理想總是很豐滿,現(xiàn)實(shí)很骨感。在實(shí)際的計(jì)算機(jī)系統(tǒng)中,并不可能擁有程序員所幻想的那種存儲(chǔ)器。

所以一系列的計(jì)算機(jī)科學(xué)家們只能嘗試不斷提出更為經(jīng)濟(jì)型的解決方案。從而,便有了所謂存儲(chǔ)器層級(jí)結(jié)構(gòu)這樣的東西。

事實(shí)上,存儲(chǔ)器層級(jí)結(jié)構(gòu)的提出是存在重要背景的。計(jì)算機(jī)由于其使用者的特殊性,所以往往都會(huì)存在一些局域性原理。

局域性原理意味著大多數(shù)的計(jì)算機(jī)程序不會(huì)均衡的去訪問所有代碼和數(shù)據(jù),計(jì)算機(jī)的執(zhí)行并不是一個(gè)等概率事件。

所以往往可以利用計(jì)算機(jī)程序的局域性原理去在性能和成本上對(duì)系統(tǒng)結(jié)構(gòu)做出取舍和折中。

下圖是一個(gè)典型的存儲(chǔ)器層次結(jié)構(gòu),可以看出為了實(shí)現(xiàn)性能和成本上的折衷,存儲(chǔ)器層次結(jié)構(gòu)會(huì)由不同速度、不同大小的存儲(chǔ)器組成。

這些不同的存儲(chǔ)器擁有不同的大小和速度,在存儲(chǔ)器系統(tǒng)中也位于不同的地位。

一般而言,存儲(chǔ)器級(jí)別離處理器越遠(yuǎn),速度越慢,容量越大。而越接近處理器,容量就越小,速度越快,每字節(jié)的成本也就越高。

科學(xué)家是想實(shí)現(xiàn)一種存儲(chǔ)器結(jié)構(gòu),能夠每字節(jié)的成本與最便宜的存儲(chǔ)器相當(dāng),而速度則與最快速的級(jí)別相當(dāng)。這看起來的確是一個(gè)非常劃算和高性價(jià)比的買賣。

除此之外,一般這樣的存儲(chǔ)器結(jié)構(gòu)中,還存在這樣一種特征。那就是低層次存儲(chǔ)器中的數(shù)據(jù)一般是上一級(jí)存儲(chǔ)器中數(shù)據(jù)的超集。

之所以這樣設(shè)計(jì),是因?yàn)槲覀冎来鎯?chǔ)器性能跟處理器性能之間存在巨大的差距。這也是程序員們渴求快速存儲(chǔ)器的原因。

當(dāng)在緩存中找不到某一個(gè)字時(shí),就需要從結(jié)構(gòu)層次更低的存儲(chǔ)器中去尋找這個(gè)字。這樣一來,再結(jié)合空間局域性原理,我們就能夠很容易的通過對(duì)緩存塊的標(biāo)記來快速的從存儲(chǔ)器中找到程序所需要的數(shù)據(jù)。

所以在設(shè)計(jì)存儲(chǔ)器的層次結(jié)構(gòu)時(shí),需要對(duì)緩存的安排做出重要的決策。

這些決策會(huì)決定哪些數(shù)據(jù)塊會(huì)可以放在緩存中。這就是計(jì)算機(jī)教材里常說的組相聯(lián)、全相聯(lián)的概念。

具體的描述可以看我這篇故事文:半夜,滴滴司機(jī)問我會(huì)LRU嗎? 放幾張精美圖幫助大家回憶回憶。

 

直接映像,主存單元中的區(qū)塊與緩存中內(nèi)存塊的關(guān)系是固定的,主存中的內(nèi)存塊只會(huì)存放在高速緩存存儲(chǔ)器中的相同塊號(hào)。

因此,只要主存地址中的主存區(qū)號(hào)與緩存中的主存區(qū)號(hào)相同,則表明訪問緩存命中。

 

全相聯(lián)與直接映像就是兩個(gè)極端,一個(gè)只能整個(gè)區(qū)塊進(jìn)行對(duì)應(yīng),一個(gè)就允許任意主存的塊調(diào)入高速緩存存儲(chǔ)器中任意的塊。

 

組相連方式就是將主存和高速緩存存儲(chǔ)器中的塊再分成組,組之間采用直接映像方式,而組內(nèi)的塊則采用全相聯(lián)映像方式。

從原理上來看,要緩存一份只讀數(shù)據(jù)其實(shí)是一件很容易的事情,因?yàn)楸旧砭彺婧?a class="article-link" target="_blank" href="/baike/1547707.html">主存儲(chǔ)器中備份是一致的。

問題難就難在緩存的寫入。如何保證緩存和存儲(chǔ)器中的備份數(shù)據(jù)一致是一個(gè)難點(diǎn)。一般而言也會(huì)有緩存寫入的策略:直寫緩存

它在更新緩存中數(shù)據(jù)的同時(shí),會(huì)同步寫入主存儲(chǔ)器,更新雙方的數(shù)據(jù)

 

回寫緩存

它只更新緩存中的數(shù)據(jù),但當(dāng)緩存中的數(shù)據(jù)塊將要被替換時(shí),再將其復(fù)制回主存儲(chǔ)器

當(dāng)然了,由于緩存和主存儲(chǔ)器本身就會(huì)存在性能和速度的問題,所以在寫入的時(shí)候還需要依賴寫緩沖區(qū)。

需要寫入主存儲(chǔ)器的數(shù)據(jù)應(yīng)該先被丟到緩沖區(qū)中,這樣就可以及時(shí)釋放緩存,而不需要等待主存儲(chǔ)器的寫入時(shí)間。

說到這,既然存在緩存和主存儲(chǔ)器同步的問題,那么其實(shí)就必然存在緩沖未命中的問題。

這就涉及到一個(gè)指標(biāo),缺失率。其實(shí)就是未命中率。也就是目標(biāo)數(shù)據(jù)能夠在緩存中找到的概率。

一般而言,緩存未命中有一下三種場(chǎng)景:

  • 強(qiáng)制缺失,意味著這是第一次對(duì)某個(gè)數(shù)據(jù)塊的訪問,這個(gè)數(shù)據(jù)塊開始不在緩存中,需要從主存中將該數(shù)據(jù)調(diào)入緩存。
  • 容量缺失,顧名思義就是由于容量不足,導(dǎo)致某些在程序運(yùn)行期間需要的數(shù)據(jù)塊無(wú)法一次性放入緩存,需要下一次被調(diào)用,從而就會(huì)導(dǎo)致容量缺失。
  • 沖突缺失,當(dāng)緩存置換策略不是全相聯(lián)策略時(shí),那么當(dāng)多個(gè)數(shù)據(jù)塊被映射到同一個(gè)塊,那么對(duì)不同數(shù)據(jù)塊多訪問就會(huì)混雜在一起。這個(gè)數(shù)據(jù)塊就有可能被放棄,下一次再被調(diào)入,這時(shí)候就會(huì)發(fā)生沖突缺失。

其實(shí)除了這三種場(chǎng)景之外,當(dāng)存在多個(gè)處理器對(duì)應(yīng)的多個(gè)緩存時(shí),還會(huì)存在一致性缺失的問題。

因此,為了解決不同場(chǎng)景下所帶來的緩存缺失問題,需要從幾個(gè)方面去優(yōu)化緩存結(jié)構(gòu),來獲得更高的命中率。

增大緩存塊以降低強(qiáng)制缺失

這應(yīng)該是最容易優(yōu)化的一個(gè)點(diǎn),由于數(shù)據(jù)塊可能第一次訪問時(shí)不在緩存中會(huì)導(dǎo)致強(qiáng)制缺失。那么理論上增大緩存塊,在一個(gè)塊中存放更多的數(shù)據(jù),由于空間局域性,就可以在一定程度上降低強(qiáng)制缺失。

但是若塊的大小過大,卻會(huì)增大容量缺失和沖突缺失的概率。所以選擇合適的塊大小是一個(gè)值得權(quán)衡的問題。

增大緩存以降低容量缺失

這同樣也是一個(gè)顯而易見的可以用來降低容量缺失的方法。但是緩存過大可能會(huì)影響數(shù)據(jù)的命中時(shí)間,同時(shí)也會(huì)造成成本的增加。

提高相聯(lián)程度以降低沖突缺失

很明顯,當(dāng)緩存塊的映射策略不同時(shí),相聯(lián)程度越低,所產(chǎn)生的沖突缺失也就越大。因此可以通過采用相聯(lián)程度更高的策略來降低沖突缺失。

采用多級(jí)緩存以降低缺失代價(jià)

可以發(fā)現(xiàn),存儲(chǔ)器層次結(jié)構(gòu)的主要特點(diǎn),其實(shí)就是在處理器與主存儲(chǔ)器之間存在多個(gè)速度不同大小不一的緩存。

這些多級(jí)緩存存在的目的就是為了在靠近處理器那頭能夠跟上處理器的高頻速度,在靠近主存儲(chǔ)器那頭獲得接近主存的容量。原因就在于多級(jí)緩存能夠在不同級(jí)別的層次中分別降低不同類型的缺失。這樣使得總體的缺失率最低。

提高讀取缺失優(yōu)先級(jí)

我們?cè)谏厦嬲f到過,一般緩存向主存儲(chǔ)器寫入的時(shí)候,中間會(huì)使用一個(gè)寫緩存區(qū)。當(dāng)需要向主存儲(chǔ)器中寫入數(shù)據(jù)時(shí),會(huì)先寫入緩存區(qū),之后等待合適時(shí)機(jī)再將緩存區(qū)中的數(shù)據(jù)寫回主存儲(chǔ)器。

而在這個(gè)期間,可能某個(gè)數(shù)據(jù)剛寫入緩存區(qū),還沒寫入到主存儲(chǔ)器,這時(shí)候又需要訪問該數(shù)據(jù)。這個(gè)時(shí)候,若讀取優(yōu)先級(jí)低于寫入優(yōu)先級(jí),那么此時(shí)會(huì)優(yōu)先執(zhí)行寫入邏輯,則需要等待緩沖區(qū)寫入主存,再進(jìn)行數(shù)據(jù)的讀取。

這很明顯不是一件高效的事情。所以往往會(huì)設(shè)置讀取優(yōu)先級(jí)高于寫入優(yōu)先級(jí)。這時(shí),無(wú)論寫緩沖區(qū)是否正在執(zhí)行寫入邏輯,都會(huì)優(yōu)先處理讀取邏輯。

使用虛擬地址

虛擬地址是操作系統(tǒng)為每個(gè)進(jìn)程所分配的存儲(chǔ)空間的地址,與實(shí)際的物理地址需要通過地址轉(zhuǎn)換和映射操作。所以對(duì)于使用物理地址的緩存,則需要先將處理器給出的虛擬地址轉(zhuǎn)換成物理地址,然后再根據(jù)緩存中的物理地址來訪問數(shù)據(jù)。

這樣的實(shí)現(xiàn)需要對(duì)處理器虛擬地址到訪問存儲(chǔ)器物理地址之間的轉(zhuǎn)換,使得緩存命中時(shí)間變長(zhǎng),從而不利于缺失率的降低。

所以單從這點(diǎn)上來看,緩存若是使用虛擬地址,則可以節(jié)省地址轉(zhuǎn)換的時(shí)間。但是使用虛擬地址也并不是一件一勞永逸的事情。采用虛擬地址會(huì)導(dǎo)致一系列的問題。

比如由于每個(gè)進(jìn)程都有自己的虛擬地址空間,所以在切換進(jìn)程時(shí),會(huì)出現(xiàn)不同的進(jìn)程可能會(huì)有相同的虛擬地址,但這兩個(gè)相同的虛擬地址卻對(duì)應(yīng)不同的物理地址。

因此在切換進(jìn)程時(shí),需要同步切換緩存,刷新緩存數(shù)據(jù),在這個(gè)期間不可避免的也會(huì)產(chǎn)生大量缺失。當(dāng)然這樣的問題是可以解決的,可以將每個(gè)進(jìn)程的pid與緩存塊綁定,在命中時(shí)檢查即可。

以上這六種方法只是最基本的幾種緩存優(yōu)化方法,主要是從缺失率和命中時(shí)間(其實(shí)還有缺失代價(jià))這幾個(gè)方面去優(yōu)化。

雖然這幾種方法不能給我們優(yōu)化出一個(gè)很完美的具備層次結(jié)構(gòu)的存儲(chǔ)器,但是給予了我們優(yōu)化緩存的方向和思路。

事實(shí)上,若引入更多的優(yōu)化度量指標(biāo),比如緩存帶寬和功耗等。還可以引申出更多的優(yōu)化方法。

常見的還有10種高級(jí)的緩存優(yōu)化方法。這里就不一一細(xì)講,感興趣的可以深入理解一下。

一、 采用小而簡(jiǎn)單的第一級(jí)緩存,用以縮短命中時(shí)間、降低功率
二、 采用路預(yù)測(cè)以縮短命中時(shí)間
三、 實(shí)現(xiàn)緩存訪問的流水化,以提高緩存帶寬
四、 采用無(wú)阻塞緩存,以提高緩存帶寬
五、 采用多種緩存分組以提高緩存帶寬
六、 關(guān)鍵字優(yōu)先和提前重啟動(dòng)以降低缺失代價(jià)
七、 合并寫緩沖區(qū)以降低缺失代價(jià)
八、 采用編譯器優(yōu)化以降低缺失率
九、 對(duì)指令和數(shù)據(jù)進(jìn)行硬件預(yù)取,以降低缺失代價(jià)或缺失率
十、 用編譯器控制預(yù)取,以降低缺失代價(jià)或缺失率

計(jì)算機(jī)科學(xué)家們老早就意識(shí)到存儲(chǔ)器沒辦法直接滿足程序的使用,所以在計(jì)算機(jī)出現(xiàn)的早期就已經(jīng)研究出這種存儲(chǔ)器層次結(jié)構(gòu)。

后來又逐漸引入了虛擬存儲(chǔ)器以及真正高性能的緩存,但是一直以來關(guān)于存儲(chǔ)器層次結(jié)構(gòu)的基本概率和理論卻沒有本質(zhì)的變化。

如果將計(jì)算機(jī)比作人類的大腦的話,那么存儲(chǔ)器就相當(dāng)于是記憶細(xì)胞。

緩存技術(shù)一種能夠大幅度提升計(jì)算機(jī)性能的技術(shù),在歷史上已經(jīng)得到了充分的證明。

但是在真正研究出更強(qiáng)大的緩存之前,存儲(chǔ)器層次結(jié)構(gòu)依然是解決問題最有效和性價(jià)比最高的方案。

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

一個(gè)在大廠深耕的「業(yè)余」程序員。這里有原創(chuàng)易懂的計(jì)算機(jī)基礎(chǔ)技術(shù),也有百般滋味的程序人生。