總結 CPU快取記憶體

2021-09-24 08:15:20 字數 2104 閱讀 3609

我們都知道,程式是由一條條指令和資料組成的,cpu在執行時的工作也是周而復始的執行一條條用途各異的指令。

在一開始,程式載入到主存,在程式執行的過程中,將指令一條條的從主存中取出並執行,巨集觀上來說我們把主存看做是乙個很大的一維位元組陣列,位址即可看作為陣列的下標。這樣的結構可以確保程式可以順利執行。可是存在乙個問題,主存的讀取速度太慢,而cpu的運算速度卻非常快,cpu執行完一條指令後又等待十分漫長的時間才能等到下一條指令的到來,cpu的資源被嚴重浪費。

其實cpu一開始執行指令的速度也並不是特別快的,通過不斷的優化將其速度進行提公升。過了一段時間,cpu執行指令的速度越來越快了,這時發現影響程式執行快慢的瓶頸不在於cpu了,而在於cpu執行指令與主存讀取指令的速度差距上,所以必須要想辦法讓讀取指令的速度快起來,這便出現了我們的快取記憶體。

引入快取記憶體後的儲存器層次結構圖如下所示,當然這只是乙個簡化圖,利於我們理解整個儲存器的結構層次。其中l1,l2就是我們所說的快取記憶體, 這個結構類似於乙個金字塔,越往上則越靠近cpu,讀取和寫入的速度越快,造價也越昂貴。 圖1

這裡我們還需要提出的是乙個快取塊的概念,l0中儲存的是l1的快取,l1中儲存的是l2的快取,依次類推,資料總是在各個層級之間上下移動,那麼資料移動的單位我們稱之為快取塊。比如說假設l0和l1的快取塊大小假設為8kb,那麼傳輸單元會是8kb。l1快取記憶體的物理結構如下圖所示

圖2 這裡我們假設l1與l2之間的快取塊大小為8kb,l2與主存之間的快取塊大小為64kb為例來闡述一下cpu讀取指令整個流程,定址器首先會到l1快取記憶體中去尋找指令,如果沒有cpu則等待定址器到l2快取記憶體中尋找指令,如果l2快取記憶體也沒有尋找到,那就從主存中尋找指令。尋找到指令後將命中的快取塊(64kb)的所有資料移動到l2,並將l2對應的快取塊(8kb)所有資料移動到l1。最終在l1中將對應的單條指令返回給cpu。

為何我們要提出快取塊這個概念?

我們的程式指令往往是連續的,程式訪問到某個資料時,那麼它和它周圍的資料會有很大可能在短時間內被再次訪問,這被稱之為區域性性原理。所以我們在訪問到某個資料時,索性將它和它周圍的資料也提到上層的快取記憶體中,下一次就可以直接從快取記憶體中命中資料。

上節中簡單描述了cpu取指令時資料在儲存器結構中的流動情況,我們說如果l1中沒有我們訪問的資料則會到l2中去尋找,我們稱這個為快取不命中,那麼如何判斷快取是否命中呢?我們將圖2的快取記憶體進行放大,觀摩一下它的結構 圖3

我們的快取塊除了真實的快取塊資料塊之外,還有額外的1位有效位和t位標記位,我們假設l1快取記憶體有s個這樣的快取塊。(注意我們之前所說的快取塊大小是指真實的快取塊資料塊大小,所以我們這裡l1快取記憶體的容量大小=s*b個位元組)

如果說你在疑惑t、b、s的含義,先不用管它,繼續往下看自然就知道了

如果說cpu現在要訪問某個位址為adress的資料,定址器將位址進行如下劃分

圖4

這裡的t、b、s與圖3的資料一致。假設我們是64位機器,那麼adress的長度應當等於64,即t+s+b=64

上面的大篇幅中我們都是讀資料的情況,那麼如果是寫資料快取記憶體改如何工作呢?由於寫的情況涉及到資料的修改,所以務必要比讀的情況更複雜一些, 假如我們現在要對位址a進行寫入,那我們存在兩種方案

1、摒棄快取記憶體,直接寫主存

2、寫入快取記憶體

如果我們選擇第一種情況,那麼直接寫入就ok,但是就回到了一開始的問題了,寫入的速度太慢,cpu要漫長的等待。那麼我們當然是採用第二種情況。先將資料讀入快取記憶體,再對快取進行寫入。那麼這種情況我們需要注意乙個問題:不同層級的快取同步問題,也就是說當這個快取塊發生快取衝突,在資料覆蓋時需要將這個快取塊重新整理到它的下一級快取記憶體中。

通過上面的講述我想快取記憶體工作的原理應該在腦海中已經有乙個流程圖了。那麼知道了快取的工作原理在實際工作中有什麼用呢?這個就回到了我們一開始說的區域性性原理了,由於計算機總是將一段連續的位址進行快取(快取塊),所以如果我們編寫的**符合區域性性原理,那麼執行效率將會有很大的提公升,這為我們的程式效能優化提供了乙個方面的指引。

舉個例子

如果遍歷乙個長度相同陣列和乙個鍊錶,由於陣列在物理儲存上是連續的,遍歷陣列時效率會更快

CPU快取記憶體行

cpu 為了更快的執行 於是當從記憶體中讀取資料時,並不是唯讀自己想要的部分。而是讀取足夠的位元組來填入快取記憶體行。根據不同的 cpu,快取記憶體行大小不同。如 x86是 32bytes 而alpha 是64bytes 並且始終在第 32個位元組或第 64個位元組處對齊。這樣,當 cpu訪問相鄰的...

CPU快取記憶體行

cpu 為了更快的執行 於是當從記憶體中讀取資料時,並不是唯讀自己想要的部分。而是讀取足夠的位元組來填入快取記憶體行。根據不同的 cpu,快取記憶體行大小不同。如 x86是 32bytes 而alpha 是64bytes 並且始終在第 32個位元組或第 64個位元組處對齊。這樣,當 cpu訪問相鄰的...

CPU快取記憶體行對齊

cpu的快取記憶體一般分為一級快取和二級快取,現今更多的cpu更是提供了 快取。cpu在執行時首先從一級快取讀取資料,如果讀取失敗則會從二級快取讀取資料,如果仍然失敗則再從記憶體中存讀取資料。而cpu從一級快取或二級快取或主記憶體中最終讀取到資料所耗費的時鐘週期差距是非常之大的。因此快取記憶體的容量...