計算機(jī)中內(nèi)存、cache和寄存器之間的關(guān)系及區(qū)別

轉(zhuǎn)載自文章https://blog.csdn.net/hellojoy/article/details/54744231
最近在看一些高并發(fā)相關(guān)的內(nèi)容,總感覺有些地方理解的不對,于是再去看看硬件架構(gòu)方面的知識,補(bǔ)了補(bǔ)基礎(chǔ)知識。
以下純轉(zhuǎn)載,這篇文章講的挺好的。解決了我的很多疑惑。

  1. 寄存器是中央處理器內(nèi)的組成部份。寄存器是有限存貯容量的高速存貯部件,它們可用來暫存指令、數(shù)據(jù)和位址。在中央處理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序計數(shù)器(PC)。在中央處理器的算術(shù)及邏輯部件中,包含的寄存器有累加器(ACC)。

  2. 內(nèi)存包含的范圍非常廣,一般分為只讀存儲器(ROM)、隨機(jī)存儲器(RAM)和高速緩存存儲器(cache)。

  3. 寄存器是CPU內(nèi)部的元件,寄存器擁有非常高的讀寫速度,所以在寄存器之間的數(shù)據(jù)傳送非???。

  4. Cache :即高速緩沖存儲器,是位于CPU與主內(nèi)存間的一種容量較小但速度很高的存儲器。由于CPU的速度遠(yuǎn)高于主內(nèi)存,CPU直接從內(nèi)存中存取數(shù)據(jù)要等待一定時間周期,Cache中保存著CPU剛用過或循環(huán)使用的一部分?jǐn)?shù)據(jù),當(dāng)CPU再次使用該部分?jǐn)?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緩存則是為了彌補(bǔ)CPU與內(nèi)存之間運(yùn)算速度的差異而設(shè)置的的部件。

  • 首先看一下計算機(jī)的存儲體系(Memory hierarchy)金字塔:


    圖片.png
  • 其次我們看看一個計算機(jī)的存儲體系


    圖片.png

Register

寄存器是CPU的內(nèi)部組成單元,是CPU運(yùn)算時取指令和數(shù)據(jù)的地方,速度很快,寄存器可以用來暫存指令、數(shù)據(jù)和地址。在CPU中,通常有通用寄存器,如指令寄存器IR;特殊功能寄存器,如程序計數(shù)器PC、sp等。

Cache

緩存即就是用于暫時存放內(nèi)存中的數(shù)據(jù),若果寄存器要取內(nèi)存中的一部分?jǐn)?shù)據(jù)時,可直接從緩存中取到,這樣可以調(diào)高速度。高速緩存是內(nèi)存的部分拷貝。

CPU <--- > 寄存器<--- > 緩存<--- >內(nèi)存

寄存器的工作方式很簡單,只有兩步:(1)找到相關(guān)的位,(2)讀取這些位。

內(nèi)存的工作方式就要復(fù)雜得多:

(1)找到數(shù)據(jù)的指針。(指針可能存放在寄存器內(nèi),所以這一步就已經(jīng)包括寄存器的全部工作了。)

(2)將指針?biāo)屯鶅?nèi)存管理單元(MMU),由MMU將虛擬的內(nèi)存地址翻譯成實(shí)際的物理地址。

(3)將物理地址送往內(nèi)存控制器(memory controller),由內(nèi)存控制器找出該地址在哪一根內(nèi)存插槽(bank)上。

(4)確定數(shù)據(jù)在哪一個內(nèi)存塊(chunk)上,從該塊讀取數(shù)據(jù)。

