三種Cache寫入方式原理簡介

三種Cache寫入方式原理簡介

   在386以上檔次的微機中,為了提高系統效率,普遍采用Cache(高速緩沖存儲器),現在的系統甚至可以擁有多級Cache。Cache實際上是位于CPU與DRAM主存儲器之間少量超高速的靜態存儲器(SRAM),通常的大小為8KB~512KB。

    對Cache的工作原理可以進行如下描述:具有Cache的計算機,當CPU需要進行存儲器存取時,首先檢查所需數據是否在Cache中。如果存在,則可以直接存取其中的數據而不必插入任何等待狀態,這是最佳情況,稱為高速命中。當CPU所需信息不在Cache中時,則需切換存取主儲器,由于速度較慢,需 要插入等待,這種情況稱高速未命中。在CPU存取主存儲器的時候,按照最優化原則將存儲信息同時寫入到Cache中以保證下次可能的高速命中。因此,同一數據可能同時存儲在主存儲器和Cache中;同樣,按照優化算法,可以淘汰Cache中的一些不常使用的數據。

  所以,提高高速命中率的最好方法是盡量使Cache存放CPU最近一直在使用的指令與數據,當 Cache 裝滿后,可將相對長期不用的數據刪除,提高 Cache的使用效率。為保持 Cache 中數據與主存儲器中數據的一致性,避免CPU在讀寫過程中,將Cache中的新數據遺失,造成錯誤的讀數據,確保Cache 中更新過程的數據不會因覆蓋而消失,必須將 Cache 中的數據更新及時準確地反映到主存儲器中,這是一個寫入過程,通常采用的處理方法有:直寫式、緩沖直寫式與回寫式三種。

   1.直寫式系統: CPU對Cache寫入時,將數據同時寫入到主存儲器中,這樣可保證Cache中的內容與主存儲器的內容完全一致。這種方式比較直觀,而且簡單、可靠,但由于每次對Cache更新時都要對主存儲器進行寫操作,而這必須通過系統總線來完成,因此總線工作頻繁,系統運行速度就會受到影響。

   2.緩沖直寫式系統:為解決直寫式系統對總線速度的影響問題,在主存儲器的數據寫入時增加緩沖器區。當要寫入主存儲器的數據被緩沖器鎖存后,CPU 便可執行下一個周期的操作,不必等待數據寫入主存儲器 。 這相對于給主存儲器增加了一個單向單次高速緩存。比如,在寫入周期之后可以緊接著一個數據已存在于Cache中的讀取周期,這樣就可避免直寫式系統造成的 操作延時。但這個緩沖器只能存儲一次寫入的數據,當連續兩次寫操作發生時,CPU仍需等待。

  3.回寫式系統:以前的兩種寫入方式系統,都是在 寫Cache的同時,對主存儲器進行寫操作。實際上這不僅是對總線帶寬的占用,浪費了寶貴的執行時間,而且對于有的情況是不必要的,可以通過增加額外的標準來判斷是否有必要更新數據。回寫式系統就是通過在Cache中的每一數據塊的標志字段中加入一更新位,解決主存儲器不必要的寫操作。比如,若Cache 中的數據曾被CPU更新過但還未同時更新主存儲器,則該更新位被置1。每次CPU將一塊新內容寫入Cache時,首先,檢查Cache中該數據塊的更新 位,若更新位為0,則將數據直接寫入Cache;反之,若更新位為1,則先將 Cache 中的該項內容寫入到主存儲器中相應的位置,再將新數據寫回到Cache中。

   與直寫式系統相比,回寫式系統可省下一些不必要的立即回寫操作,而在許多情況下這是很頻繁出現的。即使一個Cache被更新,若未被新的數據所取代,則 沒有必要立刻進行主存儲器的寫操作。也就是說,實際寫入主存儲器的次數,可能少于CPU實際所執行的寫入周期的次數,但回寫式系統的結構較復雜, Cache也必須用額外的容量用來存儲標志。

  由于回寫系統的高效率,現代的Cache大多采取這種方式進行操作。


?

由上面的介紹可以看出,寫透(上述直寫式)和寫回(上述回寫式)有著截然不同的操作,在不同的場合,不同的內存塊使用不同的回寫策略(如果你的系統可以實現的話)要比使用一種策略要高效得多。具體一點,對于反復存取的內存塊置成寫回,而把一次寫入而很長時間以后再使用的內存置為寫透,可以大大提高 cache的效率。


