CPU快取相關知識 cache

2021-10-07 07:23:05 字數 1884 閱讀 9175

主要分成這麼幾個部分:基礎知識、快取的命中、快取的一致性、相關的**示例和延伸閱讀。其中會講述一些多核 cpu 的系統架構以及其原理,包括對程式效能上的影響,以及在進行併發程式設計的時候需要注意到的一些問題。這篇文章我會盡量地寫簡單和通俗易懂一些,主要是講清楚相關的原理和問題,而對於一些細節和延伸閱讀我會在文章最後會給出相關的資源。

因為無論你寫什麼樣的**都會交給cpu來執行,所以,如果你想寫出效能比較高的**,這篇文章中提到的技術還是值得認真學習的。另外,千萬別覺得這些東西沒用,這些東西非常有用,十多年前就是這些知識在效能調優上幫了我的很多大忙,從而跟很多人拉開了差距……

首先,我們都知道現在的cpu多核技術,都會有幾級快取,老的cpu會有兩級記憶體(l1和l2),新的cpu會有**記憶體(l1,l2,l3 ),如下圖所示:

其中:

再往後面就是記憶體,記憶體的後面就是硬碟。我們來看一些他們的速度:

我們可以看到,l1的速度是ram的27倍,但是l1/l2的大小基本上也就是kb級別的,l3會是mb級別的。例如:intel core i7-8700k ,是乙個6核的cpu,每核上的l1是64kb(資料和指令各32kb),l2 是 256k,l3有2mb(我的蘋果電腦是 intel core i9-8950hk,和core i7-8700k的cache大小一樣)。

我們的資料就從記憶體向上,先到l3,再到l2,再到l1,最後到暫存器進行cpu計算。為什麼會設計成三層?這裡有下面幾個方面的考慮:

這個世界永遠是平衡的,一面變得有多光鮮,另一面也會變得有多黑暗。建立這麼多級的快取,一定就會引入其它的問題,這裡有兩個比較重要的問題,

尤其是第二個問題,在多核技術下,這就很像分布式的系統了,要對多個地方進行更新。

在說明這兩個問題之前。我們需要要解乙個術語 cache line。快取基本上來說就是把後面的資料載入到離自己近的地方,對於cpu來說,它是不會乙個位元組乙個位元組的載入的,因為這非常沒有效率,一般來說都是要一塊一塊的載入的,對於這樣的一塊一塊的資料單位,術語叫「cache line」,一般來說,乙個主流的cpu的cache line 是 64 bytes(也有的cpu用32bytes和128bytes),64bytes也就是16個32位的整型,這就是cpu從記憶體中撈資料上來的最小資料單位。

比如:cache line是最小單位(64bytes),所以先把cache分布多個cache line,比如:l1有32kb,那麼,32kb/64b = 512 個 cache line。

一方面,快取需要把記憶體裡的資料放到放進來,英文叫 cpu associativity。cache的資料放置的策略決定了記憶體中的資料塊會拷貝到cpu cache中的哪個位置上,因為cache的大小遠遠小於記憶體,所以,需要有一種位址關聯的演算法,能夠讓記憶體中的資料可以被對映到cache中來。這個有點像記憶體位址從邏輯位址向物理位址對映的方法,但不完全一樣。

基本上來說,我們會有如下的一些方法。

為了方便索引記憶體位址,

offset:再往後的6bits用於表示在cache line 裡的偏移量

當拿到乙個記憶體位址的時候,先拿出中間的 6bits 來,找到是哪組。

然後,在這乙個8組的cache line中,再進行o(n) n=8 的遍歷,主是要匹配前24bits的tag。如果匹配中了,就算命中,如果沒有匹配到,那就是cache miss,如果是讀操作,就需要進向後面的快取進行訪問了。l2/l3同樣是這樣的演算法。而淘汰演算法有兩種,一種是隨機一種是lru。現在一般都是以lru的演算法(通過增加乙個訪問計數器來實現)

DPDK學習 cache相關知識

6.1 tlb 如前所說,tlb也是一種cache,用於存放頁表項的cache,方便快速完成邏輯位址到實體地址的轉換。6.2 大頁 但是乙個常規頁4k,假設乙個程式用了512頁,總共2mb,這就需要tlb裡至少方下512個頁表項才能保證每次都能命中,但tlb大小有限。所以為了減少tlb不命中的情況,...

cpu相關的基礎知識

概念 cpu是什麼 做什麼用 一般cpu是接在 的,我們先來看看cpu是什麼,cpu既 處理器 電腦中乙個最重要,最核心的東西,市面上能買到的cpu只有兩種,一種是intel公司生產的,另一種是amd公司生產的。如圖1 1 上圖分別是intel和amd公司兩個廠家生產的cpu,cpu主要的工作就是處...

快取相關知識點

二八定律 2.1 快取穿透是說訪問乙個快取中沒有的資料,但是這個資料資料庫中也不存在。普通思路下我們沒有從資料庫中拿到資料是不會觸發加快取操作的。這時如果是有人惡意攻擊,大量的訪問就會透過快取直接打到資料庫,對後端服務和資料庫做成巨大的壓力甚至宕機。2.2 解決方案 快取空物件。如果快取未命中,而資...