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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

關于內存緩存的那些事

冬至配餃子 ? 來源:天奇工作室 ? 作者:LRC ? 2022-08-03 16:59 ? 次閱讀

內存中的數(shù)據被劃分成若干個緩存塊,每個緩存塊的大小正好對應著一整個三級緩存的大小。如此一來,數(shù)據在內存中緩存塊里的偏移量正好就對應著該數(shù)據應該存在于緩存中的位置。舉個例子,假設內存中一共有四個緩存塊,記為00,01,10,11四塊。每個緩存塊又可以劃分成四個緩存行,記為00,01,10,11四行。結合起來,最上面緩存塊的最上面的緩存行就可以寫成0000,則這個部分的數(shù)據應該存在于緩存中的第一個緩存行的位置即00位置。如果1000號緩存行需要寫入,那么就要把0000號緩存行擦除再寫入,不能存儲在緩存中別的地方即使還有空間存放。

pYYBAGLqOFWAL9UtAADEbinV8go779.png

從內存到緩存的分類規(guī)則

我們會發(fā)現(xiàn)一個問題,就是如果我們持續(xù)需要0000號緩存行和1000號緩存行中的數(shù)據,那么這倆緩存行會被互相擦除寫入,就像打乒乓球一樣,擦了又寫,寫了又擦,而緩存中可能別的位置還空著,造成浪費資源,效率低下的乒乓效應。

解決的辦法之一就是加大緩存容量。很好理解,緩存變大了,取一個極限,假設緩存和內存一樣大了,那肯定就不存在乒乓效應了,但是這幾乎不可能。

還有一個有意思的思路是,設置一個受害者緩存,(哈哈,這個英文名是我自己亂翻譯的)。這個受害者緩存會暫時保留一下不久前剛被擦除的數(shù)據,緩存控制器在讀取緩存時就捎帶看看這個受害者緩存里有沒有想要的數(shù)據,如果真的碰到了,那這個數(shù)據真就是受害了,冤的很。這個電路實現(xiàn)也很簡單,沒啥難度,就是效果可能有點玄學。

有沒有什么不那么玄學的方法呢?于是前人提出了多路組關聯(lián)。既然前文如此粗暴的分割方式會造成乒乓效應,那么我們干脆多來幾個可替換的位置。還是以上面的例子,假設內存中一共有四個緩存塊,記為00,01,10,11四塊。每個緩存塊又可以劃分成四個緩存行,記為00,01,10,11四行?,F(xiàn)在不同的是我們把緩存劃分成兩路,暫且叫做A路和B路吧。保持和上文中的緩存容量大小一致,那么每路緩存中現(xiàn)在只夠存儲兩個緩存行了,記為0號和1號緩存行??偨Y一下,現(xiàn)在緩存方面有AB兩路,每路有01兩行。內存方面則一共有四個緩存塊,每個緩存塊有四個緩存行?,F(xiàn)在規(guī)定內存中緩存行編號最后一位是0的可以存在緩存的A或B路的0號緩存行中,內存中緩存行編號最后一位是1的可以存在緩存的A或B路的1號緩存行中。發(fā)現(xiàn)問題沒有?因為末尾為同一編號的緩存行可以同時存在于A或者B中,因此乒乓效應會有所改善。

上述例子展示的是兩路組關聯(lián),目前主流使用的是四路組關聯(lián),但實際上路的個數(shù)要結合緩存與內存的比例來綜合判斷,例如上述例子,兩路組關聯(lián)就不太合適,單路的容量被壓縮得太小了。

另外,上文所講的是內存和三級緩存之間的關聯(lián)情況,該情況可以推廣至三級緩存和二級緩存之間以及二級緩存和一級緩存之間。在此就不再贅述了。

