<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Cache 工作原理,Cache 一致性,你想知道的都在這里

          共 621字,需瀏覽 2分鐘

           ·

          2021-10-16 12:25

          -? ? ?前言? ? -


          可以隨便到網上查一查,各大互聯(lián)網公司筆試面試特別喜歡考一道算法題,即 LRU緩存機制,又順手查了一下LRU緩存機制最近有哪些企業(yè)喜歡考察,超級大熱門!
          今天給大家分享一篇關于 Cache 的硬核的技術文,基本上關于Cache的所有知識點都可以在這篇文章里看到。

          關于 Cache 這方面內容圖比較多,不想自己畫了,所以圖都來自《Computer Architecture : A Quantitative Approach》。

          這是一本體系架構方面的神書,推薦大家看一下。

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



          -? ? ?為什么需要 Cache? ? -


          1.1 為什么需要 Cache


          我們首先從一張圖來開始講為什么需要 Cache。

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

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

          所以造成了一個問題,存儲限制了計算的發(fā)展。

          容量與速度不可兼得。

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

          我們隨便貼段代碼:

          for?(j?=?0;?j?????for(?i?=?0;?i?????????x[i][j]?=?2?*?x[i][j];

          可以看到,由于大量循環(huán)的存在,我們訪問的數(shù)據其實在內存中的位置是相近的。
          換句專業(yè)點的話說,我們訪問的數(shù)據有局部性。

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

          總結起來,Cache是為了給CPU提供高速存儲訪問,利用數(shù)據局部性而設計的小存儲單元。

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


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

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

          數(shù)據訪問時先找寄存器,寄存器里沒有找 L1 Cache, L1 Cache 里沒有找 L2 Cache 依次類推,最后找到硬盤中。

          同時,我們可以看到,速度與存儲容量的折衷關系。容量越小,訪問速度越快!
          其中,一個概念需要搞清楚。


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

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

          1.3 Cache 的分類


          Cache按照不同標準分類可以分為若干類。

          • 按照數(shù)據類型劃分:I-Cache與D-Cache。其中I-Cache負責放置指令,D-Cache負責方式數(shù)據。兩者最大的不同是D-Cache里的數(shù)據可以寫回,I-Cache是只讀的。
          • 按照大小劃分:分為small Cache和large Cache。沒路組(后文組相連介紹)<4KB叫small Cache, 多用于L1 Cache, 大于4KB叫l(wèi)arge Cache。多用于L2及其他Cache.
          • 按照位置劃分:Inner Cache和Outer Cache。一般獨屬于CPU微架構的叫Inner Cache, 例如上圖的L1 L2 CACHE。不屬于CPU微架構的叫outer Cache.
          • 按照數(shù)據關系劃分:Inclusive/exclusive Cache: 下級Cache包含上級的數(shù)據叫inclusive Cache。不包含叫exclusive Cache。舉個例子,L3 Cache里有L2 Cache的數(shù)據,則L2 Cache叫exclusive Cache。



          -? ? ?Cache的工作原理? ? -


          要講清楚 Cache 的工作原理,需要回答 4 個問題:

          • 數(shù)據如何放置
          • 數(shù)據如何查詢
          • 數(shù)據如何被替換
          • 如果發(fā)生了寫操作,Cache如何處理

          2.1 數(shù)據如何放置


          這個問題也好解決。我們舉個簡單的栗子來說明問題。

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

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

          那么應該放到 Cache 里什么位置呢?

          三種方法:
          • 全相連(Fully associative)。可以放在Cache的任何位置。
          • 直接映射(Direct mapped)。只允許放在Cache的某一行。比如12 mod 8
          • 組相連(set associative)。可以放在Cache的某幾行。例如2路組相連,一共有4組,所以可以放在0,1位置中的一個。

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

          不同的放置方式主要影響有兩點:

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

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

          這也好理解,內存中的塊在Cache中可放置的位置多,自然找起來就麻煩。


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


          其實找數(shù)據就是一個比對過程,如下圖所示。


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

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

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

          組內放著若干數(shù)據,我們需要比較Tag, 如果組內有Tag出現(xiàn),則說明我們訪問的數(shù)據在緩存中,可以開心的使用了。

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

          T表示Tag。直接比較Tag,就能得知是不是命中了。如果命中了,則根據index(組號)將對應的塊取出來即可。

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

          那如果不在緩存中呢?這就涉及到另一個問題。

          不在緩存中如何替換 Cache ?

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


          Cache中的數(shù)據如何被替換的?這個就比較簡單直接。
          • 隨機替換。如果發(fā)生Cache miss里隨機替換掉一塊。
          • Least recently used. LRU。最近使用的塊最后替換。
          • First in, first out (FIFO), 先進先出。

          實際上第一個不怎么使用,LRU 和 FIFO 根據實際情況選擇即可。

          Cache 在什么時候數(shù)據會被替換內?也有幾種策略。

          • 不在本 Cache 替換。如果Cache miss了,直接轉發(fā)訪問地址到主存,取到的數(shù)據不會寫到Cache.
          • 在讀MISS時替換。如果讀的時候Cache里沒有該數(shù)據,則從主存讀取該數(shù)據后寫入Cache。
          • 在寫MISS時替換。如果寫的時候Cache里沒有該數(shù)據,則將本數(shù)據調入Cache再寫。


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


          Cache畢竟是個臨時緩存。

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

          也有三種策略。

          • 通寫:直接把數(shù)據寫回Cache的同時寫回主存。極其影響寫速度。
          • 回寫:先把數(shù)據寫回Cache, 然后當Cache的數(shù)據被替換時再寫回主存。
          • 通寫隊列:通寫與回寫的結合。先寫回一個隊列,然后慢慢往主存儲寫。如果多次寫同一個數(shù)據,直接寫這個隊列。避免頻繁寫主存。



          -? ? ?Cache 一致性? ? -


          Cache 一致性是 Cache 中遇到的比較坑的一個問題。

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

          主要是多核系統(tǒng)中,假如core 0讀了主存儲的數(shù)據,寫了數(shù)據。core 1也讀了主從的數(shù)據。這個時候core 1并不知道數(shù)據已經被改動了,也就是說,core 1 Cache中的數(shù)據過時了,會產生錯誤。

          Cache一致性的保證就是讓多核訪問不出錯。


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

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


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

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

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

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

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


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

          • SI: 對于一個數(shù)據塊來講,有share和invalid兩種狀態(tài)。如果是share狀態(tài),直接通知其他Cache, 將對應的塊置為無效。
          • MSI:對于一個數(shù)據塊來講,有share和invalid,modified三種狀態(tài)。其中modified狀態(tài)表表示該數(shù)據只屬于這個Cache, 被修改過了。當這個數(shù)據被逐出Cache時更新主存。這么做的好處是避免了大量的主從寫入。同時,如果是invalid時寫該數(shù)據,就要保證其他所有Cache里該數(shù)據的標志位不為M,負責要先寫回主存儲。
          • MESI:對于一個數(shù)據來講,有4個狀態(tài)。modified, invalid, shared, exclusive。其中exclusive狀態(tài)用于標識該數(shù)據與其他Cache不依賴。要寫的時候直接將該Cache狀態(tài)改成M即可。

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

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

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

          當前狀態(tài)為S態(tài)
          • 如果發(fā)生了處理器讀操作,仍然在S態(tài)。
          • 如果發(fā)生了處理器寫操作,則跳轉到M狀態(tài)。
          • 如果其他Cache發(fā)生了寫操作,跳到I態(tài)。

          當前狀態(tài)E態(tài)
          • 發(fā)生了處理器讀操作還是E。
          • 發(fā)生了處理器寫操作變成M。
          • 如果其他Cache發(fā)生了讀操作,變到S狀態(tài)。

          當前狀態(tài)M態(tài)
          • 發(fā)生了讀操作依舊是M態(tài)。
          • 發(fā)生了寫操作依舊是M態(tài)。
          • 如果其他Cache發(fā)生了讀操作,則將數(shù)據寫回主存儲,變換到S態(tài)。



          -? ? ?總結? ? -


          Cache 在計算機體系架構中有非常重要的地位,本文講了 Cache中最主要的內容,具體細節(jié)可以再根據某個點深入研究。

          者:桔里貓?

          來源:https://zhuanlan.zhihu.com/p/386919471

          瀏覽 22
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  五月丁香激情婷婷 | 18禁天堂 | www,五月天 | 99久久婷婷豆花 | 一区二区第三十七页 |