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

2022-06-15 18:18:08 字數 2349 閱讀 6609

儲存器是分層次的,離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分成三類:

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

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

全相聯快取記憶體,這個簡單,只有乙個組,就是全相聯。不用hash來確定組,直接挨個比對高位位址,來確定是否命中。可以想見這種方式不適合大的快取。想想看,如果4m 的大快取

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

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

cache的容量

cache的linesize

cache 每組的行個數.

組的個數完全可以根據上面的引數計算出來,所以沒有列出來.intel手冊中用這樣的句子來描述cache:8-mb l3 cache, 16-way set associative, 64-byte line size ,如何獲取cache的引數呢,到了我們的老朋友cpuid指令,當eax為0x2的時候,cpuid指令獲取到cache的引數. 下面給出**:

我的電腦上執行結果如上圖,檢視intel的手冊可知

深入理解springmvc 底層原理

深入理解springmvc 底層原理 web.xml 檔案中的配置 dispatcherservlet springmvc執行流程 springmvc 一切請求的入口 dispatcherservlet 對映處理器 對映 key value 作用 根據請求 url 找到乙個 method handl...

深入理解Cache

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

深入理解List集合框架底層原理的實現

前言 此篇文章講解arraylist和linkedlist底層實現原理 for和foreach遍歷集合哪個效率會更高一些!講講什麼是集合框架?集合框架是為表示和操作集合而規定的一種統一的標準的體系結構。任何集合框架都包含三大塊內容 對外的介面 介面的實現和對集合運算的演算法。沒學集合框架之前我們儲存...