這里還是要注意一個之前說過的細節(jié),CPU并不會主動控制緩存寫入內存中的數(shù)據的,也就是說緩存對于CPU來講是透明的(這個詞不是很容易理解,但是這就是之前人們翻譯的,我建議翻譯成無感知)。CPU只是說我要讀這塊內存里的數(shù)據,它甚至不知道這個內存數(shù)據在哪里,它只負責宣布這件事,而緩存和內存則負責把它要的數(shù)據喂給它而已。緩存在喂給它之后留了個“心眼”——“咱家主子(CPU)最近偏愛000110100這塊內存數(shù)據,我就把這塊數(shù)據留在我這里,到時候要的時候拿著方便“??炊藛??一切都是奴才自作主張。

再打個比方,CPU和緩存的關系就像我和我的胃。我不用控制我的胃蠕動消化,我不用控制神經元突觸釋放神經遞質,我只負責做最高級,最抽象的工作,比如控制我的手寫下這篇文章。我不知道我有胃這種東西,也不知道什么神經遞質、細胞、組織啥的,就像CPU不知道緩存一樣,我之所以知道這些是因為有人做了人體解剖等生物研究,CPU想了解這些可能得等人工智能解剖另一個人工智能的時候,或者——用它的意識來讀讀我這篇文章。

話說回來,各級緩存之間有兩種不太相同的緩存策略,分別是Inclusive和Exclusive。

前者意思是包含,后者意思是不包含。包含的意思是,三級緩存中一定會存在著二級緩存和一級緩存里的數(shù)據,二級緩存一定會存在著一級緩存的數(shù)據,其實質就是數(shù)據從三級往一級走的過程中用的是“復制”。

而不包含的意思是,三級緩存中必不存在二級緩存和一級緩存里的數(shù)據,二級緩存中必不存在一級緩存的數(shù)據,其實質就是數(shù)據從三級往一級走的過程中用的是“剪切”。這兩種緩存策略的優(yōu)劣應該一眼能看出:包含策略會造成緩存空間浪費,并且各級之間的數(shù)據更新需要保持同步,優(yōu)點則是數(shù)據的廢除很直接,還有一個優(yōu)點這里先挖個坑吧。而不包含策略則不會造成緩存浪費,并且具有很好的緩存一致性(即不需要同步),但是數(shù)據交換量會變得很大。

這里分別用緩存寫入數(shù)據的例子說說包含和不包含兩種緩存策略。一開始,CPU首先發(fā)出一個讀內存指令,該指令會附帶著該內存地址從CPU內核轉發(fā)至一級緩存控制器,假設一級緩存沒有在本級緩存找到想要的數(shù)據,那么就會將讀內存指令的請求往二級緩存控制器轉發(fā),以此類推,如果都沒能找到數(shù)據,那么最后內存控制器會得到這條讀內存指令,并將數(shù)據返回至CPU內核,同時該條數(shù)據會在CPU的一級緩存上得到保存(如果是使用Inclusive緩存策略,那么該數(shù)據也同時會在二級和三級緩存上得到保存),以便于下次再次使用。然而緩存在電腦開機之后不久肯定就被填滿了,這時候要有新的數(shù)據要寫入緩存那么肯定需要把一些過時的數(shù)據給替換出去。那么具體是怎么個替換策略呢?這就考驗奴才們對于主子心思的把控了。這時候有個聰明的奴才在總結了多次經驗后,提出了LRU替換策略,中文名譯為最近最少使用替換策略,很容易理解,就是最近最少使用的數(shù)據將會被新數(shù)據替換掉。

