衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

深入理解Cache工作原理

路科驗(yàn)證 ? 來(lái)源:路科驗(yàn)證 ? 2023-05-30 16:02 ? 次閱讀

大家好,今天給大家分享一篇關(guān)于 Cache 的硬核的技術(shù)文,基本上關(guān)于Cache的所有知識(shí)點(diǎn)都可以在這篇文章里看到。

關(guān)于 Cache 這方面內(nèi)容圖比較多,不想自己畫(huà)了,所以圖都來(lái)自《Computer Architecture : A Quantitative Approach》。

這是一本體系架構(gòu)方面的神書(shū),推薦大家看一下。

本文主要內(nèi)容如下,基本涉及了Cache的概念,工作原理,以及保持一致性的入門(mén)內(nèi)容。

71b18770-febf-11ed-90ce-dac502259ad0.png

1、為什么需要 Cache

1.1 為什么需要 Cache

我們首先從一張圖來(lái)開(kāi)始講為什么需要 Cache.

71deb8d0-febf-11ed-90ce-dac502259ad0.png

上圖是 CPU 性能和 Memory 存儲(chǔ)器訪問(wèn)性能的發(fā)展。

我們可以看到,隨著工藝和設(shè)計(jì)的演進(jìn),CPU 計(jì)算性能其實(shí)發(fā)生了翻天覆地的變化,但是DRAM存儲(chǔ)性能的發(fā)展沒(méi)有那么快。

所以造成了一個(gè)問(wèn)題,存儲(chǔ)限制了計(jì)算的發(fā)展。

容量與速度不可兼得。

如何解決這個(gè)問(wèn)題呢?可以從計(jì)算訪問(wèn)數(shù)據(jù)的規(guī)律入手。

我們隨便貼段代碼:

for(j=0;j100;j=j+1)
for(i=0;i5000;i=i+1)
x[i][j]=2*x[i][j];

可以看到,由于大量循環(huán)的存在,我們?cè)L問(wèn)的數(shù)據(jù)其實(shí)在內(nèi)存中的位置是相近的。

換句專業(yè)點(diǎn)的話說(shuō),我們?cè)L問(wèn)的數(shù)據(jù)有局部性。

我們只需要將這些數(shù)據(jù)放入一個(gè)小而快的存儲(chǔ)中,這樣就可以快速訪問(wèn)相關(guān)數(shù)據(jù)了。

總結(jié)起來(lái),Cache是為了給CPU提供高速存儲(chǔ)訪問(wèn),利用數(shù)據(jù)局部性而設(shè)計(jì)的小存儲(chǔ)單元。

1.2 實(shí)際系統(tǒng)中的 Cache

我們展示一下實(shí)際系統(tǒng)中的 Cache 。

720924a8-febf-11ed-90ce-dac502259ad0.png

如上圖所示,整個(gè)系統(tǒng)的存儲(chǔ)架構(gòu)包括了 CPU 的寄存器,L1/L2/L3 CACHE,DRAM 和硬盤(pán)。

數(shù)據(jù)訪問(wèn)時(shí)先找寄存器,寄存器里沒(méi)有找 L1 Cache, L1 Cache 里沒(méi)有找 L2 Cache 依次類(lèi)推,最后找到硬盤(pán)中。

同時(shí),我們可以看到,速度與存儲(chǔ)容量的折衷關(guān)系。容量越小,訪問(wèn)速度越快!

其中,一個(gè)概念需要搞清楚。

72186d96-febf-11ed-90ce-dac502259ad0.png

CPU 和 Cache 是 word 傳輸?shù)模?Cache 到主存是以塊傳輸?shù)模粔K大約 64Byte 。

現(xiàn)有 SOC 中的 Cache 一般組成如下。

1.3 Cache 的分類(lèi)

Cache按照不同標(biāo)準(zhǔn)分類(lèi)可以分為若干類(lèi)。

  • 按照數(shù)據(jù)類(lèi)型劃分:I-Cache與D-Cache。其中I-Cache負(fù)責(zé)放置指令,D-Cache負(fù)責(zé)方式數(shù)據(jù)。兩者最大的不同是D-Cache里的數(shù)據(jù)可以寫(xiě)回,I-Cache是只讀的。

  • 按照大小劃分:分為small Cache和large Cache。沒(méi)路組(后文組相連介紹)<4KB叫small Cache, 多用于L1 Cache, 大于4KB叫l(wèi)arge Cache。多用于L2及其他Cache.

  • 按照位置劃分:Inner Cache和Outer Cache。一般獨(dú)屬于CPU微架構(gòu)的叫Inner Cache, 例如上圖的L1 L2 CACHE。不屬于CPU微架構(gòu)的叫outer Cache.

  • 按照數(shù)據(jù)關(guān)系劃分:Inclusive/exclusive Cache: 下級(jí)Cache包含上級(jí)的數(shù)據(jù)叫inclusive Cache。不包含叫exclusive Cache。舉個(gè)例子,L3 Cache里有L2 Cache的數(shù)據(jù),則L2 Cache叫exclusive Cache。

