深入理解Cache

2021-07-02 20:02:45 字數 1932 閱讀 6063

儲存器是分層次的,離cpu越近的儲存器,速度越快,每位元組的成本越高,同時容量也因此越小。暫存器速度最快,離cpu最近,成本最高,所以個數容量有限,其次是快取記憶體(快取也是分級,有l1,l2等快取),再次是主存(普通記憶體),再次是本地磁碟。

暫存器的速度最快,可以在乙個時鐘週期內訪問,其次是快取記憶體,可以在幾個時鐘週期內訪問,普通記憶體可以在幾十個或幾百個時鐘週期內訪問。

儲存器分級,利用的是區域性性原理。我們可以以經典的閱讀書籍為例。我在讀的書,捧在手裡(暫存器),我最近頻繁閱讀的書,放在書桌上(快取),隨時取來 讀。當然書桌上只能放有限幾本書。我更多的書在書架上(記憶體)。如果書架上沒有的書,就去圖書館(磁碟)。我要讀的書如果手裡沒有,那麼去書桌上找,如果 書桌上沒有,去書架上找,如果書架上沒有去圖書館去找。可以對應暫存器沒有,則從快取中取,快取中沒有,則從記憶體中取到快取,如果記憶體中沒有,則先從磁碟 讀入記憶體,再讀入快取,再讀入暫存器。

本系列的文章重點介紹快取cache。了解如何獲取cache的引數,了解快取的組織結構,了解cache對程式的影響,了解如何利用cache提公升效能。

cache分成多個組,每個組分成多個行,linesize是cache的基本單位,從主存向cache遷移資料都是按照linesize為單位替換的。 比如linesize為32byte,那麼遷移必須一次遷移32byte到cache。 這個linesize比較容易理解,想想我們前面書的例子,我們從書架往書桌搬書必須以書為單位,肯定不能把書撕了以頁為單位。書就是linesize。 當然了現實生活中每本書頁數不同,但是同個cache的linesize總是相同的。

所謂8路組相連( 8-way set associative)的含義是指,每個組裡面有8個行。

我們知道,cache的容量要遠遠小於主存,主存和cache肯定不是一一對應的,那麼主存中的位址和cache的對映關係是怎樣的呢?

拿到乙個位址,首先是對映到乙個組裡面去。如何對映?取記憶體位址的中間幾位來對映。

舉例來說,data cache: 32-kb, 8-way set associative, 64-byte line size

cache總大小為32kb,8路組相連(每組有8個line),每個line的大小linesize為64byte,ok,我們可以很輕易的算出一共有32k/8/64=64 個組。

對於32位的記憶體位址,每個line有2^6 = 64byte,所以位址的【0,5】區分line中的那個位元組。一共有64個組。我們取記憶體位址中間6為來hash查詢位址屬於那個組。即記憶體位址的 【6,11】位來確定屬於64組的哪乙個組。組確定了之後,【12,31】的記憶體位址與組中8個line挨個比對,如果【12,31】為與某個line一 致,並且這個line為有效,那麼快取命中。

ok,cache分成三類,

1、直接對映快取記憶體,這個簡單,即每個組只有乙個line,選中組之後不需要和組中的每個line比對, 因為只有乙個line。

2、組相聯快取記憶體,這個就是我們前面介紹的cache。 s個組,每個組e個line。

3、全相聯快取記憶體,這個簡單,只有乙個組,就是全相聯。不用hash來確定組,直接挨個比對高位位址,來確定是否命中。可以想見這種方式不適合大的快取。想 想看,如果4m 的大快取 linesize為32byte,採用全相聯的話,就意味著4*1024*1024/32 = 128k 個line挨個比較,來確定是否命中,這是多要命的事情。快取記憶體立馬成了低速快取了。

描述乙個cache需要以下引數 :

1 cache分級,l1 cache, l2 cache, l3 cache,級別越低,離cpu越近

2 cache的容量

3 cache的linesize

4 cache 每組的行個數.

組的個數完全可以根據上面的引數計算出來,所以沒有列出來.

intel手冊中用這樣的句子來描述cache:

8-mb l3 cache, 16-way set associative, 64-byte line size

底層原理 深入理解Cache (上)

儲存器是分層次的,離cpu越近的儲存器,速度越快,每位元組的成本越高,同時容量也因此越小。暫存器速度最快,離cpu最近,成本最高,所以個數容量有限,其次是快取記憶體 快取也是分級,有l1,l2等快取 再次是主存 普通記憶體 再次是本地磁碟。暫存器的速度最快,可以在乙個時鐘週期內訪問,其次是快取記憶體...

深入理解C語言 深入理解指標

關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...

mysql 索引深入理解 深入理解MySql的索引

為什麼索引能提高查詢速度 先從 mysql的基本儲存結構說起 mysql的基本儲存結構是頁 記錄都存在頁裡邊 各個資料頁可以組成乙個雙向鍊錶每個資料頁中的記錄又可以組成乙個單向鍊錶 每個資料頁都會為儲存在它裡邊兒的記錄生成乙個頁目錄,在通過主鍵查詢某條記錄的時候可以在頁目錄中使用二分法快速定位到對應...