Cache(高速緩存)技術詳解

2021-01-07 電子產品世界

計算機系統一般都採用多級存儲器結構,如寄存器、主存、磁碟、光碟、磁帶等。這種多級存儲器的特點是從外存儲器到CPU中的寄存器逐級向上,存儲容量逐級減小,而存取速度逐級提高。由於上下兩級存儲器的速度可以相差l—2個數量級或者更高,因此,上一級和下一級存儲器的數據交換常常成為系統瓶頸,大大降低了系統的性能。為了解決這個問題,通常採用的辦法是在兩級存儲器之間增加一個高速緩衝存儲器Cache。

所謂Cache是一個速度等於或者接近上一級存儲器訪問速度的小容量存儲器,其中保存了下級存儲器中部分當前所需的數據,因此CPU可以直接從Cache中取得所需的數據,而不必訪問下一級存儲器。由於Cache的速度與上一級存儲器相當,因此保證了系統效率不會降低。Cache的設計依據是程序存取局部性原理,通常程序存取的一批數據總是存放在存儲器相鄰的單元中,只要把這一批數據同時調入cache中,即可保證近期內需要的數據都能在Caclle中訪問成功。為了實現上述目標,在設計Cache時必須做到以下兩點:

1.保證訪問Cache有較高的命中率;
2.訪問Cache與訪問下級存儲器的方式不變、容量不減。因此對於編程人員來說,Cache是完全透明的,也就是說,他們感覺不到Cache的存在。

由於Cache的容量比下級存儲器小l-2個數量級、要做到上述兩點,則必須考慮以下問題:

1.如何組織Cache,使得下級存儲器的每個部分都能夠在需要時調入Cache
2.採用何種替換策略、使得訪問cache的命中率最高;
3.採用什麼方法使得Cache和下級存儲器的數據具有—致性,即修改Cache後保證下級存儲器的內容也隨之修改(或者相反)。

通過上面的介紹,我們知道Cache也是一種存儲器,其工作速度很高,如Ll和L2 Cache就是為了解決PU和DRAM主存之間的速度匹配而設置的。因此主存Cache也可以看作是高速CPU和低速DRAM之間的接口。或者說,把Cache看成一個適配器來解決CPU和DRAM之間的速度匹配問題。

當CPU要從存儲器中讀取一個數據字時,它首先在Cache中查找。如果找到了,則立即從Cache中讀取並送到CPU中;如果在Cache中找不到,則用一個存儲器讀周期的時間從主存個讀出這個數據字送到CPU、並且把包含這個數據字的整個內存數據塊都從主存送到Cache中。之所以要把包含被讀數據字的整個內存數據塊都從主存送到Cache中是因為對存儲器的訪問具有局部性,也就是說連續讀取的數據宇一般在內存中都是連續存放的;調入一個數據塊後,將使得以後若干次的訪存都可以通過訪問Cache來完成。如果調度算法得當,Cache的命中率可以很高。這樣,從用戶的角度看來,整個存儲器(Cache+DRAM)就變成了既有Cache這樣高的速度,又有DRAM這樣的大容量的存儲系統了。這對於解決存儲器這個瓶頸是十分有效的。

綜上所述,Cache具有以下一些特點:

·Cache雖然也是一類存儲器.但是不能由用戶直接訪問。
·Cache的容量不大,其中存放的只是主存儲器中某一部分內容的拷貝,稱為存儲器映象。
·為了保證CPU訪問時有較高的命中率,Cache中的內容應該按一定的算法更換。
·Cache中的內容應該與主存中對應的部分保持一致。也就是說,如果主存守的內容在調入Cache之後發生了改變,那麼它在Cache中的拷貝也應該隨之改變。反過來,如果CPU修改了Cache中的內容,也應該修改主存中的相應內容。