第一點很容易理解,第二點就需要琢磨一下了,由于寫透的操作是,當緩存有該地址的數據時同時更新緩存和主存,當緩存沒有該地址數據直接寫主存,忽略緩存。當該地址的數據很長時間后才被使用到,那么在使用的時候該數據肯定不在cache中(被替換了),所以不如直接寫入主存來得直接;

相反,如果使用寫回操作,當cache中有該地址數據,需要更新該數據,設置dirty位,很長時間后再使用該數據或被替換的時候才將其刷進主存,這有占了茅坑不拉屎的嫌疑;而當cache沒有該地址數據時,情況更糟糕,首先需要將相應的主存數據(一個cache line)導入cache,再更新數據,設置dirty位,再等待被刷回內存,這種情況不僅占用了cache的空間,還多一次從主存中導入數據的過程,同樣占據總線,開銷很大。至于為什么要先從主存中導入數據,是因為cache往主存回寫數據時是按照一個cache line 單位來寫的,但被更新的數據可能沒有一個cache line這么多,所以為了保證數據一致性,必須先把數據導入cache,更新后再刷回來。

對于很多視頻解碼來說,幀寫入過程是一個一次性的動作,只有在下一次作為參考幀時才會被使用到,所以幀緩沖內存可以設置為寫透操作,而下一次使用它的時候很可能是作為參考幀來使用,而作為參考幀不需要反復的存取,只需一次讀操作就可以了,所以效率并不會因為不經過cache而降低。實驗證明該方法可以使mpeg4 sp解碼提高20-30%的效率。

?

?

相似的內容cache操作的小技巧還有prefetch操作,prefetch操作是將主存的數據導入cache而期間cpu不需要等待,繼續下一 條指令的執行,如果下一條指令也是總線的操作,那么就必須等待prefetch完成以后再開始。所以,在使用該指令時,在prefetch指令后面插入盡 可能大于一次緩存不命中所需要的clock數對應的指令,那么prefetch與其后面的指令可以并行執行,從而省去了等待的過程,相當于抵消緩存不命中 的損失。當然,如果插入的指令太多而cache太小,有可能prefetch的數據進入cache后又被替換掉了,所以,這需要自己去評估。

?


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/450920.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450920.shtml
英文地址,請注明出處:http://en.pswp.cn/news/450920.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Minor GC和Full GC

我們在日常開發中可能經常會聽大家談論GC,但是其實很多人對GC的種類其實并不是很了解,接下來我們簡單介紹下Minor GC和Full GC及他們的區別。 MinorGC: 也可以叫作新生代GC,指的是發生在新生代的垃圾收集動作。因為新生代中對象大…

linux安裝軟件的幾種方法

見:http://blog.csdn.net/u010509774/article/details/50593231 一、rpm包安裝方式步驟: 1、找到相應的軟件包,比如soft.version.rpm,下載到本機某個目錄; 2、打開一個終端,su -成root用戶; …

Android NDK MediaCodec在ijkplayer中的實踐

https://www.jianshu.com/p/41d3147a5e07 從API 21(Android 5.0)開始Android提供C層的NDK MediaCodec的接口。 Java MediaCodec是對NDK MediaCodec的封裝,ijkplayer硬解通路一直使用的是Java MediaCodec接Surface的方式。 本文的主要內容是&a…

leetcode-49-字母異位詞分組(神奇的哈希)

