計算機中內(nèi)存、cache和寄存器之間的關(guān)系
寄存器(Cache)是CPU內(nèi)部集成的,內(nèi)存是掛在CPU外面的數(shù)據(jù)總線上的,訪問內(nèi)存時要在CPU的寄存器(Cache)填上地址,再執(zhí)行相應(yīng)的匯編指令,這時CPU會在數(shù)據(jù)總線上生成讀取或?qū)懭雰?nèi)存數(shù)據(jù)的時鐘信號,最終內(nèi)存的內(nèi)容會被CPU寄存器(Cache)的內(nèi)容更新(寫入)或者被讀入CPU的寄存器(Cache)(讀?。?。如圖:
CPU、內(nèi)存、寄存器之間的關(guān)系cpu 取址 -》地址輸入地址寄存器 -》 緩存命中即,則數(shù)據(jù)進入數(shù)據(jù)寄存器 -》 緩存未命中則進入內(nèi)存 -》 內(nèi)存TLB快表命中則數(shù)據(jù)塊進入緩存,數(shù)據(jù)進入寄存器 -》 內(nèi)存TLB快表未命中則局部數(shù)據(jù)塊進入緩存和快表 -》 內(nèi)存未命中則進入硬盤虛擬存儲區(qū)
CPU里的寄存器
其實就是我們常說的:Cache,有1級 和 2級,(L1,L2)L1容量比較小,L2(集成在主板上,說使用的為靜態(tài)RAM)會多一些,L1是集成在CPU內(nèi)部的寄存器(L1與CPU 同步),訪問它速度自然很快,但容量比較小,L1 64K L2現(xiàn)在最高的就2MB,這顯然是不夠的,所以我們都需要擴展它,內(nèi)存(DDR RAM)就是擴展的“寄存器”,它的訪問速度就比 Cache 速度慢!CPU 在運行某計算時,它會把使用頻率高的數(shù)據(jù)放到L1,L2,把不常用的數(shù)據(jù)保存在RAM中,需要訪問的時候再讀入Cache,當然相比之下硬盤的速度就更低。
計算機中內(nèi)存、cache和寄存器之間的關(guān)系
寄存器是中央處理器內(nèi)的組成部份。寄存器是有限存貯容量的高速存貯部件,它們可用來暫存指令、數(shù)據(jù)和位址。在中央處理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序計數(shù)器(PC)。在中央處理器的算術(shù)及邏輯部件中,包含的寄存器有累加器(ACC)。
內(nèi)存包含的范圍非常廣,一般分為只讀存儲器(ROM)、隨機存儲器(RAM)和高速緩存存儲器(cache)。
寄存器是CPU內(nèi)部的元件,寄存器擁有非常高的讀寫速度,所以在寄存器之間的數(shù)據(jù)傳送非???。
Cache :即高速緩沖存儲器,是位于CPU與主內(nèi)存間的一種容量較小但速度很高的存儲器。由于CPU的速度遠高于主內(nèi)存,CPU直接從內(nèi)存中存取數(shù)據(jù)要等待一定時間周期,Cache中保存著CPU剛用過或循環(huán)使用的一部分數(shù)據(jù),當CPU再次使用該部分數(shù)據(jù)時可從Cache中直接調(diào)用,這樣就減少了CPU的等待時間,提高了系統(tǒng)的效率。Cache又分為一級Cache(L1
Cache)和二級Cache(L2 Cache),L1 Cache集成在CPU內(nèi)部,L2 Cache早期一般是焊在主板上,現(xiàn)在也都集成在CPU內(nèi)部,常見的容量有256KB或512KB L2 Cache。
總結(jié):大致來說數(shù)據(jù)是通過內(nèi)存-Cache-寄存器,Cache緩存則是為了彌補CPU與內(nèi)存之間運算速度的差異而設(shè)置的的部件。
首先看一下計算機的存儲體系(Memory hierarchy)金字塔:
其次我們看看一個計算機的存儲體系
Register
寄存器是CPU的內(nèi)部組成單元,是CPU運算時取指令和數(shù)據(jù)的地方,速度很快,寄存器可以用來暫存指令、數(shù)據(jù)和地址。在CPU中,通常有通用寄存器,如指令寄存器IR;特殊功能寄存器,如程序計數(shù)器PC、sp等。
Cache
緩存即就是用于暫時存放內(nèi)存中的數(shù)據(jù),若果寄存器要取內(nèi)存中的一部分數(shù)據(jù)時,可直接從緩存中取到,這樣可以調(diào)高速度。高速緩存是內(nèi)存的部分拷貝。
CPU 《--- 》 寄存器《--- 》 緩存《--- 》內(nèi)存
寄存器的工作方式很簡單,只有兩步:(1)找到相關(guān)的位,(2)讀取這些位。
內(nèi)存的工作方式就要復(fù)雜得多:
(1)找到數(shù)據(jù)的指針。(指針可能存放在寄存器內(nèi),所以這一步就已經(jīng)包括寄存器的全部工作了。)
(2)將指針送往內(nèi)存管理單元(MMU),由MMU將虛擬的內(nèi)存地址翻譯成實際的物理地址。
(3)將物理地址送往內(nèi)存控制器(memory controller),由內(nèi)存控制器找出該地址在哪一根內(nèi)存插槽(bank)上。
?。?)確定數(shù)據(jù)在哪一個內(nèi)存塊(chunk)上,從該塊讀取數(shù)據(jù)。
?。?)數(shù)據(jù)先送回內(nèi)存控制器,再送回CPU,然后開始使用。
內(nèi)存的工作流程比寄存器多出許多步。每一步都會產(chǎn)生延遲,累積起來就使得內(nèi)存比寄存器慢得多。
為了緩解寄存器與內(nèi)存之間的巨大速度差異,硬件設(shè)計師做出了許多努力,包括在CPU內(nèi)部設(shè)置緩存、優(yōu)化CPU工作方式,盡量一次性從內(nèi)存讀取指令所要用到的全部數(shù)據(jù)等等。
RAM-memory
即內(nèi)存,是用于存放數(shù)據(jù)的單元。其作用是用于暫時存放CPU中的運算數(shù)據(jù),以及與硬盤等外部存儲器交換的數(shù)據(jù)。
HardDisk
硬盤
一條匯編指令大概執(zhí)行過程是(不是絕對的,不同平臺有差異):
取指(取指令)、譯碼(把指令轉(zhuǎn)換成微指令)、取數(shù)(讀內(nèi)存里的操作數(shù))、計算(各種計算的過程,ALU負責(zé))、寫回(將計算結(jié)果寫回內(nèi)存),有些平臺里,前兩步會合并成一步,某些指令也不會有取數(shù)或者回寫的過程。
再提一下CPU主頻的概念:首先,主頻絕對不等于一秒鐘可以執(zhí)行的指令個數(shù),每個指令的執(zhí)行成本是不同的,比如x86平臺里匯編指令I(lǐng)NC就比ADD要快,具體每個指令的時鐘周期可以參考intel的手冊。
為什么要提主頻?因為上面的執(zhí)行過程中,每個操作都需要占用一個時鐘周期,對于一個操作內(nèi)存的加法,就需要5個時鐘周期,換句話說,500Mhz主頻的CPU,最多執(zhí)行100MHz條指令。
仔細觀察,上面的步驟里不包括寄存器操作,對于CPU來說讀/寫寄存器是不需要時間的,或者說如果只是操作寄存器(比如類似mov BX,AX之類的操作),那么一秒鐘執(zhí)行的指令個數(shù)理論上說就等于主頻,因為寄存器是CPU的一部分。
然后寄存器往下就是各級的cache,有L1 cache,L2,甚至有L3的,以及TLB這些(TLB也可以認為是cache),之后就是內(nèi)存,前面說寄存器快,現(xiàn)在說為什么這些慢:
對于各級的cache,訪問速度是不同的,理論上說L1cache(一級緩存)有著跟CPU寄存器相同的速度,但L1cache有一個問題,當需要同步cache和內(nèi)存之間的內(nèi)容時,需要鎖住cache的某一塊(術(shù)語是cache line),然后再進行cache或者內(nèi)存內(nèi)容的更新,這段期間這個cache塊是不能被訪問的,所以L1cache的速度就沒寄存器快,因為它會頻繁的有一段時間不可用。
L1 cache下面是L2 cache,甚至L3 cache,這些都有跟L1 cache一樣的問題,要加鎖,同步,并且L2比L1慢,L3比L2慢,這樣速度也就更低了。
最后說說內(nèi)存,內(nèi)存的主頻現(xiàn)在主流是1333左右吧?或者1600,單位是MHz,這比CPU的速度要低的多,所以內(nèi)存的速度起點就更低,然后內(nèi)存跟CPU之間通信也不是想要什么就要什么的。
內(nèi)存不僅僅要跟CPU通信,還要通過DMA控制器與其它硬件通信,CPU要發(fā)起一次內(nèi)存請求,先要給一個信號說“我要訪問數(shù)據(jù)了,你忙不忙?”如果此時內(nèi)存忙,則通信需要等待,不忙的時候,通信才能正常。并且,這個請求信號的時間代價,就是夠執(zhí)行幾個匯編指令了,所以,這是內(nèi)存慢的一個原因。
另一個原因是:內(nèi)存跟CPU之間通信的通道也是有限的,就是所謂的“總線帶寬”,但,要記住這個帶寬不僅僅是留給內(nèi)存的,還包括顯存之類的各種通信都要走這條路,并且由于路是共享的,所以任何請求發(fā)起之間都要先搶占,搶占帶寬需要時間,帶寬不夠等待的話也需要時間。
以上兩條加起來導(dǎo)致了CPU訪問內(nèi)存更慢,比cache還慢。
舉個更容易懂的例子:
CPU要取寄存器AX的值,只需要一步:把AX給我拿來,AX就拿來了。
CPU要取L1 cache的某個值,需要1-3步(或者更多):把某某cache行鎖住,把某個數(shù)據(jù)拿來,解鎖,如果沒鎖住就慢了。
CPU要取L2 cache的某個值,先要到L1 cache里取,L1說,我沒有,在L2里,L2開始加鎖,加鎖以后,把L2里的數(shù)據(jù)復(fù)制到L1,再執(zhí)行讀L1的過程,上面的3步,再解鎖。
CPU取L3 cache的也是一樣,只不過先由L3復(fù)制到L2,從L2復(fù)制到L1,從L1到CPU。
CPU取內(nèi)存則最復(fù)雜:通知內(nèi)存控制器占用總線帶寬,通知內(nèi)存加鎖,發(fā)起內(nèi)存讀請求,等待回應(yīng),回應(yīng)數(shù)據(jù)保存到L3(如果沒有就到L2),再從L3/2到L1,再從L1到CPU,之后解除總線鎖定。
非常好我支持^.^
(6) 100%
不好我反對
(0) 0%
相關(guān)閱讀:
- [電子說] 學(xué)習(xí)STM32F103的ADC功能 2023-10-24
- [編程語言及工具] 常用于緩存處理的機制總結(jié) 如何避免緩存雪崩問題? 2023-10-24
- [電子說] 學(xué)習(xí)STM32F103的DAC功能 2023-10-24
- [電子說] 學(xué)習(xí)STM32F103的定時器功能 2023-10-24
- [電子說] STM32基礎(chǔ)知識:定時器的PWM輸出功能 2023-10-24
- [電子說] 既然ODR能控制管腳高低電平,為什么還需要BSRR寄存器呢? 2023-10-24
- [電子說] ARM系列-P Channel簡析 2023-10-24
- [控制/MCU] 基于STM32F429芯片的單片機芯片內(nèi)存映射圖 2023-10-23
( 發(fā)表人:李倩 )