現代的Cache系統常常採用分級組織的方法,在CPU中集成了一級Cache(L1),也稱為片內Cache;在主板上配置二級Cache(L2)。CPU中的片內Cache雖然容量較小,但是能夠以CPU相同的工作頻率工作,因此速度極快。一般情況下在L1未命中時,才在L2中查找。從賽揚處理器開始,甚至已經把L2集成到CPU內部了(K6-3處理器也內置了二級緩存,而這時相應的Socket 7主板上的二級緩存就成為「三級」緩存了)。

所謂存儲器映像問題就是如何組織Cache.使得下級存儲器的每個部分都能夠在需要時調入Cache,並且確定調入的內容放在Cache中的什麼地方,以便於準確迅速地查找。存儲器映像的方法主要有全相聯映像法、直接映象法和組相聯映象法。

全相聯映像法的基本思想是把一個主存塊的地址(塊號)和塊的內容都拷貝到Cache行中;由於塊地址也保存在Cache中,因此可以拷貝到Cache中的任意位置。此法的優點是靈活,但是查找比較困難,而且硬體的實現較為困難。

直接映像法的基本思想是一個主存塊只能拷貝到Cache中固定的行內。該按硬體成本低,但是由於一個Cache行要對應多個主存塊,在使用中當這些主存塊需要同時調入Cache時將發生衝突、增加調入調出的開銷。

組相聯映像法是上述兩種方法的折衷方案。其基本思想是把Cache分為m個組,每個組分為n行。主存塊分配時對組是固定的、而在組內的位置可以任意。這樣就綜合了兩者的優點,這是目前最常用的方法。

由於Cache的容量總是遠小於下一級存儲器的容量,因此Cache中只能是下級存儲器的部分映像。為了使下級存儲器的內容都能在需要時拷貝到Cache中,必須隨時替換Cache內容:即把當前不需要的內容調出Cache,騰出空間,調入當前需要的內存塊。在這種調入調出方法中,最重要的是替換的策略,即在需要時選擇Cache中的哪些行調出,再調入所需的內存塊。這種替換策略通常稱為調度算法,它是由硬體實現的。如果算法選擇不當,將大大增加調入調出的頻度。例如把一個當前不需要但是很快就將使用的行調出,必然會降低系統的效率。

常用算法有最不經常使用算法、最近最少使用算法。

最不經常使用算法(LFU算法)的思想是把最近一段時間內被訪問次數最少的行調出。因此需要對每一個行設置一個計數器,對該行的訪問次數計數、在需要時比較各個計數器的值,淘汰計數次數最少的數據行。這種算法的問題是明顯的、那些在程序前期被頻繁訪問而在後期不再使用的行,可能會在相當長的時間內不被淘沈而那些剛剛調入並將繼續反覆使用的行則可能因為其計數器中的值較小而頻道淘汰。這將嚴重影響系統的效率。

另一種較常用的算法是最近最少使用算法(LRU算法)。LRU算法的思想是將最近一段時間內最少被訪問過的行淘汰出局。因此也需要為每行設置一個計數器、但是計數方法與LFU算法不同。LRU算法是把命中行的計數器清零、其它各行計數器加1。當需要替換時淘汰行計數器計數值最大的數據行出局。

此外還有一些算法,鑑於篇幅不再贅述。

由於Cache中的內容只是主存中相應單元的「拷貝」。因此必須保持這兩處的數據絕對一致,否則就會產生錯誤。造成Cache和相應主存單元數據不一致的原因來自兩個方面。一是CPU讀人Cache數據作了修改後再寫入Cache,而主存中相應單元的內容並未隨之變化二是在有多個設備對主存訪問的情況下造成的。如多處理器或有DMA的系統,它們直接訪問主存儲器,修改了其中的內容,而cache中的相應數據卻末隨之修改。

1.CPU修改Cache後的處理

對於CPU修改了Cache的數據,如何使主存中相應單元的數據也隨之修改的問題。通常有三種不同的處理方式。

