轉(zhuǎn)載自文章:https://blog.csdn.net/hellojoy/article/details/54744231
最近在看一些高并發(fā)相關(guān)的內(nèi)容忌傻,總感覺有些地方理解的不對(duì),于是再去看看硬件架構(gòu)方面的知識(shí)搞监,補(bǔ)了補(bǔ)基礎(chǔ)知識(shí)水孩。
以下純轉(zhuǎn)載,這篇文章講的挺好的琐驴。解決了我的很多疑惑俘种。
寄存器是中央處理器內(nèi)的組成部份秤标。寄存器是有限存貯容量的高速存貯部件,它們可用來暫存指令宙刘、數(shù)據(jù)和位址苍姜。在中央處理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序計(jì)數(shù)器(PC)悬包。在中央處理器的算術(shù)及邏輯部件中衙猪,包含的寄存器有累加器(ACC)。
內(nèi)存包含的范圍非常廣布近,一般分為只讀存儲(chǔ)器(ROM)垫释、隨機(jī)存儲(chǔ)器(RAM)和高速緩存存儲(chǔ)器(cache)。
寄存器是CPU內(nèi)部的元件撑瞧,寄存器擁有非常高的讀寫速度饶号,所以在寄存器之間的數(shù)據(jù)傳送非常快季蚂。
Cache :即高速緩沖存儲(chǔ)器茫船,是位于CPU與主內(nèi)存間的一種容量較小但速度很高的存儲(chǔ)器。由于CPU的速度遠(yuǎn)高于主內(nèi)存扭屁,CPU直接從內(nèi)存中存取數(shù)據(jù)要等待一定時(shí)間周期算谈,Cache中保存著CPU剛用過或循環(huán)使用的一部分?jǐn)?shù)據(jù),當(dāng)CPU再次使用該部分?jǐn)?shù)據(jù)時(shí)可從Cache中直接調(diào)用,這樣就減少了CPU的等待時(shí)間,提高了系統(tǒng)的效率料滥。Cache又分為一級(jí)Cache(L1
Cache)和二級(jí)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ì)算機(jī)的存儲(chǔ)體系(Memory hierarchy)金字塔:
-
其次我們看看一個(gè)計(jì)算機(jī)的存儲(chǔ)體系
Register
寄存器是CPU的內(nèi)部組成單元,是CPU運(yùn)算時(shí)取指令和數(shù)據(jù)的地方鲸匿,速度很快,寄存器可以用來暫存指令阻肩、數(shù)據(jù)和地址带欢。在CPU中,通常有通用寄存器烤惊,如指令寄存器IR乔煞;特殊功能寄存器,如程序計(jì)數(shù)器PC柒室、sp等渡贾。
Cache
緩存即就是用于暫時(shí)存放內(nèi)存中的數(shù)據(jù)雄右,若果寄存器要取內(nèi)存中的一部分?jǐn)?shù)據(jù)時(shí)空骚,可直接從緩存中取到纺讲,這樣可以調(diào)高速度。高速緩存是內(nèi)存的部分拷貝府怯。
CPU <--- > 寄存器<--- > 緩存<--- >內(nèi)存
寄存器的工作方式很簡(jiǎn)單刻诊,只有兩步:(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ù)在哪一個(gè)內(nèi)存塊(chunk)上,從該塊讀取數(shù)據(jù)吝沫。
(5)數(shù)據(jù)先送回內(nèi)存控制器呻澜,再送回CPU,然后開始使用惨险。
內(nèi)存的工作流程比寄存器多出許多步羹幸。每一步都會(huì)產(chǎn)生延遲,累積起來就使得內(nèi)存比寄存器慢得多辫愉。
為了緩解寄存器與內(nèi)存之間的巨大速度差異栅受,硬件設(shè)計(jì)師做出了許多努力,包括在CPU內(nèi)部設(shè)置緩存恭朗、優(yōu)化CPU工作方式屏镊,盡量一次性從內(nèi)存讀取指令所要用到的全部數(shù)據(jù)等等。
RAM-memory
即內(nèi)存痰腮,是用于存放數(shù)據(jù)的單元而芥。其作用是用于暫時(shí)存放CPU中的運(yùn)算數(shù)據(jù),以及與硬盤等外部存儲(chǔ)器交換的數(shù)據(jù)诽嘉。
HardDisk
硬盤
一條匯編指令大概執(zhí)行過程是(不是絕對(duì)的蔚出,不同平臺(tái)有差異):
取指(取指令)、譯碼(把指令轉(zhuǎn)換成微指令)虫腋、取數(shù)(讀內(nèi)存里的操作數(shù))、計(jì)算(各種計(jì)算的過程稀余,ALU負(fù)責(zé))悦冀、寫回(將計(jì)算結(jié)果寫回內(nèi)存),有些平臺(tái)里睛琳,前兩步會(huì)合并成一步盒蟆,某些指令也不會(huì)有取數(shù)或者回寫的過程踏烙。
再提一下CPU主頻的概念:首先,主頻絕對(duì)不等于一秒鐘可以執(zhí)行的指令個(gè)數(shù)历等,每個(gè)指令的執(zhí)行成本是不同的讨惩,比如x86平臺(tái)里匯編指令I(lǐng)NC就比ADD要快,具體每個(gè)指令的時(shí)鐘周期可以參考intel的手冊(cè)寒屯。
為什么要提主頻荐捻?因?yàn)樯厦娴膱?zhí)行過程中,每個(gè)操作都需要占用一個(gè)時(shí)鐘周期寡夹,對(duì)于一個(gè)操作內(nèi)存的加法处面,就需要5個(gè)時(shí)鐘周期,換句話說菩掏,500Mhz主頻的CPU魂角,最多執(zhí)行100MHz條指令。
仔細(xì)觀察智绸,上面的步驟里不包括寄存器操作野揪,對(duì)于CPU來說讀/寫寄存器是不需要時(shí)間的,或者說如果只是操作寄存器(比如類似mov BX,AX之類的操作)瞧栗,那么一秒鐘執(zhí)行的指令個(gè)數(shù)理論上說就等于主頻斯稳,因?yàn)榧拇嫫魇荂PU的一部分。
然后寄存器往下就是各級(jí)的cache沼溜,有L1 cache平挑,L2,甚至有L3的系草,以及TLB這些(TLB也可以認(rèn)為是cache)通熄,之后就是內(nèi)存,前面說寄存器快找都,現(xiàn)在說為什么這些慢:
對(duì)于各級(jí)的cache唇辨,訪問速度是不同的,理論上說L1cache(一級(jí)緩存)有著跟CPU寄存器相同的速度能耻,但L1cache有一個(gè)問題赏枚,當(dāng)需要同步cache和內(nèi)存之間的內(nèi)容時(shí),需要鎖住cache的某一塊(術(shù)語是cache line)晓猛,然后再進(jìn)行cache或者內(nèi)存內(nèi)容的更新饿幅,這段期間這個(gè)cache塊是不能被訪問的,所以L1cache的速度就沒寄存器快戒职,因?yàn)樗鼤?huì)頻繁的有一段時(shí)間不可用栗恩。
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)存請(qǐng)求绩社,先要給一個(gè)信號(hào)說“我要訪問數(shù)據(jù)了摔蓝,你忙不忙?”如果此時(shí)內(nèi)存忙愉耙,則通信需要等待贮尉,不忙的時(shí)候,通信才能正常朴沿。并且猜谚,這個(gè)請(qǐng)求信號(hào)的時(shí)間代價(jià),就是夠執(zhí)行幾個(gè)匯編指令了赌渣,所以魏铅,這是內(nèi)存慢的一個(gè)原因。
另一個(gè)原因是:內(nèi)存跟CPU之間通信的通道也是有限的坚芜,就是所謂的“總線帶寬”览芳,但,要記住這個(gè)帶寬不僅僅是留給內(nèi)存的鸿竖,還包括顯存之類的各種通信都要走這條路沧竟,并且由于路是共享的,所以任何請(qǐng)求發(fā)起之間都要先搶占缚忧,搶占帶寬需要時(shí)間悟泵,帶寬不夠等待的話也需要時(shí)間。
以上兩條加起來導(dǎo)致了CPU訪問內(nèi)存更慢闪水,比cache還慢魁袜。
舉個(gè)更容易懂的例子:
CPU要取寄存器AX的值,只需要一步:把AX給我拿來敦第,AX就拿來了峰弹。
CPU要取L1 cache的某個(gè)值,需要1-3步(或者更多):把某某cache行鎖住芜果,把某個(gè)數(shù)據(jù)拿來鞠呈,解鎖,如果沒鎖住就慢了右钾。
CPU要取L2 cache的某個(gè)值蚁吝,先要到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)存讀請(qǐng)求惯裕,等待回應(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]猜煮,簡(jiǎn)稱緩存),其原始意義是指訪問速度比一般隨機(jī)存取存儲(chǔ)器(RAM)快的一種RAM败许,通常它不像系統(tǒng)主存那樣使用DRAM技術(shù)王带,而使用昂貴但較快速的SRAM技術(shù)。
原理
Cache一詞來源于1967年的一篇電子工程期刊論文市殷。其作者將法語詞“cache”賦予“safekeeping storage”的涵義愕撰,用于電腦工程領(lǐng)域。
當(dāng)CPU處理數(shù)據(jù)時(shí),它會(huì)先到Cache中去尋找搞挣,如果數(shù)據(jù)因之前的操作已經(jīng)讀取而被暫存其中带迟,就不需要再從隨機(jī)存取存儲(chǔ)器(Main memory)中讀取數(shù)據(jù)——由于CPU的運(yùn)行速度一般比主內(nèi)存的讀取速度快,主存儲(chǔ)器周期(訪問主存儲(chǔ)器所需要的時(shí)間)為數(shù)個(gè)時(shí)鐘周期囱桨。因此若要訪問主內(nèi)存的話仓犬,就必須等待數(shù)個(gè)CPU周期從而造成浪費(fèi)。
提供“緩存”的目的是為了讓數(shù)據(jù)訪問的速度適應(yīng)CPU的處理速度舍肠,其基于的原理是內(nèi)存中“程序執(zhí)行與數(shù)據(jù)訪問的局域性行為”搀继,即一定程序執(zhí)行時(shí)間和空間內(nèi),被訪問的代碼集中于一部分翠语。為了充分發(fā)揮緩存的作用叽躯,不僅依靠“暫存剛剛訪問過的數(shù)據(jù)”,還要使用硬件實(shí)現(xiàn)的指令預(yù)測(cè)與數(shù)據(jù)預(yù)取技術(shù)——盡可能把將要使用的數(shù)據(jù)預(yù)先從內(nèi)存中取到緩存里肌括。
CPU的緩存曾經(jīng)是用在超級(jí)計(jì)算機(jī)上的一種高級(jí)技術(shù)点骑,不過現(xiàn)今電腦上使用的的AMD或Intel微處理器都在芯片內(nèi)部集成了大小不等的數(shù)據(jù)緩存和指令緩存,通稱為L1緩存(L1 Cache即Level 1 On-die Cache们童,第一級(jí)片上高速緩沖存儲(chǔ)器)畔况;而比L1更大容量的L2緩存曾經(jīng)被放在CPU外部(主板或者CPU接口卡上),但是現(xiàn)在已經(jīng)成為CPU內(nèi)部的標(biāo)準(zhǔn)組件慧库;更昂貴的CPU會(huì)配備比L2緩存還要大的L3緩存(level 3 On-die Cache第三級(jí)高速緩沖存儲(chǔ)器)跷跪。
概念的擴(kuò)充
如今緩存的概念已被擴(kuò)充,不僅在CPU和主內(nèi)存之間有Cache齐板,而且在內(nèi)存和硬盤之間也有Cache(磁盤緩存)吵瞻,乃至在硬盤與網(wǎng)絡(luò)之間也有某種意義上的Cache──稱為Internet臨時(shí)文件夾或網(wǎng)絡(luò)內(nèi)容緩存等。凡是位于速度相差較大的兩種硬件之間甘磨,用于協(xié)調(diào)兩者數(shù)據(jù)傳輸速度差異的結(jié)構(gòu)橡羞,均可稱之為Cache。
地址鏡像與變換
主條目:CPU緩存#組相聯(lián)
由于主存容量遠(yuǎn)大于CPU緩存的容量济舆,因此兩者之間就必須按一定的規(guī)則對(duì)應(yīng)起來卿泽。地址鏡像就是指按某種規(guī)則把主存塊裝入緩存中。地址變換是指當(dāng)按某種鏡像方式把主存塊裝入緩存后滋觉,每次訪問CPU緩存時(shí)签夭,如何把主存的物理地址(Physical address)或虛擬地址(Virtual address)變換成CPU緩存的地址,從而訪問其中的數(shù)據(jù)椎侠。
緩存置換策略
主條目:CPU緩存#置換策略第租、分頁和緩存文件置換機(jī)制
主存容量遠(yuǎn)大于CPU緩存,磁盤容量遠(yuǎn)大于主存我纪,因此無論是哪一層次的緩存都面臨一個(gè)同樣的問題:當(dāng)容量有限的緩存的空閑空間全部用完后慎宾,又有新的內(nèi)容需要添加進(jìn)緩存時(shí)丐吓,如何挑選并舍棄原有的部分內(nèi)容,從而騰出空間放入這些新的內(nèi)容趟据。解決這個(gè)問題的算法有幾種券犁,如最久未使用算法(LRU)、先進(jìn)先出算法(FIFO)之宿、最近最少使用算法(LFU)族操、非最近使用算法(NMRU)等,這些算法在不同層次的緩存上執(zhí)行時(shí)擁有不同的效率和代價(jià)比被,需根據(jù)具體場(chǎng)合選擇最合適的一種。
磁盤緩存
磁盤緩存
16MB緩沖區(qū)的硬盤
磁盤緩存(Disk Buffer)或磁盤快绕貌铡(Disk Cache)實(shí)際上是將下載到的數(shù)據(jù)先保存于系統(tǒng)為軟件分配的內(nèi)存空間中(這個(gè)內(nèi)存空間被稱之為“內(nèi)存池”)等缀,當(dāng)保存到內(nèi)存池中的數(shù)據(jù)達(dá)到一個(gè)程度時(shí),便將數(shù)據(jù)保存到硬盤中娇昙。這樣可以減少實(shí)際的磁盤操作尺迂,有效的保護(hù)磁盤免于重復(fù)的讀寫操作而導(dǎo)致的損壞。
磁盤緩存是為了減少CPU透過I/O讀取磁盤機(jī)的次數(shù)冒掌,提升磁盤I/O的效率噪裕,用一塊內(nèi)存來儲(chǔ)存存取較頻繁的磁盤內(nèi)容;因?yàn)閮?nèi)存的存取是電子動(dòng)作股毫,而磁盤的存取是I/O動(dòng)作膳音,感覺上磁盤I/O變得較為快速。
相同的技巧可用在寫入動(dòng)作铃诬,我們先將欲寫入的內(nèi)容放入內(nèi)存中祭陷,等到系統(tǒng)有其它空閑的時(shí)間,再將這塊內(nèi)存的資料寫入磁盤中趣席。
大小
現(xiàn)在的磁盤通常有32MB或64MB緩存兵志。舊的硬盤則有8MB或16MB。