2、Cache的工作原理

要講清楚 Cache 的工作原理,需要回答 4 個(gè)問(wèn)題:

  • 數(shù)據(jù)如何放置

  • 數(shù)據(jù)如何查詢

  • 數(shù)據(jù)如何被替換

  • 如果發(fā)生了寫(xiě)操作,Cache如何處理

2.1 數(shù)據(jù)如何放置

這個(gè)問(wèn)題也好解決。我們舉個(gè)簡(jiǎn)單的栗子來(lái)說(shuō)明問(wèn)題。

假設(shè)我們主存中有 32 個(gè)塊,而我們的 Cache 一共有 8 個(gè) Cache 行( 一個(gè) Cache 行放一行數(shù)據(jù))。

假設(shè)我們要把主存中的塊 12 放到 Cache 里。

那么應(yīng)該放到 Cache 里什么位置呢?

三種方法:

  • 全相連(Fully associative)。可以放在Cache的任何位置。

  • 直接映射(Direct mapped)。只允許放在Cache的某一行。比如12 mod 8

  • 組相連(set associative)。可以放在Cache的某幾行。例如2路組相連,一共有4組,所以可以放在0,1位置中的一個(gè)。

可以看到,全相連和直接映射是Cache組相連的兩種極端情況。

不同的放置方式主要影響有兩點(diǎn):

1、組相連組數(shù)越大,比較電路就越大,但Cache利用率更高,Cache miss發(fā)生的概率小。

2、組相連數(shù)目變小,Cache經(jīng)常發(fā)生替換,但是比較電路比較小。

這也好理解,內(nèi)存中的塊在Cache中可放置的位置多,自然找起來(lái)就麻煩。

2.2 如何在Cache中找數(shù)據(jù)

其實(shí)找數(shù)據(jù)就是一個(gè)比對(duì)過(guò)程,如下圖所示。

72280bde-febf-11ed-90ce-dac502259ad0.png

我們地址都以 Byte 為單位的。

但主存與Cache之間的數(shù)據(jù)交換單位都是塊(block,現(xiàn)代Cache一般一個(gè)block大約64Byte)。所以地址對(duì)最后幾位是block offset。

由于我們采用了組相連,則還有幾個(gè)比特代表的是存儲(chǔ)到了哪個(gè)組。

組內(nèi)放著若干數(shù)據(jù),我們需要比較Tag, 如果組內(nèi)有Tag出現(xiàn),則說(shuō)明我們?cè)L問(wèn)的數(shù)據(jù)在緩存中,可以開(kāi)心的使用了。

比如舉個(gè) 2 路組相連的例子,如下圖所示。

723da6f6-febf-11ed-90ce-dac502259ad0.png

T表示Tag。直接比較Tag,就能得知是不是命中了。如果命中了,則根據(jù)index(組號(hào))將對(duì)應(yīng)的塊取出來(lái)即可。

如上圖所示。用index選出位于組相連的哪個(gè)組。然后并行的比較Tag, 判斷最后是不是在Cache中。上圖是2路組相連,也就是說(shuō)兩組并行比較。

那如果不在緩存中呢?這就涉及到另一個(gè)問(wèn)題。

不在緩存中如何替換 Cache ?

2.3 如何替換Cache中的數(shù)據(jù)

Cache中的數(shù)據(jù)如何被替換的?這個(gè)就比較簡(jiǎn)單直接。

724f59e6-febf-11ed-90ce-dac502259ad0.png

  • 隨機(jī)替換。如果發(fā)生Cache miss里隨機(jī)替換掉一塊。

  • Least recently used. LRU。最近使用的塊最后替換。

  • First in, first out (FIFO), 先進(jìn)先出。

實(shí)際上第一個(gè)不怎么使用,LRU 和 FIFO 根據(jù)實(shí)際情況選擇即可。