一種方式稱為「直寫式(write—through)」,其原理是在CPU向Cache寫入的同時,也把數據寫入主存儲器,以保證Cache和主存中相應單元數據的一致性。直寫式系統簡單可靠,但由於CPU每次更新Cache時都要對主存儲器寫入,習此速度受到了影響。

第二種方式稱為「緩衝直寫式(Posted Write)」,其原理是CPU在更新Cache時不直接更新主存中的數據,而是把更新的數據送入一個緩衝器中暫存,這樣CPU就不必等待主存寫入造成的延時而直接進入下一周期的操作在適當的時候再把緩衝器中的內容寫入主存中(例如在CPU讀Cache的同時;把緩衝器的內容寫入主存)。這種方式在一定程序上提高了速度,但由於緩衝器的容量有限,只能鎖存——次寫入的數據,如果發生連續的寫操作則CPU仍需要等待。上述的直寫式或緩衝直寫式不僅速度低,而且在很多時候向主存寫入是不必要的。例如CPU可能多次對同一個Cache單元更新內容,實際上只需把最後更新結果寫入主存即可,而不必更新一次Cache,就向主存寫入一次。根據這種思想提出了第三種方式,稱為「回寫式(Write—back)」。有的資料中也稱為「寫回」。這種方式的原理是CPU修改了Cache的內容後並不立即修改主存中相應的單元,而在被修改的Cache單元的內容將從Cache中淘汰時(如更換頁面)才把它寫入主存儲器的相應單元中。回寫式系統速度快,避免了不必要的冗餘寫操作,但結構上比較複雜。當前的微機普遍採回寫式系統。

2.多處理器或DMA直接訪問主存儲器後的處理

多處理器或DMA直接訪問主存儲器造成主存和cache中的數據不一致發生在以下情形:當主存中某單元內容調入Cache後,又由其它處理器或DMA更新了主存儲器該單元的內容。為了避免這種情況下的數據不一致,通常採用以下三種處理辦法。

一種辦法稱為「總線監視」,即由cache控制器隨時監視系統的地址總線,若有其它部件向主存中寫入了內容,則把Cache中相應單元的內容置為無效,CPU必須重新從主存中讀人該單元的內容。

第二種方式稱為「主存監視」、由Cache控制器監視所有主存儲器的讀寫操作所有對主存的訪問都必須通過Cache來完成。這樣,凡對主存的寫入也就對Cache中的相應單元進行拷貝從而保證了兩者數據的一致性。

第三種方式是設置「不可Cache區 (Non Cacheable Block)」,這種方式的基本思想是在主存中開闢一塊區域,該區域中數據不受cache控制器的管理,不能調入Cache,CPU只能直接讀寫該區域的內容。其它總線設備也只能把數據直接寫入該區域中。由於該區域不與Cache發生關係,也就不存在數據不一致的問題。不可Cache區方式是微機中最主要的方式,不少BIOS設置程序允許用戶設置不可Cache區的首地址和尺寸、以及可Cache區的地址範圍。

Cache在微機系統中獲得了廣泛應用。除了CPU中的cache外,硬碟、光碟甚至主存中部可找到它的蹤影。

1 CPU中的Cache

從486CPU開始,在CPU晶片內集成了Cache,稱為片內Cache。此時由於受到工藝上的限制,片內Cache的容量很小,只有8KB。片內Cache的最大優點是,CPU對它的訪問是在晶片內部進行的,不需要通過總線傳送數據因此速度很快;但是由於其容量很小,而處理器的時鐘頻率又很高,一旦出現片內cache末命中的情況,性能將明顯化。因此在處理器晶片之外的主板上再加Cache,稱為二級Cache(L2Cache),或稱為板載Cache。

在實際使用中,進入Cache的內容既可以是指令也可以是數據,而CPU對於這兩者的處理是不完全相同的。為了使系統效率達到最佳狀態,從Pentium處理器開始把片內Cache容量增加到16KB。其中指令CBche和數據Cache各佔8KB。

