內容來源:https://zhuanlan.zhihu.com/p/435031232
內容來源:https://zhuanlan.zhihu.com/p/102293437
本文主要內容如下,基本涉及了Cache的概念,工作原理,以及保持一致性的入門內容。
一、CPU緩存是什么?
總結起來,Cache是為了給CPU提供高速存儲訪問,利用數據局部性而設計的小存儲單元。
CPU緩存(Cache Memory)也就高速緩沖存儲器是位於CPU與內存之間的臨時存儲器,它的容量比內存小的多但是交換速度卻比內存要快得多。CPU高速緩存的出現主要是為了解決CPU運算速度與內存讀寫速度不匹配的矛盾,因為CPU運算速度要比內存讀寫速度快很多,這樣會使CPU花費很長時間等待數據到來或把數據寫入內存。在緩存中的數據是內存中的一小部分,但這一小部分是短時間內CPU即將訪問的,當CPU調用大量數據時,就可先緩存中調用,從而加快讀取速度。
當CPU需要讀取數據並進行計算時,首先需要將CPU緩存中查到所需的數據,並在最短的時間下交付給CPU。如果沒有查到所需的數據,CPU就會提出“要求”經過緩存從內存中讀取,再原路返回至CPU進行計算。而同時,把這個數據所在的數據也調入緩存,可以使得以后對整塊數據的讀取都從緩存中進行,不必再調用內存。
緩存大小是CPU的重要指標之一,而且緩存的結構和大小對CPU速度的影響非常大,CPU內緩存的運行頻率極高,一般是和處理器同頻運作,工作效率遠遠大於系統內存和硬盤。實際工作時,CPU往往需要重復讀取同樣的數據塊,而緩存容量的增大,可以大幅度提升CPU內部讀取數據的命中率,而不用再到內存或者硬盤上尋找,以此提高系統性能。但是從CPU芯片面積和成本的因素來考慮,緩存都很小。
二 為什么需要 Cache
1、cpu速度快於內存讀寫速度100多倍。為了避免內存成為 CPU 速度的瓶頸,
我們首先從一張圖來開始講為什么需要 Cache.
根據摩爾定律,CPU 的訪問速度每 18 個月就會翻倍,相當於每年增長 60% 左右,內存的速度當然也會不斷增長,但是增長的速度遠小於 CPU,平均每年只增長 7% 左右。於是,CPU 與內存的訪問性能的差距不斷拉大。
上圖是 CPU 性能和 Memory 存儲器訪問性能的發展。
我們可以看到,隨着工藝和設計的演進,CPU 計算性能其實發生了翻天覆地的變化,但是DRAM存儲性能的發展沒有那么快。
所以造成了一個問題,存儲限制了計算的發展。
容量與速度不可兼得。
2、程序處理的數據有局部性
如何解決這個問題呢?可以從計算訪問數據的規律入手。
我們隨便貼段代碼:
for (j = 0; j < 100; j = j + 1)
for( i = 0; i < 5000; i = i + 1)
x[i][j] = 2 * x[i][j];
可以看到,由於大量循環的存在,我們訪問的數據其實在內存中的位置是相近的。
主要是利用到大部分的程序,在處理數據時,都有一定程度的區域性。
換句專業點的話說,我們訪問的數據有局部性。
大部分的程序,在處理數據時,都有一定程度的區域性。所以,我們可以用一小塊快速的內存,來暫存目前需要的數據。
3、cpu多核和多線程技術的發展。數據的狀態需要在多個CPU進行同步
4、因為成為問題所以緩存比較小,1mb內存成本是0.01美元。1mb緩存成本是7美元
三、CPU一級緩存、二級緩存、三級緩存是什么意思?
大家都知道現在CPU的多核技術,都會有幾級緩存,現在的CPU會有三級內存(L1,L2, L3),如下圖所示:
CPU一級緩存、二級緩存、三級緩存是什么意思?
一級緩存(L1 Cache)
CPU一級緩存,就是指CPU的第一層級的高速緩存,主要當擔的工作是緩存指令和緩存數據。一級緩存的容量與結構對CPU性能影響十分大,但是由於它的結構比較復雜,又考慮到成本等因素,一般來說,CPU的一級緩存較小,通常CPU的一級緩存也就能做到256KB左右的水平。L1緩存分成兩種,一種是指令緩存,一種是數據緩存.L1 cache一般工作在CPU的時鍾頻率,要求的就是夠快在L1緩存中,又有一個叫做Cache line的東西。為了提升處理速度,CPU每次處理都是讀取一個Cache line大小的數據。
Cache line:cpu從一級緩存讀取數據的最小單位
補充:魯大師》硬件參數》處理器 ,可以查看電腦的 Cache line 大小,本人電腦是64 byte
二級緩存(L2 Cache)
CPU二級緩存,就是指CPU的第二層級的高速緩存,而二級緩存的容量會直接影響到CPU的性能,二級緩存的容量越大越好。例如intel的第八代i7-8700處理器,共有六個核心數量,而每個核心都擁有256KB的二級緩存,屬於各核心獨享,這樣二級緩存總數就達到了1.5MB。
三級緩存(L3 Cache)
CPU三級緩存,就是指CPU的第三層級的高速緩存,其作用是進一步降低內存的延遲,同時提升海量數據量計算時的性能。和一級緩存、二級緩存不同的是,三級緩存是核心共享的,能夠將容量做的很大。
///////題外話1 開始///////////////////////////////////////
題外話:如何查看個人電腦cpu緩存?答案 查看任務管理器
下圖我本人的cpu緩存 L1:384K=6核* 64K/核。64K=32K 數據緩存+32K 指令緩存
L2:1.5MB=256K/核*/6核
L3:9MB是共享的。
///////題外話1 結束///////////////////////////////////////
其中:
- L1緩存分成兩種,一種是指令緩存,一種是數據緩存。L2緩存和L3緩存不分指令和數據。在L1緩存中,有一個叫做Cache line的東西。 他表示cpu從一級緩存讀取數據的最小單位。
- L1和L2緩存在每一個CPU核中,L3則是所有CPU核心共享的內存。
- L1、L2、L3的越離CPU近就越小,速度也就越快,越離CPU遠,速度也越慢。
再往后面就是內存,內存的后面就是硬盤。我們來看一些他們的速度
- L1的存取速度:4個CPU時鍾周期
- L2的存取速度:11個CPU時鍾周期
- L3的存取速度:39個CPU時鍾周期
- RAM內存的存取速度:107個CPU時鍾周期
- 固態硬盤訪問10-100us
- 機械硬盤訪問1-10ms
這邊4個cpu周期,中時許電路中Latency (延遲)。
我們可以看到,L1的速度是RAM的27倍,L1和L2的存取大小基本上是KB級的,L3則是MB級別的。例如,Intel Core i7-8700K,是一個6核的CPU,每核上的L1是64KB(數據和指令各32KB),L2是256K,L3有2MB。
四、為什么設置多級緩存
我們的數據從內存向上,先到L3,再到L2,再到L1,最后到寄存器進行計算。那么,為什么會設計成三層?這里有以下幾方面的考慮:
物理速度,如果要更大的容量就需要更多的晶體管,除了芯片的體積會變大,更重要的是大量的晶體管會導致速度下降,因為訪問速度和要訪問的晶體管所在的位置成反比。也就是當信號路徑變長時,通信速度會變慢,這就是物理問題。
另外一個問題是,多核技術中,數據的狀態需要在多個CPU進行同步。我們可以看到,cache和RAM的速度差距太大。所以,多級不同尺寸的緩存有利於提高整體的性能。
這個世界永遠是平衡的,一面變得有多光鮮,另一方面也會變得有多黑暗,建立多級的緩存,一定就會引入其它的問題。這里有兩個比較重要的問題。
一個是比較簡單的緩存命中率的問題,另一個是比較復雜的緩存更新的一致性問題
尤其是第二個問題,在多核技術下,這就很像分布式系統了,要面對多個地方進行更新。
/////////////////////題外話2 開始///////////////////////
1 MB 大小的 CPU Cache 需要 7 美金的成本,而內存只需要 0.015 美金的成本,成本方面相差了 466 倍,所以 CPU Cache 不像內存那樣動輒以 GB 計算,它的大小是以 KB 或 MB 來計算的。
為了解決這一問題,CPU設置了多級緩存結構
其中較為典型的有L1,L2,L3高速緩存
其中L1高速緩存具有和寄存器差不多的速度。
L1,L2,L3緩存都位於芯片內部,這些緩存我們統稱為Cache
/////////////////////題外話2 結束///////////////////////
Cache高速緩沖存儲器寫機制
1.write through:Write-through(直寫模式)在數據更新時,同時寫入緩存Cache和后端存儲。此模式的優點是操作簡單;缺點是因為數據修改需要同時寫入存儲,數據寫入速度較慢。
2. write back:(回寫模式)在數據更新時只寫入緩存Cache。只在數據被替換出緩存時,被修改的緩存數據才會被寫到后端存儲。此模式的優點是數據寫入速度快,因為不需要寫存儲;缺點是一旦更新后的數據未被寫入存儲時出現系統掉電的情況,數據將無法找回。
對於寫操作,存在寫入緩存缺失數據的情況,這時有兩種處理方式:
Write allocate方式將寫入位置讀入緩存,然后采用write-hit(緩存命中寫入)操作。寫缺失操作與讀缺失操作類似。
No-write allocate方式並不將寫入位置讀入緩存,而是直接將數據寫入存儲。這種方式下,只有讀操作會被緩存。
無論是Write-through還是Write-back都可以使用寫缺失的兩種方式之一。只是通常Write-back采用Write allocate方式,而Write-through采用No-write allocate方式;因為多次寫入同一緩存時,Write allocate配合Write-back可以提升性能;而對於Write-through則沒有幫助。
處理流程圖
Write-through模式處理流程:
A Write-Through cache with No-Write Allocation
Write-back模式處理流程:
CPU緩存一致性協議MESI