一、動畫演示。
1、https://www.scss.tcd.ie/Jeremy.Jones/vivio/caches/MESIHelp.htm
2、https://www.jianshu.com/p/81770751c11c
#####################################################
二、緩存概念。
緩存就是數據交換的緩沖區(稱作Cache),當某一硬件要讀取數據時,會首先從緩存中查找需要的數據,如果找到了則直接執行,找不到的話則從內存中找。由於緩存的運行速度比內存快得多,故緩存的作用就是幫助硬件更快地運行。因為緩存往往使用的是RAM(斷電即掉的非永久儲存),所以在用完后還是會把文件送到硬盤等存儲器里永久存儲。電腦里最大的緩存就是內存條了,最快的是CPU上鑲的L1和L2緩存,顯卡的顯存是給顯卡運算芯片用的緩存,硬盤上也有16M或者32M的緩存。
1、特點。
緩存是指可以進行高速數據交換的存儲器,它先於內存與CPU交換數據,因此速率很快。L1 Cache(一級緩存)是CPU第一層高速緩存。內置的L1高速緩存的容量和結構對CPU的性能影響較大,不過高速緩沖存儲器均由靜態RAM組成,結構較復雜,在CPU管芯面積不能太大的情況下,L1級高速緩存的容量不可能做得太大。一般L1緩存的容量通常在32—256KB。L2 Cache(二級緩存)是CPU的第二層高速緩存,分內部和外部兩種芯片。內部的芯片二級緩存運行速率與主頻相同,而外部的二級緩存則只有主頻的一半。L2高速緩存容量也會影響CPU的性能,原則是越大越好,普通台式機CPU的L2緩存一般為128KB到2MB或者更高,筆記本、服務器和工作站上用CPU的L2高速緩存最高可達1MB-3MB。
緩存只是內存中少部分數據的復制品,所以CPU到緩存中尋找數據時,也會出現找不到的情況(因為這些數據沒有從內存復制到緩存中去),這時CPU還是會到內存中去找數據,這樣系統的速率就慢下來了,不過CPU會把這些數據復制到緩存中去,以便下一次不要再到內存中去取。隨着時間的變化,被訪問得最頻繁的數據不是一成不變的,也就是說,剛才還不頻繁的數據,此時已經需要被頻繁的訪問,剛才還是最頻繁的數據,又不頻繁了,所以說緩存中的數據要經常按照一定的算法來更換,這樣才能保證緩存中的數據是被訪問最頻繁的。
2、工作原理。
緩存的工作原理是當CPU要讀取一個數據時,首先從CPU緩存中查找,找到就立即讀取並送給CPU處理;沒有找到,就從速率相對較慢的內存中讀取並送給CPU處理,同時把這個數據所在的數據塊調入緩存中,可以使得以后對整塊數據的讀取都從緩存中進行,不必再調用內存。正是這樣的讀取機制使CPU讀取緩存的命中率非常高(大多數CPU可達90%左右),也就是說CPU下一次要讀取的數據90%都在CPU緩存中,只有大約10%需要從內存讀取。這大大節省了CPU直接讀取內存的時間,也使CPU讀取數據時基本無需等待。總的來說,CPU讀取數據的順序是先緩存后內存。
RAM(Random-Access Memory)和ROM(Read-Only Memory)相對的,RAM是掉電以后,其中的信息就消失那一種,ROM在掉電以后信息也不會消失那一種。RAM又分兩種,一種是靜態RAM,SRAM(Static RAM);一種是動態RAM,DRAM(Dynamic RAM)。前者的存儲速率要比后者快得多,使用的內存一般都是動態RAM。為了增加系統的速率,把緩存擴大就行了,擴的越大,緩存的數據越多,系統就越快了,緩存通常都是靜態RAM,速率是非常的快, 但是靜態RAM集成度低(存儲相同的數據,靜態RAM的體積是動態RAM的6倍), 價格高(同容量的靜態RAM是動態RAM的四倍), 由此可見,擴大靜態RAM作為緩存是一個非常愚蠢的行為, 但是為了提高系統的性能和速率,必須要擴大緩存, 這樣就有了一個折中的方法,不擴大原來的靜態RAM緩存,而是增加一些高速動態RAM做為緩存, 這些高速動態RAM速率要比常規動態RAM快,但比原來的靜態RAM緩存慢, 把原來的靜態RAM緩存叫一級緩存,而把后來增加的動態RAM叫二級緩存。
CPU緩存(Cache Memory)是位於CPU與內存之間的臨時存儲器,它的容量比內存小的多但是交換速率卻比內存要快得多。緩存的出現主要是為了解決CPU運算速率與內存讀寫速率不匹配的矛盾,因為CPU運算速率要比內存讀寫速率快很多,這樣會使CPU花費很長時間等待數據到來或把數據寫入內存。在緩存中的數據是內存中的一小部分,但這一小部分是短時間內CPU即將訪問的,當CPU調用大量數據時,就可避開內存直接從緩存中調用,從而加快讀取速率。由此可見,在CPU中加入緩存是一種高效的解決方案,這樣整個內存儲器(緩存+內存)就變成了既有緩存的高速率,又有內存的大容量的存儲系統了。緩存對CPU的性能影響很大,主要是因為CPU的數據交換順序和CPU與緩存間的帶寬引起的。
緩存基本上都是采用SRAM存儲器,SRAM是英文Static RAM的縮寫,它是一種具有靜態存取功能的存儲器,不需要刷新電路即能保存它內部存儲的數據。不像DRAM內存那樣需要刷新電路,每隔一段時間,固定要對DRAM刷新充電一次,否則內部的數據即會消失,因此SRAM具有較高的性能,但是SRAM也有它的缺點,即它的集成度較低,相同容量的DRAM內存可以設計為較小的體積,但是SRAM卻需要很大的體積,這也是不能將緩存容量做得太大的重要原因。它的特點歸納如下:優點是節能、速率快、不必配合內存刷新電路、可提高整體的工作效率,缺點是集成度低、相同的容量體積較大、而且價格較高,只能少量用於關鍵性系統以提高效率。
3、讀取順序。
CPU要讀取一個數據時,首先從Cache中查找,如果找到就立即讀取並送給CPU處理;如果沒有找到,就用相對慢的速度從內存中讀取並送給CPU處理,同時把這個數據所在的數據塊調入Cache中,可以使得以后對整塊數據的讀取都從Cache中進行,不必再調用內存。
正是這樣的讀取機制使CPU讀取Cache的命中率非常高(大多數CPU可達90%左右),也就是說CPU下一次要讀取的數據90%都在Cache中,只有大約10%需要從內存讀取。這大大節省了CPU直接讀取內存的時間,也使CPU讀取數據時基本無需等待。總的來說,CPU讀取數據的順序是先Cache后內存。
4、緩存分類。
Intel從Pentium開始將Cache分開,通常分為一級高速緩存L1和二級高速緩存L2。在以往的觀念中,L1 Cache是集成在CPU中的,被稱為片內Cache。在L1中還分數據Cache(D-Cache)和指令Cache(I-Cache)。它們分別用來存放數據和執行這些數據的指令,而且兩個Cache可以同時被CPU訪問,減少了爭用Cache所造成的沖突,提高了處理器效能。
5、讀取命中率。
CPU在Cache中找到有用的數據被稱為命中,當Cache中沒有CPU所需的數據時(這時稱為未命中),CPU才訪問內存。從理論上講,在一顆擁有2級Cache的CPU中,讀取L1 Cache的命中率為80%。也就是說CPU從L1 Cache中找到的有用數據占數據總量的80%,剩下的20%從L2 Cache讀取。由於不能准確預測將要執行的數據,讀取L2的命中率也在80%左右(從L2讀到有用的數據占總數據的16%)。那么還有的數據就不得不從內存調用,但這已經是一個相當小的比例了。在一些高端領域的CPU(像Intel的Itanium)中,我們常聽到L3 Cache,它是為讀取L2 Cache后未命中的數據設計的—種Cache,在擁有L3 Cache的CPU中,只有約5%的數據需要從內存中調用,這進一步提高了CPU的效率。
6、 說明。
CPU要讀取一個數據時,首先從Cache中查找,如果找到就立即讀取並送給CPU處理;如果沒有找到,就用相對慢的速度從內存中讀取並送給CPU處理,同時把這個數據所在的數據塊調入Cache中,可以使得以后對整塊數據的讀取都從Cache中進行,不必再調用內存。正是這樣的讀取機制使CPU讀取Cache的命中率非常高(大多數CPU可達90%左右),也就是說CPU下一次要讀取的數據90%都在Cache中,只有大約10%需要從內存讀取。這大大節省了CPU直接讀取內存的時間,也使CPU讀取數據時基本無需等待。總的來說,CPU讀取數據的順序是先Cache后內存。 前面是把Cache作為一個整體來考慮的,下面分類分析。Intel從Pentium開始將Cache分開,通常分為一級高速緩存L1和二級高速緩存L2。在以往的觀念中,L1 Cache是集成在CPU中的,被稱為片內Cache。在L1中還分數據Cache(D-Cache)和指令Cache(I-Cache)。它們分別用來存放數據和執行這些數據的指令,而且兩個Cache可以同時被CPU訪問,減少了爭用Cache所造成的沖突,提高了處理器效能。在P4處理器中使用了一種先進的一級指令Cache——動態跟蹤緩存。它直接和執行單元及動態跟蹤引擎相連,通過動態跟蹤引擎可以很快地找到所執行的指令,並且將指令的順序存儲在追蹤緩存里,這樣就減少了主執行循環的解碼周期,提高了處理器的運算效率。
以前的L2 Cache沒集成在CPU中,而在主板上或與CPU集成在同一塊電路板上,因此也被稱為片外Cache。但從PⅢ開始,由於工藝的提高L2 Cache被集成在CPU內核中,以相同於主頻的速度工作,結束了L2 Cache與CPU大差距分頻的歷史,使L2 Cache與L1 Cache在性能上平等,得到更高的傳輸速度。L2Cache只存儲數據,因此不分數據Cache和指令Cache。在CPU核心不變化的情況下,增加L2 Cache的容量能使性能提升,同一核心的CPU高低端之分往往也是在L2 Cache上做手腳,可見L2 Cache的重要性。CPU的L1 Cache與L2 Cache惟一區別在於讀取順序。 CPU在Cache中找到有用的數據被稱為命中,當Cache中沒有CPU所需的數據時(這時稱為未命中),CPU才訪問內存。從理論上講,在一顆擁有2級Cache的CPU中,讀取L1 Cache的命中率為80%。也就是說CPU從L1 Cache中找到的有用數據占數據總量的80%,剩下的20%從L2 Cache讀取。在一些高端領域的CPU(像Intel的Itanium)中,我們常聽到L3 Cache,它是為讀取L2 Cache后未命中的數據設計的—種Cache。
為了保證CPU訪問時有較高的命中率Cache中的內容應該按一定的算法替換,其計數器清零過程可以把一些頻繁調用后再不需要的數據淘汰出Cache,提高Cache的利用率。緩存技術的發展
總之,在傳輸速度有較大差異的設備間都可以利用Cache作為匹配來調節差距,或者說是這些設備的傳輸通道。在顯示系統、硬盤和光驅,以及網絡通訊中,都需要使用Cache技術。但Cache均由靜態RAM組成,結構復雜,成本不菲,使用現有工藝在有限的面積內不可能做得很大,不過,這也正是技術前進的源動力,有需要才有進步! 隨着CPU制造工藝的發展,二級緩存也能輕易的集成在CPU內核中,容量也在逐年提升。用集成在CPU內部與否來定義一、二級緩存,已不確切。而且隨着二級緩存被集成入CPU內核中,以往二級緩存與CPU大差距分頻的情況也被改變,此時其以相同於主頻的速度工作,可以為CPU提供更高的傳輸速度。同一核心的CPU高低端之分往往也是在二級緩存上有差異,由此可見二級緩存對於CPU的重要性。
CPU產品中,一級緩存的容量基本在4KB到64KB之間,二級緩存的容量則分為128KB、256KB、512KB、1MB、2MB等。一級緩存容量各產品之間相差不大,而二級緩存容量則是提高CPU性能的關鍵。二級緩存容量的提升是由CPU制造工藝所決定的,容量增大必然導致CPU內部晶體管數的增加,要在有限的CPU面積上集成更大的緩存,對制造工藝的要求也就越高。
雙核心CPU的二級緩存比較特殊,和以前的單核心CPU相比,最重要的就是兩個內核的緩存所保存的數據要保持一致,否則就會出現錯誤,為了解決這個問題不同的CPU使用了不同的辦法。
#######################################################
三、緩存講解。
cpu cache已經發展到了三級緩存結構,基本上現在買的個人電腦都是L3結構。
1、cache的意義。
為什么需要CPU cache?因為CPU的頻率太快了,快到主存跟不上,這樣在處理器時鍾周期內,CPU常常需要等待主存,浪費資源。所以cache的出現,是為了緩解CPU和內存之間速度的不匹配問題(結構:cpu -> cache -> memory)。
CPU cache有什么意義?cache的容量遠遠小於主存,因此出現cache miss在所難免,既然cache不能包含CPU所需要的所有數據,那么cache的存在真的有意義嗎?當然是有意義的——局部性原理。
A. 時間局部性:如果某個數據被訪問,那么在不久的將來它很可能被再次訪問;
B. 空間局部性:如果某個數據被訪問,那么與它相鄰的數據很快也可能被訪問;
2、cache和寄存器。
存儲器的三個性能指標——速度、容量和每位價格——導致了計算機組成中存儲器的多級層次結構,其中主要是緩存和主存、主存和磁盤的結構。那么在主存之上,cache和寄存器之間的關系是?
舉個例子,當你在思考一個問題的時候,寄存器存放的是你當前正在思考的內容,cache存放的是與該問題相關的記憶,主存則存放無論與該問題是否有關的所有記憶,所以,寄存器存放的是當前CPU執行的數據,而cache則緩存與該數據相關的部分數據,因此只要保證了cache的一致性,那么寄存器拿到的數據也必然具備一致性。
3、CPU cache結構
(1)單核CPU cache結構。
在單核CPU結構中,為了緩解CPU指令流水中cycle沖突,L1分成了指令(L1P)和數據(L1D)兩部分,而L2則是指令和數據共存。
(2) 多核CPU cache結構
多核CPU的結構與單核相似,但是多了所有CPU共享的L3三級緩存。在多核CPU的結構中,L1和L2是CPU私有的,L3則是所有CPU核心共享的。
4、MESI(緩存一致性)
緩存一致性:在多核CPU中,內存中的數據會在多個核心中存在數據副本,某一個核心發生修改操作,就產生了數據不一致的問題。而一致性協議正是用於保證多個CPU cache之間緩存共享數據的一致。
至於MESI,則是緩存一致性協議中的一個,到底怎么實現,還是得看具體的處理器指令集。
(1) cache的寫方式
cache的寫操作方式可以追溯到大學教程《計算機組成原理》一書。
A. write through(寫通):每次CPU修改了cache中的內容,立即更新到內存,也就意味着每次CPU寫共享數據,都會導致總線事務,因此這種方式常常會引起總線事務的競爭,高一致性,但是效率非常低;
B. write back(寫回):每次CPU修改了cache中的數據,不會立即更新到內存,而是等到cache line在某一個必須或合適的時機才會更新到內存中;
無論是寫通還是寫回,在多線程環境下都需要處理緩存cache一致性問題。為了保證緩存一致性,處理器又提供了寫失效(write invalidate)和寫更新(write update)兩個操作來保證cache一致性。
寫失效:當一個CPU修改了數據,如果其他CPU有該數據,則通知其為無效;
寫更新:當一個CPU修改了數據,如果其他CPU有該數據,則通知其跟新數據;
寫更新會導致大量的更新操作,因此在MESI協議中,采取的是寫失效(即MESI中的I:ivalid,如果采用的是寫更新,那么就不是MESI協議了,而是MESU協議)。
(2) cache line
cache line是cache與內存數據交換的最小單位,根據操作系統一般是32byte或64byte。在MESI協議中,狀態可以是M、E、S、I,地址則是cache line中映射的內存地址,數據則是從內存中讀取的數據。
工作方式:當CPU從cache中讀取數據的時候,會比較地址是否相同,如果相同則檢查cache line的狀態,再決定該數據是否有效,無效則從主存中獲取數據,或者根據一致性協議發生一次cache-to--chache的數據推送(參見MESI協議,文章最后的鏈接);
工作效率:當CPU能夠從cache中拿到有效數據的時候,消耗幾個CPU cycle,如果發生cache miss,則會消耗幾十上百個CPU cycle;
cache的工作原理以及在主板上的結構如下兩圖所示:
5、狀態介紹
MESI協議將cache line的狀態分成modify、exclusive、shared、invalid,分別是修改、獨占、共享和失效。
modify:當前CPU cache擁有最新數據(最新的cache line),其他CPU擁有失效數據(cache line的狀態是invalid),雖然當前CPU中的數據和主存是不一致的,但是以當前CPU的數據為准;
exclusive:只有當前CPU中有數據,其他CPU中沒有改數據,當前CPU的數據和主存中的數據是一致的;
shared:當前CPU和其他CPU中都有共同數據,並且和主存中的數據一致;
invalid:當前CPU中的數據失效,數據應該從主存中獲取,其他CPU中可能有數據也可能無數據,當前CPU中的數據和主存被認為是不一致的;
對於invalid而言,在MESI協議中采取的是寫失效(write invalidate)。
6、cache操作。
MESI協議中,每個cache的控制器不僅知道自己的操作(local read和local write),每個核心的緩存控制器通過監聽也知道其他CPU中cache的操作(remote read和remote write),今兒再確定自己cache中共享數據的狀態是否需要調整。
local read(LR):讀本地cache中的數據;
local write(LW):將數據寫到本地cache;
remote read(RR):其他核心發生read;
remote write(RW):其他核心發生write;
7、狀態轉換和cache操作。
如上文內容所述,MESI協議中cache line數據狀態有4種,引起數據狀態轉換的CPU cache操作也有4種,因此要理解MESI協議,就要將這16種狀態轉換的情況討論清楚。
初始場景:在最初的時候,所有CPU中都沒有數據,某一個CPU發生讀操作,此時必然發生cache miss,數據從主存中讀取到當前CPU的cache,狀態為E(獨占,只有當前CPU有數據,且和主存一致),此時如果有其他CPU也讀取數據,則狀態修改為S(共享,多個CPU之間擁有相同數據,並且和主存保持一致),如果其中某一個CPU發生數據修改,那么該CPU中數據狀態修改為M(擁有最新數據,和主存不一致,但是以當前CPU中的為准),其他擁有該數據的核心通過緩存控制器監聽到remote write行文,然后將自己擁有的數據的cache line狀態修改為I(失效,和主存中的數據被認為不一致,數據不可用應該重新獲取)。
(1)modify
場景:當前CPU中數據的狀態是modify,表示當前CPU中擁有最新數據,雖然主存中的數據和當前CPU中的數據不一致,但是以當前CPU中的數據為准;
LR:此時如果發生local read,即當前CPU讀數據,直接從cache中獲取數據,擁有最新數據,因此狀態不變;
LW:直接修改本地cache數據,修改后也是當前CPU擁有最新數據,因此狀態不變;
RR:因為本地內存中有最新數據,當本地cache控制器監聽到總線上有RR發生的時,必然是其他CPU發生了讀主存的操作,此時為了保證一致性,當前CPU應該將數據寫回主存,而隨后的RR將會使得其他CPU和當前CPU擁有共同的數據,因此狀態修改為S;
RW:同RR,當cache控制器監聽到總線發生RW,當前CPU會將數據寫回主存,因為隨后的RW將會導致主存的數據修改,因此狀態修改成I;
(2)exclusive
場景:當前CPU中的數據狀態是exclusive,表示當前CPU獨占數據(其他CPU沒有數據),並且和主存的數據一致;
LR:從本地cache中直接獲取數據,狀態不變;
LW:修改本地cache中的數據,狀態修改成M(因為其他CPU中並沒有該數據,因此不存在共享問題,不需要通知其他CPU修改cache line的狀態為I);
RR:本地cache中有最新數據,當cache控制器監聽到總線上發生RR的時候,必然是其他CPU發生了讀取主存的操作,而RR操作不會導致數據修改,因此兩個CPU中的數據和主存中的數據一致,此時cache line狀態修改為S;
RW:同RR,當cache控制器監聽到總線發生RW,發生其他CPU將最新數據寫回到主存,此時為了保證緩存一致性,當前CPU的數據狀態修改為I;
(3)shared
場景:當前CPU中的數據狀態是shared,表示當前CPU和其他CPU共享數據,且數據在多個CPU之間一致、多個CPU之間的數據和主存一致;
LR:直接從cache中讀取數據,狀態不變;
LW:發生本地寫,並不會將數據立即寫回主存,而是在稍后的一個時間再寫回主存,因此為了保證緩存一致性,當前CPU的cache line狀態修改為M,並通知其他擁有該數據的CPU該數據失效,其他CPU將cache line狀態修改為I;
RR:狀態不變,因為多個CPU中的數據和主存一致;
RW:當監聽到總線發生了RW,意味着其他CPU發生了寫主存操作,此時本地cache中的數據既不是最新數據,和主存也不再一致,因此當前CPU的cache line狀態修改為I;
(4)invalid
場景:當前CPU中的數據狀態是invalid,表示當前CPU中是臟數據,不可用,其他CPU可能有數據、也可能沒有數據;
LR:因為當前CPU的cache line數據不可用,因此會發生讀內存,此時的情形如下。
A. 如果其他CPU中無數據則狀態修改為E;
B. 如果其他CPU中有數據且狀態為S或E則狀態修改為S;
C. 如果其他CPU中有數據且狀態為M,那么其他CPU首先發生RW將M狀態的數據寫回主存並修改狀態為S,隨后當前CPU讀取主存數據,也將狀態修改為S;
LW:因為當前CPU的cache line數據無效,因此發生LW會直接操作本地cache,此時的情形如下。
A. 如果其他CPU中無數據,則將本地cache line的狀態修改為M;
B. 如果其他CPU中有數據且狀態為S或E,則修改本地cache,通知其他CPU將數據修改為I,當前CPU中的cache line狀態修改為M;
C. 如果其他CPU中有數據且狀態為M,則其他CPU首先將數據寫回主存,並將狀態修改為I,當前CPU中的cache line轉台修改為M;
RR:監聽到總線發生RR操作,表示有其他CPU讀取內存,和本地cache無關,狀態不變;
RW:監聽到總線發生RW操作,表示有其他CPU寫主存,和本地cache無關,狀態不變;
6、 總結。
MESI協議為了保證多個CPU cache中共享數據的一致性,定義了cache line的四種狀態,而CPU對cache的4種操作可能會產生不一致狀態,因此cache控制器監聽到本地操作和遠程操作的時候,需要對地址一致的cache line狀態做出一定的修改,從而保證數據在多個cache之間流轉的一致性。
##############################################################################
四、緩存詳解。
1、 存儲層次結構。
由於兩個不謀而合的因素如下:
l 硬件:由於不同存儲技術的訪問時間相差很大。速度較快的技術每個字節的成本要比速度較慢的技術高,而且容量小。CPU和主存之間的速度差距在增大
l 軟件:一個編寫良好的程序傾向於展示出良好的局部性。
聰明的人類想出了一種組織存儲器系統的方法,叫做 存儲器層次結構。
千言萬語不如一張圖:摘自《深入理解計算機系統第二版》
圖1
2、CACHE 緩存什么
CACHE緩存什么么?
不同的緩存都緩存着自己以為重要的東西,來看張圖2
寄存器里面是寄存器有32位和64位(也就是4字節和8字節的)
其中TLB 叫做:翻譯后背緩沖器。
MMU:存儲管理單元(MemoryManagement Unit)
3、通用高速緩存存儲器結構。
下圖3,講的非常明白
有效位指明這個行是否包含有意義的信息,還有t=m-(b+s), m=t+b+s.
標記位唯一地標識存儲在這個高速緩存行中的塊。
高速緩存大小,C=SXEXB
我想以上大家都能容易理解的。
4、具體工作機制
如上圖三所示,參數S和B將m個地址分為了三個字段。
n 其中s個組索引位是一個S個數組的索引。從第0組,第1組,。。到最后一組。組索引位告訴我們這個字必須放在哪個組中。OK。
n 標記位,則告訴我們在這個組的哪一行包含這個字(如果有,需要看有效位是否有效)
n 塊偏移位給出了在B個字節的數據塊中的字偏移。
我們可以知道對於m位的 內存地址,每個尋址對能對應於CACHE上的一個字節。
這里放入圖4,關於高速緩存參數的小結,這些參數都非常容易理解。
(1)直接映射高速緩存
根據E(每個組的高速緩存行數)高速緩存被分為不同的類。每個組只有一行的高速緩存稱為直接高速緩存(direct-mapped cache)高速緩存確定一個請求是否命中,然后抽取出請求的字的過程,分為三步:
組選擇,行匹配,字抽取。
如下圖5所示
這個例子非常好。如下圖6-9
A、直接映射問題。
直接映射高速緩存中通常會發生沖突不命中。即使程序有良好的空間局部性,而且我們的高速緩存中也有足夠的空間來存放數據,但是每次引用還是會導致沖突不命中,這是因為這些塊被映射到了同一個高速緩存組。這種抖動導致速度下降2或3倍並不稀奇。這對於更大、更現實的直接映射高速緩存來說,問題很真實。
B、 組相聯高速緩存。
直接映射高速緩存中沖突不命中造成的問題源於每個組只有一行這個限制。組相聯高速緩存(set associative cache)放松了這條限制,每個組都保存有多於一個的高速緩存行。E>1 但是 E< E/B叫做E路組相聯高速緩存。當E=C/B的時候,就是全相聯高速緩存了。 組相聯高速緩存中的行匹配比直接映射高速緩存中的更復雜,因為必須檢查更多個行的標記位和有效位,以確定所請求的字是是否在集合中。
看如下圖10
這里需要注意的是,組中任何一行 都可以包含任何映射到這個組的存儲器塊。 所以高速緩存必須搜索組中的每一行,尋找一個有效的行,其標記與地址中的標記相匹配。
C、有關命中。
如果CPU請求的字不再組的任何一行中,那么就是緩存不命中,高速緩存必須從存儲器中去取包含這個字的塊。如下圖11
D、全相聯高速緩存。
全相聯高速緩存(fullyassociative cache)是由一個包含所有高速緩存行的組(即E=C/B)
如下圖12
由於全相聯,只有一個組,地址只被分為了一個標記和一個塊偏移。如下
圖13
全相聯高速緩存中的行匹配和字選擇與組相聯高速緩存中的是一樣的。區別主要是規模大小的問題。因為高速緩存電路必須並行的搜索許多相匹配的標記,構造一個又大又快的相聯高速緩存很困難,而且很昂貴。所以,全相聯高速緩存只適合走小的高速緩存,例如TLB,緩存頁表項。
E、有關寫。
關於讀的操作非常簡單。寫的情況就復雜一些了。
如果更新了一個字節的拷貝之后,怎么更新低一層中的拷貝呢?最簡單的方法是直寫(write-through),就是將w的高速緩存塊寫回到緊接着的低一層中。雖然簡單,但是直寫的缺點是每次寫都會引起總線流量。另一種是寫回(write-back),盡可能的推遲存儲器更新,只有當替換算法要驅逐更新過的塊時,才把它寫到緊接着的第一層中。寫回能顯著地減少總線流量,但是它的缺點是增加了復雜性。高速緩存必須為每個高速緩存行維護一個額外的修改位,表明這個高速緩存塊是否被修改過。
另外一個問題是,如果處理寫不命中。一種方法稱為寫分配(write-allocate),加載相應的低一層的塊到高速緩存中,然后更新這個高速緩存塊。寫分配視圖利用寫的空間局部性,但是缺點是每次不命中都會導致一個塊從低一層傳送到高速緩存。另一種方法,稱為非寫分配(not-write-allocate),避開高速緩存,直接把這個字寫到低一層中。直寫高速緩存通常是非寫分配的。寫回高速緩存通常是寫分配的。
F、實際高速緩存剖析。
現代處理的高速緩存即保存指令的高速緩存,又保存數據的高速緩存。稱為統一的高速緩存。其中指令高速緩存是制度的,比較簡單。
圖14i7的
I7高速緩存層次結構的特性如下圖15
5、 對性能影響。
優化高速緩存的成本和性能的折中是一項很精細的工作,需要在現實的基准程序代碼上進行大量的模擬。 相聯度的優點是降低了高速緩存由於沖突不命中出現抖動的可能性。較高的相聯度造成較高的成本,而且很難使速度變快。每一行需要更多的標記位,每一行需要額外的LRU狀態為和額外的控制邏輯。也會增加命中時間。相聯度的選擇最終編程了命中時間和不命中出發之間的折中。