而包含和不包含的區(qū)別在這里就會有所體現(xiàn)。如果是包含策略,那么新數(shù)據直接覆蓋舊數(shù)據即可,舊數(shù)據等于直接作廢,除非這個數(shù)據最近在CPU中被改寫過,需要返回到內存中進行保存,那么才需要將該緩存行刷回內存(那么如何確定該緩存行是否被改寫過呢?可以用一個名為dirty的標志位注明)。而如果是不包含策略,那么一級緩存淘汰下來的數(shù)據就要放置到二級緩存,如果不巧二級緩存也滿了,那么仍需淘汰一個緩存下來。當然,你也可以選擇如果二級緩存或者三級緩存沒空位,那么就直接把淘汰下來的數(shù)據扔回內存,但是這樣命中率就會嚴重下降(等于整個緩存體系的容量和一級緩存是一樣大的)。并且如果是二級緩存或者三級緩存中的數(shù)據要寫入到一級緩存中,那么需要把該二級或者三級緩存的緩存行與一級緩存做一個交換,而不是覆蓋。

那究竟是用Inclusive還是Exclusive呢?各大CPU廠商給出了答案,Exclusive成為目前主流使用的緩存策略。Intel前幾年還在用Inclusive來著,最近這幾年也轉而使用了Exclusive,說明Exclusive的優(yōu)勢比我們想象的大。


審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 控制器
    +關注

    關注

    112

    文章

    16039

    瀏覽量

    176722
  • cpu
    cpu
    +關注

    關注

    68

    文章

    10778

    瀏覽量

    210487
  • 緩存器
    +關注

    關注

    0

    文章

    63

    瀏覽量

    11635