Intel公司在1995年末推出了Pentium Pro(P6),為了進一步改善系統性能,P6採用了雙穴封裝,即除了CPU外,還把256/5l2KB的二級Cache也封裝在同一個陶瓷片內。這樣,L2也能以處理器的時鐘高速運行,大大地提高了系統效率。

由於P6採用的方式成本很高,在InteI隨後推出的Pentium II中,把L2又從CPU陶瓷封裝中分立出來,和CPU共同安裝在一塊稱為SEC的卡盒內,而Pentium II處理器則採用了雙獨立總線結構,其中一條總線聯接L2高速緩存,另一條負責主存。由於Pentium II的L2隻能以CPU時鐘的一半工作。因此比Pentium Pro的L2慢一些。作為一種補償,Intel將Pentium II上的Ll高速緩存從16K加倍到32K,從而減少了對L2高速緩存的調用頻率。而在非Intel CPU中,L1的容量則更大,以期求得更好的系統性能。

為了匹配硬碟和主存在數據傳送速度上的矛盾,微機系統中毫無例外地採用了硬碟高速緩存,或稱為硬碟Cache。硬碟高速緩存分為兩種:硬體高速緩存和軟體高速緩存。軟體高速緩存是利用軟體工具(如Smart Drive)在系統主存中開闢的一塊區域作為數據傳送緩衝區,硬體高速緩存則是在磁碟控制器中安裝的一塊RAM,通過RAM緩衝區讀寫數據可以得到更高的訪問速度。早期硬碟中的cache很小,只有數十KB到數百KB,目前新型硬碟的高速緩存均達到2MB。在選購硬碟時除了注意容量、帶寬、轉速等參數外,還應該考慮Cache的容量,越大越好。當Cache容量大時,能夠保證較穩定的突發數據傳送;而如果Cache容量較小,在讀寫大型圖形或視頻文件時,由於連續傳送的數據量很大,緩衝區則不能表示出其優越性,使得數據傳送不再能處於突發傳送方式,而處於持續傳送方式,降低了數據帶寬。

3.光碟

以CD—ROM驅動器為例,其中配置的Cache通常為128KB或者256KB,高檔CD—ROM驅動器中的Cache容量可達512KB甚至更高。在CD ROM中配置Cache的目的仍然是作為光碟的高速緩存,以便減少讀盤的次數,這對於改善CD RoM的性能是很有好處的。
同樣,其它品種的光碟驅動器,如CD-R、CD—RW、M0、DVD—ROM等,也都配置了Cache。

4.主存儲器中的Cache

主存通常是採用DRAM(動態隨機存取存儲器)器件製作的,而Cache一般採用速度更高的SRAM(靜態隨機存取存儲器)製作。一種新型的增強DRAM)採用了在DRAM晶片上集成一個小容量SRAM的辦法,我們可以把這一小片SRAM稱為主存中的Cache。這個Cache在突髮式讀寫時非常有利,使DRAM晶片的性能得到了明顯的提高。

本文引用地址:http://www.eepw.com.cn/article/201706/348450.htm