(5)數(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中的運(yùn)算數(shù)據(jù),以及與硬盤等外部存儲器交換的數(shù)據(jù)。

HardDisk

硬盤


一條匯編指令大概執(zhí)行過程是(不是絕對的,不同平臺有差異):
取指(取指令)、譯碼(把指令轉(zhuǎn)換成微指令)、取數(shù)(讀內(nèi)存里的操作數(shù))、計算(各種計算的過程,ALU負(fù)責(zé))、寫回(將計算結(jié)果寫回內(nèi)存),有些平臺里,前兩步會合并成一步,某些指令也不會有取數(shù)或者回寫的過程。
再提一下CPU主頻的概念:首先,主頻絕對不等于一秒鐘可以執(zhí)行的指令個數(shù),每個指令的執(zhí)行成本是不同的,比如x86平臺里匯編指令I(lǐng)NC就比ADD要快,具體每個指令的時鐘周期可以參考intel的手冊。
為什么要提主頻?因?yàn)樯厦娴膱?zhí)行過程中,每個操作都需要占用一個時鐘周期,對于一個操作內(nèi)存的加法,就需要5個時鐘周期,換句話說,500Mhz主頻的CPU,最多執(zhí)行100MHz條指令。
仔細(xì)觀察,上面的步驟里不包括寄存器操作,對于CPU來說讀/寫寄存器是不需要時間的,或者說如果只是操作寄存器(比如類似mov BX,AX之類的操作),那么一秒鐘執(zhí)行的指令個數(shù)理論上說就等于主頻,因?yàn)榧拇嫫魇荂PU的一部分。
然后寄存器往下就是各級的cache,有L1 cache,L2,甚至有L3的,以及TLB這些(TLB也可以認(rèn)為是cache),之后就是內(nèi)存,前面說寄存器快,現(xiàn)在說為什么這些慢:
對于各級的cache,訪問速度是不同的,理論上說L1cache(一級緩存)有著跟CPU寄存器相同的速度,但L1cache有一個問題,當(dāng)需要同步cache和內(nèi)存之間的內(nèi)容時,需要鎖住cache的某一塊(術(shù)語是cache line),然后再進(jìn)行cache或者內(nèi)存內(nèi)容的更新,這段期間這個cache塊是不能被訪問的,所以L1cache的速度就沒寄存器快,因?yàn)樗鼤l繁的有一段時間不可用。
L1 cache下面是L2 cache,甚至L3 cache,這些都有跟L1 cache一樣的問題,要加鎖,同步,并且L2比L1慢,L3比L2慢,這樣速度也就更低了。
最后說說內(nèi)存,內(nèi)存的主頻現(xiàn)在主流是1333左右吧?或者1600,單位是MHz,這比CPU的速度要低的多,所以內(nèi)存的速度起點(diǎn)就更低,然后內(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,之后解除總線鎖定。

磁盤緩存和內(nèi)存緩存的區(qū)別

內(nèi)存緩存

高速緩存(英語:cache,英語發(fā)音:/k??/ kash [1][2][3],簡稱緩存),其原始意義是指訪問速度比一般隨機(jī)存取存儲器(RAM)快的一種RAM,通常它不像系統(tǒng)主存那樣使用DRAM技術(shù),而使用昂貴但較快速的SRAM技術(shù)。

原理
Cache一詞來源于1967年的一篇電子工程期刊論文。其作者將法語詞“cache”賦予“safekeeping storage”的涵義,用于電腦工程領(lǐng)域。

當(dāng)CPU處理數(shù)據(jù)時,它會先到Cache中去尋找,如果數(shù)據(jù)因之前的操作已經(jīng)讀取而被暫存其中,就不需要再從隨機(jī)存取存儲器(Main memory)中讀取數(shù)據(jù)——由于CPU的運(yùn)行速度一般比主內(nèi)存的讀取速度快,主存儲器周期(訪問主存儲器所需要的時間)為數(shù)個時鐘周期。因此若要訪問主內(nèi)存的話,就必須等待數(shù)個CPU周期從而造成浪費(fèi)。

提供“緩存”的目的是為了讓數(shù)據(jù)訪問的速度適應(yīng)CPU的處理速度,其基于的原理是內(nèi)存中“程序執(zhí)行與數(shù)據(jù)訪問的局域性行為”,即一定程序執(zhí)行時間和空間內(nèi),被訪問的代碼集中于一部分。為了充分發(fā)揮緩存的作用,不僅依靠“暫存剛剛訪問過的數(shù)據(jù)”,還要使用硬件實(shí)現(xiàn)的指令預(yù)測與數(shù)據(jù)預(yù)取技術(shù)——盡可能把將要使用的數(shù)據(jù)預(yù)先從內(nèi)存中取到緩存里。

CPU的緩存曾經(jīng)是用在超級計算機(jī)上的一種高級技術(shù),不過現(xiàn)今電腦上使用的的AMD或Intel微處理器都在芯片內(nèi)部集成了大小不等的數(shù)據(jù)緩存和指令緩存,通稱為L1緩存(L1 Cache即Level 1 On-die Cache,第一級片上高速緩沖存儲器);而比L1更大容量的L2緩存曾經(jīng)被放在CPU外部(主板或者CPU接口卡上),但是現(xiàn)在已經(jīng)成為CPU內(nèi)部的標(biāo)準(zhǔn)組件;更昂貴的CPU會配備比L2緩存還要大的L3緩存(level 3 On-die Cache第三級高速緩沖存儲器)。

概念的擴(kuò)充
如今緩存的概念已被擴(kuò)充,不僅在CPU和主內(nèi)存之間有Cache,而且在內(nèi)存和硬盤之間也有Cache(磁盤緩存),乃至在硬盤與網(wǎng)絡(luò)之間也有某種意義上的Cache──稱為Internet臨時文件夾或網(wǎng)絡(luò)內(nèi)容緩存等。凡是位于速度相差較大的兩種硬件之間,用于協(xié)調(diào)兩者數(shù)據(jù)傳輸速度差異的結(jié)構(gòu),均可稱之為Cache。

地址鏡像與變換
主條目:CPU緩存#組相聯(lián)
由于主存容量遠(yuǎn)大于CPU緩存的容量,因此兩者之間就必須按一定的規(guī)則對應(yīng)起來。地址鏡像就是指按某種規(guī)則把主存塊裝入緩存中。地址變換是指當(dāng)按某種鏡像方式把主存塊裝入緩存后,每次訪問CPU緩存時,如何把主存的物理地址(Physical address)或虛擬地址(Virtual address)變換成CPU緩存的地址,從而訪問其中的數(shù)據(jù)。

緩存置換策略
主條目:CPU緩存#置換策略、分頁和緩存文件置換機(jī)制
主存容量遠(yuǎn)大于CPU緩存,磁盤容量遠(yuǎn)大于主存,因此無論是哪一層次的緩存都面臨一個同樣的問題:當(dāng)容量有限的緩存的空閑空間全部用完后,又有新的內(nèi)容需要添加進(jìn)緩存時,如何挑選并舍棄原有的部分內(nèi)容,從而騰出空間放入這些新的內(nèi)容。解決這個問題的算法有幾種,如最久未使用算法(LRU)、先進(jìn)先出算法(FIFO)、最近最少使用算法(LFU)、非最近使用算法(NMRU)等,這些算法在不同層次的緩存上執(zhí)行時擁有不同的效率和代價,需根據(jù)具體場合選擇最合適的一種。

磁盤緩存

磁盤緩存

16MB緩沖區(qū)的硬盤
磁盤緩存(Disk Buffer)或磁盤快?。―isk Cache)實(shí)際上是將下載到的數(shù)據(jù)先保存于系統(tǒng)為軟件分配的內(nèi)存空間中(這個內(nèi)存空間被稱之為“內(nèi)存池”),當(dāng)保存到內(nèi)存池中的數(shù)據(jù)達(dá)到一個程度時,便將數(shù)據(jù)保存到硬盤中。這樣可以減少實(shí)際的磁盤操作,有效的保護(hù)磁盤免于重復(fù)的讀寫操作而導(dǎo)致的損壞。
磁盤緩存是為了減少CPU透過I/O讀取磁盤機(jī)的次數(shù),提升磁盤I/O的效率,用一塊內(nèi)存來儲存存取較頻繁的磁盤內(nèi)容;因?yàn)閮?nèi)存的存取是電子動作,而磁盤的存取是I/O動作,感覺上磁盤I/O變得較為快速。

相同的技巧可用在寫入動作,我們先將欲寫入的內(nèi)容放入內(nèi)存中,等到系統(tǒng)有其它空閑的時間,再將這塊內(nèi)存的資料寫入磁盤中。

大小
現(xiàn)在的磁盤通常有32MB或64MB緩存。舊的硬盤則有8MB或16MB。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容