收藏 人收藏

    評論

    相關推薦

    什么是CPU緩存?它有哪些作用?

    CPU緩存(Cache Memory)是計算機系統(tǒng)中一個至關重要的組成部分,它位于CPU與內存之間,作為兩者之間的臨時存儲器。CPU緩存的主要作用是減少CPU訪問內存所需的時間,從而提
    的頭像 發(fā)表于 08-22 14:54 ?1736次閱讀

    芯片設計流片、驗證、成本的那些

    前言我們聊聊芯片設計、流片、驗證、制造、成本的那些;流片對于芯片設計來說就是參加一次大考。流片的重要性就在于能夠檢驗芯片設計是否成功,是芯片制造的關鍵環(huán)節(jié),也就是將設計好的方案交給芯片制造廠生產
    的頭像 發(fā)表于 08-09 08:11 ?1643次閱讀
    芯片設計流片、驗證、成本的<b class='flag-5'>那些</b><b class='flag-5'>事</b>

    ESP8266緩存AP后,是否會自動連接到任何緩存的AP?

    我有一個關于工作站模式的 AP 緩存的問題。我知道ESP8266最多可以緩存 5 個 AP 已成功連接。SDK 說: wifi_station_ap_number_set 設置將在
    發(fā)表于 07-11 07:58

    輥壓機軸承位磨損修復你不知道的那些

    電子發(fā)燒友網站提供《輥壓機軸承位磨損修復你不知道的那些.docx》資料免費下載
    發(fā)表于 03-12 15:10 ?0次下載

    如何選擇合適的本地緩存

    小編最近在使用系統(tǒng)的時候,發(fā)現(xiàn)盡管應用已經使用了 redis 緩存提高查詢效率,但是仍然有進一步優(yōu)化的空間,于是想到了比分布式緩存性能更好的本地緩存,因此對領域內常用的本地緩存進行了一
    的頭像 發(fā)表于 01-18 11:19 ?778次閱讀
    如何選擇合適的本地<b class='flag-5'>緩存</b>?

    關于觸摸芯片的那些

    一分鐘簡單了解觸摸芯片
    的頭像 發(fā)表于 01-03 16:56 ?891次閱讀

    Redis緩存預熱+緩存雪崩+緩存擊穿+緩存穿透要點簡析

    緩存預熱就是系統(tǒng)上線后,提前將相關的緩存數(shù)據直接加載到緩存系統(tǒng)。
    的頭像 發(fā)表于 12-25 09:41 ?785次閱讀
    Redis<b class='flag-5'>緩存</b>預熱+<b class='flag-5'>緩存</b>雪崩+<b class='flag-5'>緩存</b>擊穿+<b class='flag-5'>緩存</b>穿透要點簡析

    關于射頻微機電系統(tǒng)開關的那些事兒

    關于射頻微機電系統(tǒng)開關的那些事兒
    的頭像 發(fā)表于 12-06 14:58 ?446次閱讀
    <b class='flag-5'>關于</b>射頻微機電系統(tǒng)開關的<b class='flag-5'>那些</b>事兒

    關于MLCC(多層陶瓷電容)替代Film Cap (薄膜電容)的那些

    關于MLCC(多層陶瓷電容)替代Film Cap (薄膜電容)的那些
    的頭像 發(fā)表于 12-04 17:35 ?1697次閱讀
    有<b class='flag-5'>關于</b>MLCC(多層陶瓷電容)替代Film Cap (薄膜電容)的<b class='flag-5'>那些</b><b class='flag-5'>事</b>

    mybatis一級緩存和二級緩存的原理

    MyBatis是一種輕量級的持久化框架,它提供了一級緩存和二級緩存的機制來優(yōu)化數(shù)據庫操作性能。一級緩存是默認開啟的,而二級緩存需要手動配置啟用。 一、一級
    的頭像 發(fā)表于 12-03 11:55 ?1005次閱讀

    Spring Cache緩存常規(guī)配置

    作者最近在開發(fā)公司項目時使用到 Redis 緩存,并在翻看前人代碼時,看到了一種關于 @Cacheable 注解的自定義緩存有效期的解決方案,感覺比較實用,因此作者自己拓展完善了一番后分享給各位。
    的頭像 發(fā)表于 11-28 10:44 ?536次閱讀
    Spring Cache<b class='flag-5'>緩存</b>常規(guī)配置

    關于STM32復位的那些

    硬件復位電路如下圖,直接將RESET引腳拉低即可
    的頭像 發(fā)表于 11-24 15:23 ?2030次閱讀
    <b class='flag-5'>關于</b>STM32復位的<b class='flag-5'>那些</b><b class='flag-5'>事</b>

    盤點那些強大又低調的Java緩存

    HashMap 是很多程序員接觸的第一種緩存 , 因為現(xiàn)實業(yè)務場景里,我們可能需要給緩存添加緩存統(tǒng)計、過期失效、淘汰策略等功能,HashMap 的功能就顯得孱弱 ,所以 HashMap 在業(yè)務系統(tǒng)中使用得并不算多。
    的頭像 發(fā)表于 11-14 18:02 ?417次閱讀
    盤點<b class='flag-5'>那些</b>強大又低調的Java<b class='flag-5'>緩存</b>

    Linux 內存管理總結

    、緩存、交換分區(qū)等。Linux內存管理的目標是最大限度地利用可用內存,同時保證系統(tǒng)的穩(wěn)定和可靠性。 1.1 什么是內存管理 內存管理是計算機
    的頭像 發(fā)表于 11-10 14:58 ?468次閱讀
    Linux <b class='flag-5'>內存</b>管理總結

    關于北斗“授時”的那些,你知道多少?

    如今,通信系統(tǒng)、電力系統(tǒng)、金融系統(tǒng)、導航系統(tǒng)等,其有效運行都依賴于高精度時間同步。我們可以通過鐘表、手機、電腦、廣播以及新聞聯(lián)播等方式來查看時間信息(北京時間)。 那么,這些時間信息又是從哪里來的呢?為什么我們可以隨時隨地都能獲取準確的時間信息?這得益于高精度的授時服務,今天我們就來揭開“授時”的神秘面紗。 大家都知道我國的北斗導航衛(wèi)星,是用于定位導航的。那么北斗是怎么進行定位導航的呢? 實際上,導航衛(wèi)
    的頭像 發(fā)表于 10-30 14:34 ?1876次閱讀
    <b class='flag-5'>關于</b>北斗“授時”的<b class='flag-5'>那些</b><b class='flag-5'>事</b>,你知道多少?