題目描述: 給定一個字符串數組,將字母異位詞組合在一起。字母異位詞指字母相同,但排列不同的字符串。 示例: 輸入: ["eat", "tea", "tan", "ate", "nat", "bat"], 輸出: [[&quo…

【精心總結】java內存模型和多線程必會知識

內存模型 (1)java內存模型到底是個啥子東西? java內存模型是java虛擬機規范定義的一種特定模型,用以屏蔽不同硬件和操作系統的內存訪問差異,讓java在不同平臺中能達到一致的內存訪問效果,是在特定的協議下…

工作流 activity 視頻教程 + redis 視頻教程 百度網盤分享地址

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 云盤下載都沒有密碼,直接下載,解壓有密碼:chongxiangmengxiangjiaoyu, 解壓完成后就可以…

快速解決 GRADLE 項目下載 gradle-*-all.zip 慢的問題

1、首先根據項目中 gradle\wrapper\gradle-wrapper.properties 文件的 distributionUrl 屬性的值 #Tue Feb 06 12:27:20 CET 2018 distributionBaseGRADLE_USER_HOME distributionPathwrapper/dists zipStoreBaseGRADLE_USER_HOME zipStorePathwrapper/dists distributionUrlht…

[Python] 程序結構與控制流

1. 條件語句 if、else與elif語句用于控制條件代碼的執行。條件語句的一般格式如下: if expression:statements elif expression:statements elif expression:statements ... else:statements 如果不需要執行任何操作,可以省略條件語句的else和elif子句。…

webrtc 源碼結構

apiWebRTC 接口層。包括 DataChannel, MediaStream, SDP相關的接口。各瀏覽器都是通過該接口層調用的 WebRTC。call存放的是 WebRTC “呼叫(Call)” 相關邏輯層的代碼。audio存放音頻網絡邏輯層相關的代碼。音頻數據邏輯上的發送,接收等代碼。…

mysql查詢流程解析及重要知識總結

時光荏苒啊!在過兩個月我就工作滿三年了,大學畢業的情景還歷歷在目,而我已經默默的向油膩中年大叔進發了。作為一名苦逼的后端工程師,我搞過一段時間python,現在靠java糊口,但后來才發現,始終不…

界面無小事(八):RecyclerView增刪item

界面無小事(一): RecyclerViewCardView了解一下 界面無小事(二): 讓RecyclerView展示更多不同視圖 界面無小事(三):用RecyclerView Toolbar做個文件選擇器 界面無小事(四):來寫個滾動選擇器吧! 界面無小事(五):自定義TextView 界面無小事(六):來做個好看得側拉菜單! 界面無小事…

Failed to install Tomcat7 service 解決

見: http://blog.csdn.net/desow/article/details/21446197 tomcat 安裝時出現 Failed to install Tomcat7 service 今天在安裝tomcat時提示 Failed to install Tomcat7 service了,花了大半天的時間找到了原因,下面分享給大家,希望…

保守官僚 諾基亞就這樣迷失在智能機時代?

7月19日,諾基亞發布了二季度財報,凈虧損達到了17億美元,其中智能手機份額和銷售量進一步下滑,這個智能手機的領導者,正在因智能手機而急速墜落。諾記亞領先業界近十年就把握住了智能手機的趨勢,并推出了首款…

django集成ansibe實現自動化

動態生成主機列表和相關參數 def create_admin_domain(admin_node):workpath BASE_DIR /tools/ansible/scripthosts_file BASE_DIR /tools/ansible/host/ createhostfile()yml_file BASE_DIR /tools/ansible/yml/ create_admin_domain.ymldomain_path admin_node.doma…

extend 對象繼承

function extend(o, n, override) {for (var p in n) {if (n.hasOwnProperty(p) && (!o.hasOwnProperty(p) || override))o[p] n[p];} }// 默認參數 var options {pageIndex: 1,pageTotal: 2 };// 新設置參數 var userOptions {pageIndex: 3,pageSize: 10 }extend(o…

【spring容器啟動】之bean的實例化和初始化(文末附:spring循環依賴原理)

本次我們通過源碼介紹ApplicationContext容器初始化流程,主要介紹容器內bean的實例化和初始化過程。ApplicationContext是Spring推出的先進Ioc容器,它繼承了舊版本Ioc容器BeanFactory,并進一步擴展了容器的功能,增加了bean的自動識…

如何將自己的Java項目部署到外網

見:http://jingyan.baidu.com/article/90bc8fc864699af653640cf7.html 做b/s模式的web開發不同于c/s模式的客戶端開發,c/s模式我們只要做好生成可執行文件發送給其他人,其他人就可以用了。但是c/s模式不同,在同一局域網下&#xf…

[Swift]LeetCode916.單詞子集 | Word Subsets

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★?微信公眾號:山青詠芝(shanqingyongzhi)?博客園地址:山青詠芝(https://www.cnblogs.com/strengthen/)?GitHub地址&a…

揭秘騰訊研究院輸出策略:產品和人才的孵化器

直到現在,騰訊研究院創始人鄭全戰仍堅持面試招入研究院的每一個人,并做詳細記錄。天賦上的靈性、性格中的包容是他看重的,當然首先人要踏實。大約6年前,鄭全戰加入騰訊,負責籌建中國互聯網公司中的第一個研究院&#x…

java后端必會【基礎知識點】

(一)java集合類(done) 在java集合類中最常用的是Collection和Map的接口實現類。Collection又分為List和Set兩類接口,List的實現類有ArrayList、LinkedList、Vector、Stack,Set接口的實現類有HashSet、Tree…