Cache 在什么時(shí)候數(shù)據(jù)會(huì)被替換內(nèi)?也有幾種策略。

  • 不在本 Cache 替換。如果Cache miss了,直接轉(zhuǎn)發(fā)訪問(wèn)地址到主存,取到的數(shù)據(jù)不會(huì)寫(xiě)到Cache.

  • 在讀MISS時(shí)替換。如果讀的時(shí)候Cache里沒(méi)有該數(shù)據(jù),則從主存讀取該數(shù)據(jù)后寫(xiě)入Cache。

  • 在寫(xiě)MISS時(shí)替換。如果寫(xiě)的時(shí)候Cache里沒(méi)有該數(shù)據(jù),則將本數(shù)據(jù)調(diào)入Cache再寫(xiě)。

2.4 如果發(fā)生了寫(xiě)操作怎么辦

Cache畢竟是個(gè)臨時(shí)緩存。

如果發(fā)生了寫(xiě)操作,會(huì)造成Cache和主存中的數(shù)據(jù)不一致。如何保證寫(xiě)數(shù)據(jù)操作正確呢?

也有三種策略。

  • 通寫(xiě):直接把數(shù)據(jù)寫(xiě)回Cache的同時(shí)寫(xiě)回主存。極其影響寫(xiě)速度。

7263d70e-febf-11ed-90ce-dac502259ad0.png

  • 回寫(xiě):先把數(shù)據(jù)寫(xiě)回Cache, 然后當(dāng)Cache的數(shù)據(jù)被替換時(shí)再寫(xiě)回主存。

72858c78-febf-11ed-90ce-dac502259ad0.png

  • 通寫(xiě)隊(duì)列:通寫(xiě)與回寫(xiě)的結(jié)合。先寫(xiě)回一個(gè)隊(duì)列,然后慢慢往主存儲(chǔ)寫(xiě)。如果多次寫(xiě)同一個(gè)數(shù)據(jù),直接寫(xiě)這個(gè)隊(duì)列。避免頻繁寫(xiě)主存。

3、Cache一致性

Cache 一致性是 Cache 中遇到的比較坑的一個(gè)問(wèn)題。

什么原因需要 Cache 處理一致性呢?

主要是多核系統(tǒng)中,假如core 0讀了主存儲(chǔ)的數(shù)據(jù),寫(xiě)了數(shù)據(jù)。core 1也讀了主存的數(shù)據(jù)。這個(gè)時(shí)候core 1并不知道數(shù)據(jù)已經(jīng)被改動(dòng)了,也就是說(shuō),core 1 Cache中的數(shù)據(jù)過(guò)時(shí)了,會(huì)產(chǎn)生錯(cuò)誤。

Cache一致性的保證就是讓多核訪問(wèn)不出錯(cuò)。

72919fd6-febf-11ed-90ce-dac502259ad0.png

Cache一致性主要有兩種策略。

策略一:基于監(jiān)聽(tīng)的一致性策略

這種策略是所有Cache均監(jiān)聽(tīng)各Cache的寫(xiě)操作,如果一個(gè)Cache中的數(shù)據(jù)被寫(xiě)了,有兩種處理辦法。

寫(xiě)更新協(xié)議:某個(gè)Cache發(fā)生寫(xiě)了,就索性把所有Cache都給更新了。

寫(xiě)失效協(xié)議:某個(gè)Cache發(fā)生寫(xiě)了,就把其他Cache中的該數(shù)據(jù)塊置為無(wú)效。

策略 1 由于監(jiān)聽(tīng)起來(lái)成本比較大,所以只應(yīng)用于極簡(jiǎn)單的系統(tǒng)中。

策略二:基于目錄的一致性策略

這種策略是在主存處維護(hù)一張表。記錄各數(shù)據(jù)塊都被寫(xiě)到了哪些Cache, 從而更新相應(yīng)的狀態(tài)。一般來(lái)講這種策略采用的比較多。又分為下面幾個(gè)常用的策略。

  • SI: 對(duì)于一個(gè)數(shù)據(jù)塊來(lái)講,有share和invalid兩種狀態(tài)。如果是share狀態(tài),直接通知其他Cache, 將對(duì)應(yīng)的塊置為無(wú)效。

  • MSI:對(duì)于一個(gè)數(shù)據(jù)塊來(lái)講,有share和invalid,modified三種狀態(tài)。其中modified狀態(tài)表表示該數(shù)據(jù)只屬于這個(gè)Cache, 被修改過(guò)了。當(dāng)這個(gè)數(shù)據(jù)被逐出Cache時(shí)更新主存。這么做的好處是避免了大量的主從寫(xiě)入。同時(shí),如果是invalid時(shí)寫(xiě)該數(shù)據(jù),就要保證其他所有Cache里該數(shù)據(jù)的標(biāo)志位不為M,負(fù)責(zé)要先寫(xiě)回主存儲(chǔ)。

  • MESI:對(duì)于一個(gè)數(shù)據(jù)來(lái)講,有4個(gè)狀態(tài)。modified, invalid, shared, exclusive。其中exclusive狀態(tài)用于標(biāo)識(shí)該數(shù)據(jù)與其他Cache不依賴。要寫(xiě)的時(shí)候直接將該Cache狀態(tài)改成M即可。

