自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

「底層原理」深入理解Cache

存儲(chǔ) 存儲(chǔ)軟件
本系列的文章重點(diǎn)介紹緩存cache。了解如何獲取cache的參數(shù),了解緩存的組織結(jié)構(gòu),了解cache對(duì)程序的影響,了解如何利用cache提升性能。

[[337101]]

存儲(chǔ)器是分層次的,離CPU越近的存儲(chǔ)器,速度越快,每字節(jié)的成本越高,同時(shí)容量也因此越小。寄存器速度最快,離CPU最近,成本最高,所以個(gè)數(shù)容量有限,其次是高速緩存(緩存也是分級(jí),有L1,L2等緩存),再次是主存(普通內(nèi)存),再次是本地磁盤。

 

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

 

寄存器的速度最快,可以在一個(gè)時(shí)鐘周期內(nèi)訪問,其次是高速緩存,可以在幾個(gè)時(shí)鐘周期內(nèi)訪問,普通內(nèi)存可以在幾十個(gè)或幾百個(gè)時(shí)鐘周期內(nèi)訪問。

 

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

 

存儲(chǔ)器分級(jí),利用的是局部性原理。我們可以以經(jīng)典的閱讀書籍為例。我在讀的書,捧在手里(寄存器),我最近頻繁閱讀的書,放在書桌上(緩存),隨時(shí)取來讀。當(dāng)然書桌上只能放有限幾本書。我更多的書在書架上(內(nèi)存)。如果書架上沒有的書,就去圖書館(磁盤)。我要讀的書如果手里沒有,那么去書桌上找,如果書桌上沒有,去書架上找,如果書架上沒有去圖書館去找。可以對(duì)應(yīng)寄存器沒有,則從緩存中取,緩存中沒有,則從內(nèi)存中取到緩存,如果內(nèi)存中沒有,則先從磁盤讀入內(nèi)存,再讀入緩存,再讀入寄存器。

本系列的文章重點(diǎn)介紹緩存cache。了解如何獲取cache的參數(shù),了解緩存的組織結(jié)構(gòu),了解cache對(duì)程序的影響,了解如何利用cache提升性能。

 

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

 

本文作為系列文章的第一篇,講述的如何獲取cache的組成結(jié)構(gòu)和如何獲取cache的參數(shù)。

cache分成多個(gè)組,每個(gè)組分成多個(gè)行,linesize是cache的基本單位,從主存向cache遷移數(shù)據(jù)都是按照linesize為單位替換的。比如linesize為32Byte,那么遷移必須一次遷移32Byte到cache。 這個(gè)linesize比較容易理解,想想我們前面書的例子,我們從書架往書桌搬書必須以書為單位,肯定不能把書撕了以頁為單位。書就是linesize。當(dāng)然了現(xiàn)實(shí)生活中每本書頁數(shù)不同,但是同個(gè)cache的linesize總是相同的。

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

我們知道,cache的容量要遠(yuǎn)遠(yuǎn)小于主存,主存和cache肯定不是一一對(duì)應(yīng)的,那么主存中的地址和cache的映射關(guān)系是怎樣的呢?

拿到一個(gè)地址,首先是映射到一個(gè)組里面去。如何映射?取內(nèi)存地址的中間幾位來映射。

舉例來說,data cache: 32-KB, 8-way set associative, 64-byte line size表示Cache總大小為32KB,8路組相連(每組有8個(gè)line),每個(gè)line的大小linesize為64Byte,OK,我們可以很輕易的算出一共有32K/8/64=64 個(gè)組。

對(duì)于32位的內(nèi)存地址,每個(gè)line有2^6 = 64Byte,所以地址的【0,5】區(qū)分line中的那個(gè)字節(jié)。一共有64個(gè)組。我們?nèi)?nèi)存地址中間6為來hash查找地址屬于那個(gè)組。即內(nèi)存地址的【6,11】位來確定屬于64組的哪一個(gè)組。組確定了之后,【12,31】的內(nèi)存地址與組中8個(gè)line挨個(gè)比對(duì),如果【12,31】為與某個(gè)line一致,并且這個(gè)line為有效,那么緩存命中。

OK,cache分成三類:

直接映射高速緩存,這個(gè)簡單,即每個(gè)組只有一個(gè)line,選中組之后不需要和組中的每個(gè)line比對(duì),因?yàn)橹挥幸粋€(gè)line。

組相聯(lián)高速緩存,這個(gè)就是我們前面介紹的cache。 S個(gè)組,每個(gè)組E個(gè)line。

全相聯(lián)高速緩存,這個(gè)簡單,只有一個(gè)組,就是全相聯(lián)。不用hash來確定組,直接挨個(gè)比對(duì)高位地址,來確定是否命中??梢韵胍娺@種方式不適合大的緩存。想想看,如果4M 的大緩存

描述一個(gè)cache需要以下參數(shù):

  • cache分級(jí),L1 cache, L2 cache, L3 cache,級(jí)別越低,離cpu越近
  • cache的容量
  • cache的linesize
  • cache 每組的行個(gè)數(shù).

組的個(gè)數(shù)完全可以根據(jù)上面的參數(shù)計(jì)算出來,所以沒有列出來.Intel手冊(cè)中用這樣的句子來描述cache:8-MB L3 Cache, 16-way set associative, 64-byte line size ,如何獲取cache的參數(shù)呢,到了我們的老朋友cpuid指令,當(dāng)eax為0x2的時(shí)候,cpuid指令獲取到cache的參數(shù). 下面給出代碼:

 

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

 

 

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

 

我的電腦上運(yùn)行結(jié)果如上圖,查看intel的手冊(cè)可知

 

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

 

責(zé)任編輯:武曉燕 來源: 今日頭條
相關(guān)推薦

2022-11-04 09:43:05

Java線程

2020-03-26 16:40:07

MySQL索引數(shù)據(jù)庫

2020-03-17 08:36:22

數(shù)據(jù)庫存儲(chǔ)Mysql

2021-08-31 10:32:11

LinuxPage Cache命令

2024-03-12 00:00:00

Sora技術(shù)數(shù)據(jù)

2021-03-10 10:55:51

SpringJava代碼

2024-11-01 08:57:07

2022-09-05 08:39:04

kubernetesk8s

2024-04-15 00:00:00

技術(shù)Attention架構(gòu)

2022-06-01 21:23:12

ELKLogstash底層

2023-09-19 22:47:39

Java內(nèi)存

2022-01-14 12:28:18

架構(gòu)OpenFeign遠(yuǎn)程

2022-09-26 08:01:31

線程LIFO操作方式

2019-07-01 13:34:22

vue系統(tǒng)數(shù)據(jù)

2022-09-05 22:22:00

Stream操作對(duì)象

2020-11-04 15:35:13

Golang內(nèi)存程序員

2023-10-13 13:30:00

MySQL鎖機(jī)制

2019-06-12 09:50:23

selectMySQLSQL

2023-01-16 18:32:15

架構(gòu)APNacos

2022-08-22 08:04:25

Spring事務(wù)Atomicity
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)