相關焦點

  • AMD詳解Infinity Cache高速緩存技術
    AMD 現已發布 RX 6900XT、6800XT 和 6800 三款顯卡,都配備了 16GB GDDR6 大顯存,除此之外還有 128 MB 的 Infinity Cache 的高速緩存AMD 官網現已對 Infinity Cache 技術進行了介紹。
  • Spring Boot 2.x基礎教程:進程內緩存的使用與Cache註解詳解
    Cache配置註解詳解回過頭來我們再來看這裡使用到的兩個註解分別作了什麼事情:@CacheConfig:主要用於配置該類中會用到的一些共用的緩存配置。在這裡@CacheConfig(cacheNames = &34;):配置了該數據訪問對象中返回的內容將存儲於名為users的緩存對象中,我們也可以不使用該註解,直接通過@Cacheable自己配置緩存集的名字來定義。@Cacheable:配置了findByName函數的返回值將被加入緩存。同時在查詢時,會先從緩存中獲取,若不存在才再發起對資料庫的訪問。
  • Spring@Cacheable緩存機制
    spring配置文件專門為緩存提供了一個cache:命名空間,為了啟動spring緩存,需要在配置文件中導入cache:命名空間。在spring配置文件中添加<cache:annotation-driven cache-manager="緩存管理器ID">,該元素指定spring根據註解來啟用Bean級別或方法級別的緩存。
  • Caffeine Cache~高性能 Java 本地緩存之王
    使用註解來對 cache 增刪改查前面剛說到Guava Cache,他的優點是封裝了get,put操作;提供線程安全的緩存操作;提供過期策略;提供回收策略;緩存監控。當緩存的數據超過最大值時,使用LRU算法替換。這一篇我們將要談到一個新的本地緩存框架:Caffeine Cache。它也是站在巨人的肩膀上-Guava Cache,借著他的思想優化了算法發展而來。
  • python3 之 天天生鮮 項目 緩存cache
    settings# 緩存CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache",
  • 「性能提升」擴展Spring Cache 支持多級緩存
    , L2 Redis 緩存。Spring Cache 實現,基於註解(annotation)的緩存(cache)技術,存在的問題如下:Spring Cache 僅支持 單一的緩存來源,即:只能選擇 Redis 實現或者 Caffeine 實現,並不能同時使用。
  • 在了解Cache緩存原理之前,你只是個普通的程式設計師
    今天探究的主題是cache。我們圍繞幾個問題展開。為什麼需要cache?如何判斷一個數據在cache中是否命中?cache的種類有哪些,區別是什麼?對於沒有接觸過底層技術的朋友來說,或許從未聽說過cache。畢竟cache的存在對程式設計師來說是透明的。在接觸cache之前,先為你準備段code分析。
  • 多圖詳解CPU Cache Memory
    與inclusive cache對應的是exclusive cache,這種cache保證某一地址的數據緩存只會存在於多級cache其中一級。也就是說,任意地址的數據不可能同時在L1和L2 cache中緩存。直接映射緩存(Direct mapped cache)我們繼續引入一些cache相關的名詞。cache的大小稱之為cahe size,代表cache可以緩存最大數據的大小。
  • Linux 上如何清除 RAM 內存高速緩存,緩存和交換空間
    正如內核文檔中提到的,寫到drop_cache將清空緩存而不殺死任何應用程式/服務,echo命令做寫入文件的工作。如果你必須清除磁碟高速緩存,第一個命令在企業和生產環境中是最安全,「…echo 1> …」只會清除頁緩存。不建議使用上面第三個選項在生產環境中「…echo 3 >」 ,除非你明確自己在做什麼,因為它會清除緩存頁,目錄項和inodes。
  • 已關注「性能提升」擴展Spring Cache 支持多級緩存
    ,性能比如常見的內存緩存實現性能高出不少詳細對比[2]。緩存。設計難點目前大部分應用緩存都是基於 Spring Cache 實現,基於註解(annotation)的緩存(cache)技術,存在的問題如下:Spring Cache 僅支持 單一的緩存來源,即:只能選擇 Redis 實現或者 Caffeine
  • 「譯」在BigCache緩存中存儲空接口
    ,我被安排給我們的一個Golang服務加緩存。我們需要像其他Golang緩存實現的定義,Set(key, entry interface{})。這樣我們就可以存儲我們想存的任何類型了。這個問題最明顯的解決方案是序列化。如果我們能把一個實體結構體序列化成一個字節切片,那麼我們就可以存儲任何東西了。如果我們想使用我們存儲的結構體元素,我們可以從緩存中獲取字節切片,然後反序列化。
  • 基於Asp.net Core3.1實現Redis及MemoryCache緩存助手CacheHelper
    這幾天在面試,這個關於Redis緩存的博客一直沒空寫,今天總算有點時間了。從很久很久之前,我就一直想學Redis了,反正看到各大招聘網上都要求Redis,不學就太落後了。先定義一個接口ICacheHelper,這是用來注入的接口,我暫時只定義了string類型跟hash類型的緩存方法<pre style=&34;Courier New&34;>public interface ICacheHelper{ bool Exists(string key); void
  • 3分鐘短文:說說Laravel通用緩存Cache的使用技巧
    所以,你看到Session Cache Cookie 這些緩存數據類,基本上除了底層的驅動, 數據結構,過期特性等等,都集成了系統數組類Arr的操作方法。所以上述三種緩存在 操作方法上有很多相同之處。cache緩存的配置文件在 config/cache.php內,支持的驅動默認是 file, 也就是文本文件存儲。
  • 也許我們誤解了SLC cache...
    SLC cache誕生之初是為讓原本速度比MLC更弱的TLC顆粒也能體會到固態硬碟真正速度感。然而在SLC cache寫滿,脫去虛假的外殼之後卻被詬病這騙人的速度。今天就來聊一下SLC cache的一二事。☢☢☢由於兩者都叫做緩存,經常會出現搞混的情況。
  • 還在用Guava Cache?它才是Java本地緩存之王
    首先來看前者,TinyLFU藉助了數據流Sketching技術,Count-Min Sketch顯然是解決這個問題的有效手段,它可以用小得多的空間存放頻率信息,而保證很低的False Positive Rate。
  • Django開發中使用Cache緩存提升10倍效率
    cache.set(key, value, timeout=DEFAULT_TIMEOUT, version=None) 其中是一個字符串,是一個認可picklable形式的python對象,和參數都是可選的,默認為配置中相應後端的參數,為對應的版本,參考上邊關於的解釋 cache.get
  • 3分鐘短文:說說Laravel通用緩存Cache的使用技巧
    cache緩存的配置文件在 config/cache.php 內,支持的驅動默認是 file, 也就是文本文件存儲。) {    return $cache->get(&39;);});laravel也為我們提供了極為便捷的助手函數 cache() 直接操作緩存。
  • 前端——緩存頭 Cache-Control 的含義和使用特性
    (也就是說 http 請求經過的地方都可以進行緩存)。private:http 請求返回的過程中設置 Cache-Control 為 private,代表發起請求的瀏覽器可以進行緩存。no-cache:http 請求返回的過程中設置 Cache-Control 為 no-cache,任何節點都不進行緩存(本地可以進行緩存,但是緩存需要伺服器端驗證之後才可以使用)。
  • 《CSAPP》- Cache Lab (上)
    這一章主要介紹了各種常見的存儲器,並圍繞著這局部性這個基本屬性介紹了計算機的存儲器系統的構成,最後詳細講解了高速緩存存儲器的組織結構。Cache Lab 分為兩部分,第一部分就是讓大家寫一個高速緩存的模擬器,實現硬體中讀寫數據功能,並統計命中數等統計信息,從而讓掌握這部分原理;第二部分就是針對三種矩陣寫出能充分利用緩存的轉置函數,使得不命中數最少,主要在於使用分塊技術減少緩存多次加載。
  • Mybatis緩存詳解
    按照這個概念,通過源碼了解mybatis的Mapper中的緩存是一級緩存,SqlSession的中緩存是二級緩存。看到一些介紹mybatis緩存的相關文章命名反過來的,稱SqlSession中的緩存稱為一級緩存,對此有疑惑……簡單看一下mybatis緩存相關源碼Mapper中的緩存(一級)mapper中的緩存,默認配置是開啟,但需要在映射文件mapper.xml中添加<cache/>標籤配置false可以關閉mapper中的緩存mapper