我們著重講講 MESI。圖中黑線:CPU的訪問(wèn)。紅線:總線的訪問(wèn),其他Cache的訪問(wèn)。

729acc14-febf-11ed-90ce-dac502259ad0.png

當(dāng)前狀態(tài)時(shí)I狀態(tài)時(shí),如果發(fā)生處理器讀操作 prrd。

  • 如果其他Cache里有這份數(shù)據(jù),如果其他Cache里是M態(tài),先 把M態(tài)寫(xiě)回主存再讀。否則直接讀。最終狀態(tài)變?yōu)镾。

  • 其他Cache里沒(méi)這個(gè)數(shù)據(jù),直接變到E狀態(tài)。

當(dāng)前狀態(tài)為S態(tài)。

  • 如果發(fā)生了處理器讀操作,仍然在S態(tài)。

  • 如果發(fā)生了處理器寫(xiě)操作,則跳轉(zhuǎn)到M狀態(tài)。

  • 如果其他Cache發(fā)生了寫(xiě)操作,跳到I態(tài)。

當(dāng)前狀態(tài)E態(tài)

  • 發(fā)生了處理器讀操作還是E。

  • 發(fā)生了處理器寫(xiě)操作變成M。

  • 如果其他Cache發(fā)生了讀操作,變到S狀態(tài)。

當(dāng)前狀態(tài)M態(tài)

  • 發(fā)生了讀操作依舊是M態(tài)。

  • 發(fā)生了寫(xiě)操作依舊是M態(tài)。

  • 如果其他Cache發(fā)生了讀操作,則將數(shù)據(jù)寫(xiě)回主存儲(chǔ),變換到S態(tài)。

4、總結(jié)

Cache 在計(jì)算機(jī)體系架構(gòu)中有非常重要的地位,本文講了 Cache中最主要的內(nèi)容,具體細(xì)節(jié)可以再根據(jù)某個(gè)點(diǎn)深入研究。


審核編輯 :李倩



聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • DRAM
    +關(guān)注

    關(guān)注

    40

    文章

    2326

    瀏覽量

    183868
  • 存儲(chǔ)
    +關(guān)注

    關(guān)注

    13

    文章

    4355

    瀏覽量

    86180
  • Cache
    +關(guān)注

    關(guān)注

    0

    文章

    129

    瀏覽量

    28435

原文標(biāo)題:深入理解 Cache 工作原理

文章出處:【微信號(hào):Rocker-IC,微信公眾號(hào):路科驗(yàn)證】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    深入理解運(yùn)放的工作原理(空氣凈化器系統(tǒng)案例)

    重點(diǎn)講解了運(yùn)放的內(nèi)部電路結(jié)構(gòu),幫助深入理解運(yùn)放的工作原理。運(yùn)放是設(shè)計(jì)使用非常頻繁且非常重要器件,通常在信號(hào)放大,電流采樣電路里常見(jiàn),對(duì)于初學(xué)者經(jīng)常感到困惑,所以掌握好能夠幫助你很好的分析電路。
    的頭像 發(fā)表于 04-19 09:10 ?6307次閱讀

    深入理解運(yùn)放的工作原理內(nèi)部電路結(jié)構(gòu)

    重點(diǎn)講解了運(yùn)放的內(nèi)部電路結(jié)構(gòu),幫助深入理解運(yùn)放的工作原理。運(yùn)放是設(shè)計(jì)使用非常頻繁且非常重要器件,通常在信號(hào)放大,電流采樣電路里常見(jiàn)。
    的頭像 發(fā)表于 04-22 16:02 ?1.8w次閱讀
    <b class='flag-5'>深入理解</b>運(yùn)放的<b class='flag-5'>工作原理</b>內(nèi)部電路結(jié)構(gòu)

    深入理解Android

    深入理解Android
    發(fā)表于 08-20 15:30

    深入理解和實(shí)現(xiàn)RTOS_連載

    和trcohili的帖子。深入理解和實(shí)現(xiàn)RTOS_連載1_RTOS的前生今世今天發(fā)布的是第一篇,"RTOS的前生今世"。通過(guò)軟件系統(tǒng)結(jié)構(gòu)的比對(duì)簡(jiǎn)要的介紹rtos為何而生。如果讀者對(duì)RTOS
    發(fā)表于 05-29 11:20

    深入理解和實(shí)現(xiàn)RTOS_連載

    和trcohili的帖子。trochili rtos完全是作者興趣所在,且行且堅(jiān)持,比沒(méi)有duo。深入理解和實(shí)現(xiàn)RTOS_連載1_RTOS的前生今世今天發(fā)布的是第一篇,"RTOS的前生今世"
    發(fā)表于 05-30 01:02

    深入理解lte-a

    深入理解LTE-A
    發(fā)表于 02-26 10:21

    深入理解STM32

    時(shí)鐘系統(tǒng)是處理器的核心,所以在學(xué)習(xí)STM32所有外設(shè)之前,認(rèn)真學(xué)習(xí)時(shí)鐘系統(tǒng)是必要的,有助于深入理解STM32。下面是從網(wǎng)上找的一個(gè)STM32時(shí)鐘框圖,比《STM32中文參考手冊(cè)》里面的是中途看起來(lái)清晰一些:重要的時(shí)鐘:PLLCLK,SYSCLK,HCKL,PCLK1,...
    發(fā)表于 08-12 07:46

    對(duì)棧的深入理解

    為什么要深入理解棧?做C語(yǔ)言開(kāi)發(fā)如果棧設(shè)置不合理或者使用不對(duì),棧就會(huì)溢出,溢出就會(huì)遇到無(wú)法預(yù)測(cè)亂飛現(xiàn)象。所以對(duì)棧的深入理解是非常重要的。注:動(dòng)畫(huà)如果看不清楚可以電腦看更清晰啥是棧先來(lái)看一段動(dòng)畫(huà):沒(méi)有
    發(fā)表于 02-15 07:01

    為什么要深入理解

    [導(dǎo)讀] 從這篇文章開(kāi)始,將會(huì)不定期更新關(guān)于嵌入式C語(yǔ)言編程相關(guān)的個(gè)人認(rèn)為比較重要的知識(shí)點(diǎn),或者踩過(guò)的坑。為什么要深入理解棧?做C語(yǔ)言開(kāi)發(fā)如果棧設(shè)置不合理或者使用不對(duì),棧就會(huì)溢出,溢出就會(huì)遇到無(wú)法
    發(fā)表于 02-15 06:09

    深入理解Android之資源文件

    深入理解Android之資源文件
    發(fā)表于 01-22 21:11 ?22次下載

    深入理解Android》文前

    深入理解Android》文前
    發(fā)表于 03-19 11:23 ?0次下載

    深入理解Android:卷I》

    深入理解Android:卷I》
    發(fā)表于 03-19 11:23 ?0次下載

    深入理解Android網(wǎng)絡(luò)編程

    深入理解Android網(wǎng)絡(luò)編程
    發(fā)表于 03-19 11:26 ?1次下載

    深入理解MOS管電子版資源下載

    深入理解MOS管電子版資源下載
    發(fā)表于 07-09 09:43 ?0次下載

    深入理解CACHE VIPT與PIPT的工作原理

    在kernel啟動(dòng)過(guò)程中,雖然這里第一次出現(xiàn)CACHE相關(guān)的打印信息,但是,此處并不是kernel第一次操作CACHE
    的頭像 發(fā)表于 06-05 14:56 ?2215次閱讀
    <b class='flag-5'>深入理解</b><b class='flag-5'>CACHE</b> VIPT與PIPT的<b class='flag-5'>工作原理</b>
    延长县| 网上赌百家乐官网有假| 百家乐纯数字玩法| 二八杠手法| 优博家百家乐娱乐城| 娱乐城彩金| 真人百家乐官网赌城| 威尼斯人娱乐城官方地址| 百家乐官网视频游戏帐号| 百家乐有免费玩| 总统娱乐城能赢钱吗| 喜来登百家乐官网的玩法技巧和规则 | 新葡京网上娱乐| KK百家乐官网的玩法技巧和规则| 百家乐平注法亏损| 百家乐官网公开| 百家乐赌场视频| 带百家乐官网的时时彩平台| 真人百家乐作假视频| 永利高足球投注网| 百家乐攻略投注法| 7298棋牌官网| 百家乐官网平注法到6568| ican博彩通| 百家乐硬币打法| bet365投注网| 开心8百家乐现金网| 湘西| 网上百家乐导航| 太阳城百家乐官网群| 百家乐记算| 百家乐官网桌子轮盘| 老虎机游戏下载| 百家乐官网视频百家乐官网| 真人百家乐做假| 赌博百家乐官网经验网| 大发888娱乐城客户端lm0| 最佳场百家乐官网的玩法技巧和规则| 新世纪娱乐城信誉怎么样| 在线百家乐平台| 名仕国际棋牌下载|