第一篇:CPU基礎(chǔ)知識(shí)
CPU的英文全稱是(Central ProcessingUnit),中文意思翻譯中央處理器,是計(jì)算機(jī)的主要設(shè)備之一,功能主要是解釋計(jì)算機(jī)指令以及處理計(jì)算機(jī)軟件中的數(shù)據(jù)。計(jì)算機(jī)的可編程性主要是指對(duì)中央處理器的編程。下面就讓小編帶你去看看CPU基礎(chǔ)知識(shí)大全,希望能幫助到大家!
關(guān)于 CPU 的一些基本知識(shí)總結(jié)
CPU是計(jì)算機(jī)的大腦。
1、程序的運(yùn)行過程,實(shí)際上是程序涉及到的、未涉及到的一大堆的指令的執(zhí)行過程。
當(dāng)程序要執(zhí)行的部分被裝載到內(nèi)存后,CPU要從內(nèi)存中取出指令,然后指令解碼(以便知道類型和操作數(shù),簡(jiǎn)單的理解為CPU要知道這是什么指令),然后執(zhí)行該指令。再然后取下一個(gè)指令、解碼、執(zhí)行,以此類推直到程序退出。
2、這個(gè)取指、解碼、執(zhí)行三個(gè)過程構(gòu)成一個(gè)CPU的基本周期。
3、每個(gè)CPU都有一套自己可以執(zhí)行的專門的指令集(注意,這部分指令是CPU提供的,CPU-Z軟件可查看)。
正是因?yàn)椴煌珻PU架構(gòu)的指令集不同,使得__86處理器不能執(zhí)行ARM程序,ARM程序也不能執(zhí)行__86程序。(Intel和AMD都使用__86指令集,手機(jī)絕大多數(shù)使用ARM指令集)。
注:指令集的軟硬件層次之分:硬件指令集是硬件層次上由CPU自身提供的可執(zhí)行的指令集合。軟件指令集是指語言程序庫所提供的指令,只要安裝了該語言的程序庫,指令就可以執(zhí)行。
4、由于CPU訪問內(nèi)存以得到指令或數(shù)據(jù)的時(shí)間要比執(zhí)行指令花費(fèi)的時(shí)間長(zhǎng)很多,因此在CPU內(nèi)部提供了一些用來保存關(guān)鍵變量、臨時(shí)數(shù)據(jù)等信息的通用寄存器。
所以,CPU需要提供 一些特定的指令,使得可以從內(nèi)存中讀取數(shù)據(jù)存入寄存器以及可以將寄存器數(shù)據(jù)存入內(nèi)存。
此外還需要提供加法、減、not/and/or等基本運(yùn)算指令,而乘除法運(yùn)算都是推算出來的(支持的基本運(yùn)算指令參見ALUFunctions),所以乘除法的速度要慢的多。這也是算法里在考慮時(shí)間復(fù)雜度時(shí)常常忽略加減法次數(shù)帶來的影響,而考慮乘除法的次數(shù)的原因。
5、除了通用寄存器,還有一些特殊的寄存器。典型的如:
PC:program counter,表示程序計(jì)數(shù)器,它保存了將要取出的下一條指令的內(nèi)存地址,指令取出后,就會(huì)更新該寄存器指向下一條指令。
堆棧指針:指向內(nèi)存當(dāng)前棧的頂端,包含了每個(gè)函數(shù)執(zhí)行過程的棧幀,該棧幀中保存了該函數(shù)相關(guān)的輸入?yún)?shù)、局部變量、以及一些沒有保存在寄存器中的臨時(shí)變量。
PSW:program statusword,表示程序狀態(tài)字,這個(gè)寄存器內(nèi)保存了一些控制位,比如CPU的優(yōu)先級(jí)、CPU的工作模式(用戶態(tài)還是內(nèi)核態(tài)模式)等。
6、在CPU進(jìn)行進(jìn)程切換的時(shí)候,需要將寄存器中和當(dāng)前進(jìn)程有關(guān)的狀態(tài)數(shù)據(jù)寫入內(nèi)存對(duì)應(yīng)的位置(內(nèi)核中該進(jìn)程的棧空間)保存起來,當(dāng)切換回該進(jìn)程時(shí),需要從內(nèi)存中拷貝回寄存器中。即上下文切換時(shí),需要保護(hù)現(xiàn)場(chǎng)和恢復(fù)現(xiàn)場(chǎng)。
7、為了改善性能,CPU已經(jīng)不是單條取指-->解碼-->執(zhí)行的路線,而是分別為這3個(gè)過程分別提供獨(dú)立的取值單元,解碼單元以及執(zhí)行單元。這樣就形成了流水線模式。
例如,流水線的最后一個(gè)單元——執(zhí)行單元正在執(zhí)行第n條指令,而前一個(gè)單元可以對(duì)第n+1條指令進(jìn)行解碼,再前一個(gè)單元即取指單元可以去讀取第n+2條指令。這是三階段的流水線,還可能會(huì)有更長(zhǎng)的流水線模式。
8、更優(yōu)化的CPU架構(gòu)是superscalar架構(gòu)(超標(biāo)量架構(gòu))。這種架構(gòu)將取指、解碼、執(zhí)行單元分開,有大量的執(zhí)行單元,然后每個(gè)取指+解碼的部分都以并行的方式運(yùn)行。比如有2個(gè)取指+解碼的并行工作線路,每個(gè)工作線路都將解碼后的指令放入一個(gè)緩存緩沖區(qū)等待執(zhí)行單元去取出執(zhí)行。
9、除了嵌入式系統(tǒng),多數(shù)CPU都有兩種工作模式:內(nèi)核態(tài)和用戶態(tài)。這兩種工作模式是由PSW寄存器上的一個(gè)二進(jìn)制位來控制的。
10、內(nèi)核態(tài)的CPU,可以執(zhí)行指令集中的所有指令,并使用硬件的所有功能。
11、用戶態(tài)的CPU,只允許執(zhí)行指令集中的部分指令。一般而言,IO相關(guān)和把內(nèi)存保護(hù)相關(guān)的所有執(zhí)行在用戶態(tài)下都是被禁止的,此外其它一些特權(quán)指令也是被禁止的,比如用戶態(tài)下不能將PSW的模式設(shè)置控制位設(shè)置成內(nèi)核態(tài)。
12、用戶態(tài)CPU想要執(zhí)行特權(quán)操作,需要發(fā)起系統(tǒng)調(diào)用來請(qǐng)求內(nèi)核幫忙完成對(duì)應(yīng)的操作。其實(shí)是在發(fā)起系統(tǒng)調(diào)用后,CPU會(huì)執(zhí)行trap指令陷入(trap)到內(nèi)核。當(dāng)特權(quán)操作完成后,需要執(zhí)行一個(gè)指令讓CPU返回到用戶態(tài)。
13、除了系統(tǒng)調(diào)用會(huì)陷入內(nèi)核,更多的是硬件會(huì)引起trap行為陷入內(nèi)核,使得CPU控制權(quán)可以回到操作系統(tǒng),以便操作系統(tǒng)去決定如何處理硬件異常。
關(guān)于CPU的基本組成1、CPU是用來運(yùn)算的(加法運(yùn)算+、乘法運(yùn)算__、邏輯運(yùn)算and not or等),例如c=a+b。
2、運(yùn)算操作涉及到數(shù)據(jù)輸入(input)、處理、數(shù)據(jù)輸出(output),a和b是輸入數(shù)據(jù),加法運(yùn)算是處理,c是輸出數(shù)據(jù)。
3、CPU需要使用一個(gè)叫做存儲(chǔ)器(也就是各種寄存器)的東西保存輸入和輸出數(shù)據(jù)。以下是幾種常見的寄存器(前文也介紹了一些)
MAR: memory address register,保存將要被訪問數(shù)據(jù)在內(nèi)存中哪個(gè)地址處,保存的是地址值
MDR: memory data register,保存從內(nèi)存讀取進(jìn)來的數(shù)據(jù)或?qū)⒁獙懭雰?nèi)存的數(shù)據(jù),保存的是數(shù)據(jù)值
AC: Accumulator,保存算術(shù)運(yùn)算和邏輯運(yùn)算的中間結(jié)果,保存的是數(shù)據(jù)值
PC: Program Counter,保存下一個(gè)將要被執(zhí)行指令的地址,保存的是地址值
CIR: current instruction register,保存當(dāng)前正在執(zhí)行的指令
4、CPU還要將一些常用的基本運(yùn)算工具(如加法器)放進(jìn)CPU,這部分負(fù)責(zé)運(yùn)算,稱為算術(shù)邏輯單元(ALU, Arithmetic LogicUnit)。
5、CPU中還有一個(gè)控制器(CU, Control Unit),負(fù)責(zé)將存儲(chǔ)器中的數(shù)據(jù)送到ALU中去做運(yùn)算,并將運(yùn)算后的結(jié)果存回到存儲(chǔ)器中。
控制器還包含了一些控制信號(hào)。
5、控制器之所以知道數(shù)據(jù)放哪里、做什么運(yùn)算(比如是做加法還是邏輯運(yùn)算?)都是由指令告訴控制器的,每個(gè)指令對(duì)應(yīng)一個(gè)基本操作,比如加法運(yùn)算對(duì)應(yīng)一個(gè)指令。
6、例如,將兩個(gè)MDR寄存器(保存了來自內(nèi)存的兩個(gè)數(shù)據(jù))中的值拷貝到ALU中,然后根據(jù)指定的操作指令執(zhí)行加法運(yùn)算,將運(yùn)算結(jié)果拷貝會(huì)一個(gè)MDR寄存器中,最后寫入到內(nèi)存。
7、這就是馮諾依曼結(jié)構(gòu)圖,也就是現(xiàn)在計(jì)算機(jī)的結(jié)構(gòu)圖。
關(guān)于CPU的多核和多線程
1、CPU的物理個(gè)數(shù)由主板上的插槽數(shù)量決定,每個(gè)CPU可以有多核心,每核心可能會(huì)有多線程。
2、多核CPU的每核(每核都是一個(gè)小芯片),在OS看來都是一個(gè)獨(dú)立的CPU。
3、對(duì)于超線程CPU來說,每核CPU可以有多個(gè)線程(數(shù)量是兩個(gè),比如1核雙線程,2核4線程,4核8線程),每個(gè)線程都是一個(gè)虛擬的邏輯CPU(比如windows下是以邏輯處理器的名稱稱呼的),而每個(gè)線程在OS看來也是獨(dú)立的CPU。
這是欺騙操作系統(tǒng)的行為,在物理上仍然只有1核,只不過在超線程CPU的角度上看,它認(rèn)為它的超線程會(huì)加速程序的運(yùn)行。
4、要發(fā)揮超線程優(yōu)勢(shì),需要操作系統(tǒng)對(duì)超線程有專門的優(yōu)化。
5、多線程的CPU在能力上,比非多線程的CPU核心要更強(qiáng),但每個(gè)線程不足以與獨(dú)立的CPU核心能力相比較。
6、每核上的多線程CPU都共享該核的CPU資源。
例如,假設(shè)每核CPU都只有一個(gè)“發(fā)動(dòng)機(jī)”資源,那么線程1這個(gè)虛擬CPU使用了這個(gè)“發(fā)動(dòng)機(jī)”后,線程2就沒法使用,只能等待。
所以,超線程技術(shù)的主要目的是為了增加流水線(參見前文對(duì)流水線的解釋)上更多個(gè)獨(dú)立的指令,這樣線程1和線程2在流水線上就盡量不會(huì)爭(zhēng)搶該核CPU資源。所以,超線程技術(shù)利用了superscalar(超標(biāo)量)架構(gòu)的優(yōu)點(diǎn)。
7、多線程意味著每核可以有多個(gè)線程的狀態(tài)。比如某核的線程1空閑,線程2運(yùn)行。
8、多線程沒有提供真正意義上的并行處理,每核CPU在某一時(shí)刻仍然只能運(yùn)行一個(gè)進(jìn)程,因?yàn)榫€程1和線程2是共享某核CPU資源的。可以簡(jiǎn)單的認(rèn)為每核CPU在獨(dú)立執(zhí)行進(jìn)程的能力上,有一個(gè)資源是唯一的,線程1獲取了該資源,線程2就沒法獲取。
但是,線程1和線程2在很多方面上是可以并行執(zhí)行的。比如可以并行取指、并行解碼、并行執(zhí)行指令等。所以雖然單核在同一時(shí)間只能執(zhí)行一個(gè)進(jìn)程,但線程1和線程2可以互相幫助,加速進(jìn)程的執(zhí)行。
并且,如果線程1在某一時(shí)刻獲取了該核執(zhí)行進(jìn)程的能力,假設(shè)此刻該進(jìn)程發(fā)出了IO請(qǐng)求,于是線程1掌握的執(zhí)行進(jìn)程的能力,就可以被線程2獲取,即切換到線程2。這是在執(zhí)行線程間的切換,是非常輕量級(jí)的。(WIKI:if resources for one process are not available, then another process cancontinue if its resources are available)
9、多線程可能會(huì)出現(xiàn)一種現(xiàn)象:假如2核4線程CPU,有兩個(gè)進(jìn)程要被調(diào)度,那么只有兩個(gè)線程會(huì)處于運(yùn)行狀態(tài),如果這兩個(gè)線程是在同一核上,則另一核完全空轉(zhuǎn),處于浪費(fèi)狀態(tài)。更期望的結(jié)果是每核上都有一個(gè)CPU分別調(diào)度這兩個(gè)進(jìn)程。
關(guān)于CPU上的高速緩存
1、最高速的緩存是CPU的寄存器,它們和CPU的材料相同,最靠近CPU或最接近CPU,訪問它們沒有時(shí)延(<1ns)。但容量很小,小于1kb。
32bit:32__32比特=128字節(jié)
64bit:64__64比特=512字節(jié)
2、寄存器之下,是CPU的高速緩存。分為L(zhǎng)1緩存、L2緩存、L3緩存,每層速度按數(shù)量級(jí)遞減、容量也越來越大。
3、每核心都有一個(gè)自己的L1緩存。L1緩存分兩種:L1指令緩存(L1-icache)和L1數(shù)據(jù)緩存(L1-dcache)。L1指令緩存用來存放已解碼指令,L1數(shù)據(jù)緩存用來放訪問非常頻繁的數(shù)據(jù)。
4、L2緩存用來存放近期使用過的內(nèi)存數(shù)據(jù)。更嚴(yán)格地說,存放的是很可能將來會(huì)被CPU使用的數(shù)據(jù)。
5、多數(shù)多核CPU的各核都各自擁有一個(gè)L2緩存,但也有多核共享L2緩存的設(shè)計(jì)。無論如何,L1是各核私有的(但對(duì)某核內(nèi)的多線程是共享的)。
操作系統(tǒng)之CPU知識(shí)掃盲
關(guān)于馮·諾依曼結(jié)構(gòu)
馮·諾依曼結(jié)構(gòu)(Von Neumannarchitecture)是一種將程序指令存儲(chǔ)器和數(shù)據(jù)存儲(chǔ)器合并在一起的計(jì)算機(jī)設(shè)計(jì)概念結(jié)構(gòu)。馮·諾依曼結(jié)構(gòu)隱約指導(dǎo)了將存儲(chǔ)設(shè)備與中央處理器分開?的概念,因此依本結(jié)構(gòu)設(shè)計(jì)出的計(jì)算機(jī)又稱存儲(chǔ)程序計(jì)算機(jī),這也是目前大多數(shù)計(jì)算機(jī)設(shè)計(jì)的主要參考原則。
最早的計(jì)算機(jī)器僅內(nèi)含固定用途的程序。現(xiàn)代的某些計(jì)算機(jī)依然維持這樣的設(shè)計(jì)方式,通常是為了簡(jiǎn)化或教育目的。例如一個(gè)計(jì)算器僅有固定的數(shù)學(xué)計(jì)算程序,它不能拿來當(dāng)作文字處理軟件,更不能拿來玩游戲。若想要改變此機(jī)器的程序,你必須更改線路、更改結(jié)構(gòu)甚至重新設(shè)計(jì)此機(jī)器。當(dāng)然最早的計(jì)算機(jī)并沒有設(shè)計(jì)的那么可編程。當(dāng)時(shí)所謂的“重寫程序”很可能指的是紙筆設(shè)計(jì)程序步驟,接著制訂工程細(xì)節(jié),再施工將機(jī)器的電路配線或結(jié)構(gòu)改變。
而存儲(chǔ)程序型計(jì)算機(jī)的概念改變了這一切。借由創(chuàng)造一組指令集結(jié)構(gòu),并將所謂的運(yùn)算轉(zhuǎn)化成一串程序指令的運(yùn)行細(xì)節(jié),可讓程序運(yùn)行時(shí)自我修改程序的運(yùn)算內(nèi)容,讓此機(jī)器更有彈性。借著將指令當(dāng)成一種特別類型的靜態(tài)數(shù)據(jù),一臺(tái)存儲(chǔ)程序型計(jì)算機(jī)可輕易改變其程序,并在程控下改變其運(yùn)算內(nèi)容。馮·諾伊曼結(jié)構(gòu)與存儲(chǔ)程序型計(jì)算機(jī)是互相通用的名詞。而哈佛結(jié)構(gòu)則是一種將程序數(shù)據(jù)與普通數(shù)據(jù)分開存儲(chǔ)的設(shè)計(jì)概念,但是它并未完全突破馮.諾伊曼架構(gòu)。
CPU執(zhí)行原理
CPU的主要運(yùn)作原理,不論其外觀,都是執(zhí)行儲(chǔ)存于被稱為程序里的一系列指令。在此討論的是遵循普遍的馮·諾伊曼結(jié)構(gòu)(von Neumannarchitecture)設(shè)計(jì)的裝置。程序以一系列數(shù)字儲(chǔ)存在計(jì)算機(jī)存儲(chǔ)器中。差不多所有的馮·諾伊曼CPU的運(yùn)作原理可分為四個(gè)階段:提取、解碼、執(zhí)行和寫回。
(1)提取
從程序內(nèi)存中檢索指令(為數(shù)值或一系列數(shù)值)。由程序計(jì)數(shù)器指定程序存儲(chǔ)器的位置,程序計(jì)數(shù)器保存供識(shí)別目前程序位置的數(shù)值。換言之,程序計(jì)數(shù)器記錄了CPU在目前程序里的蹤跡。提取指令之后,PC根據(jù)指令式長(zhǎng)度增加存儲(chǔ)器單元[iwordlength]。指令的提取常常必須從相對(duì)較慢的存儲(chǔ)器查找,導(dǎo)致CPU等候指令的送入。這個(gè)問題主要被論及在現(xiàn)代處理器的緩存和管線化架構(gòu)。
(2)解碼
CPU根據(jù)從存儲(chǔ)器提取到的指令來決定其執(zhí)行行為。在解碼階段,指令被拆解為有意義的片斷。根據(jù)CPU的指令集架構(gòu)(ISA)定義將數(shù)值解譯為指令[isa]。一部分的指令數(shù)值為運(yùn)算碼,其指示要進(jìn)行哪些運(yùn)算。其它的數(shù)值通常供給指令必要的信息
(3)執(zhí)行
在提取和解碼階段之后,接著進(jìn)入執(zhí)行階段。該階段中,連接到各種能夠進(jìn)行所需運(yùn)算的CPU部件。例如,要求一個(gè)加法運(yùn)算,算術(shù)邏輯單元將會(huì)連接到一組輸入和一組輸出。輸入提供了要相加的數(shù)值,而且在輸出將含有總和結(jié)果。ALU內(nèi)含電路系統(tǒng),以于輸出端完成簡(jiǎn)單的普通運(yùn)算和邏輯運(yùn)算(比如加法和比特運(yùn)算)。如果加法運(yùn)算產(chǎn)生一個(gè)對(duì)該CPU處理而言過大的結(jié)果,在標(biāo)志寄存器里,溢出標(biāo)志可能會(huì)被設(shè)置
(4)寫回
最終階段,寫回,以一定格式將執(zhí)行階段的結(jié)果簡(jiǎn)單的寫回。運(yùn)算結(jié)果經(jīng)常被寫進(jìn)CPU內(nèi)部的寄存器,以供隨后指令快速訪問。在其它案例中,運(yùn)算結(jié)果可能寫進(jìn)速度較慢,如容量較大且較便宜的主存
注意,這上面的4個(gè)階段與我們編寫程序是非常相關(guān)的,但編程語言里面可能會(huì)簡(jiǎn)化,并把2和3階段合并,分為:加載,處理,寫回。在多線程編程里面,了解這幾個(gè)概念至關(guān)重要,由此可以延伸,數(shù)據(jù)從哪里加載,在哪里執(zhí)行,最后結(jié)果又寫回了哪里。指令數(shù)據(jù)一般從內(nèi)存里面加載,但是內(nèi)存的訪問時(shí)間,相比cpu慢了n多倍,所以為了加速處理,cpu一般把指令給加載到離cpu更近的寄存器里面,或者是L1,L2,L3的cache來提速,最終計(jì)算出來的結(jié)果,還要寫回內(nèi)存。正是因?yàn)閏pu執(zhí)行指令復(fù)雜,所以這里面其實(shí)牽扯到很多問題,比如多個(gè)線程如何協(xié)作處理任務(wù),以及如何保證程序數(shù)據(jù)的原子性,有序性,可見性。而這正是Java的內(nèi)存模型出現(xiàn)的意義。在其他不同的編程語言里面其實(shí)都有在操作系統(tǒng)之上抽象的內(nèi)存模型來應(yīng)對(duì)不同的cpu架構(gòu)的的差異,這一點(diǎn)需要注意。
多個(gè)單核CPU vs 單個(gè)多核CPU
多個(gè)單核CPU:
成本更高,因?yàn)槊總€(gè)CPU都需要一定的線路電路支持,這樣對(duì)主板上布局布線極為不便。并且當(dāng)運(yùn)行多線程任務(wù)時(shí),多線程間通信協(xié)同合作也是一個(gè)問題。依賴總線的傳輸,速度較慢,且每一個(gè)線程因?yàn)檫\(yùn)行在不同的CPU上。導(dǎo)致不同線程間各開一個(gè)Cache,會(huì)造成資源的浪費(fèi),同時(shí)如果線程間協(xié)作就會(huì)有冗余數(shù)據(jù)的產(chǎn)生,更加大了內(nèi)存的開銷。
單個(gè)多核CPU:
可以很好地規(guī)避基本上多個(gè)單核CPU提到的所有缺點(diǎn)。他不需要考慮硬件上的開銷以及復(fù)雜性問題,同時(shí)也可以很好地解決多線程間協(xié)同工作的問題,減少內(nèi)存的開銷,因?yàn)槎嗑€程程序在多核CPU中運(yùn)行是共用一塊內(nèi)存區(qū)的,數(shù)據(jù)的傳輸速度比總線來的要快同時(shí)不會(huì)有冗余數(shù)據(jù)的產(chǎn)生。單個(gè)多核CPU的問題也是顯而易見的,假設(shè)倆大程序,每一個(gè)程序都好多線程還幾乎用滿cache,它們分時(shí)使用CPU,那在程序間切換的時(shí)候,光指令和數(shù)據(jù)的替換就是個(gè)問題。
單個(gè)多核cpu已經(jīng)成為個(gè)人計(jì)算機(jī)的主流配置,多個(gè)多核的cpu在一些大型的服務(wù)器里面也很常見。
超線程
“超線程”(HyperthreadingTechnology)技術(shù)就是通過采用特殊的硬件指令,可以把兩個(gè)邏輯內(nèi)核模擬成兩個(gè)物理超線程芯片,在單處理器中實(shí)現(xiàn)線程級(jí)的并行計(jì)算,同時(shí)在相應(yīng)的軟硬件的支持下大幅度的提高運(yùn)行效能,從而使單處理器上模擬雙處理器的效能。其實(shí),從實(shí)質(zhì)上說,超線程是一種可以將CPU內(nèi)部暫時(shí)閑置處理資源充分“調(diào)動(dòng)”起來的技術(shù)。
每個(gè)單位時(shí)間內(nèi),CPU只能處理一個(gè)線程,以這樣的單位進(jìn)行,如果想要在單位時(shí)間內(nèi)處理超過一個(gè)的線程,是不可能的,除非是有兩個(gè)核心處理單元,英特爾的HT技術(shù)便是以單個(gè)核心處理單元,去整合兩個(gè)邏輯處理單元,也就是一個(gè)實(shí)體核心,兩個(gè)邏輯核心,在單位時(shí)間內(nèi)處理兩個(gè)線程,模擬雙核心運(yùn)作。
簡(jiǎn)單的說,超線程就是在單個(gè)core中,模擬出兩個(gè)邏輯處理單元,以此能夠提高程序執(zhí)行的并發(fā)能力,提高系統(tǒng)cpu資源的利用率。
至此,關(guān)于CPU的個(gè)數(shù),核數(shù),邏輯CPU的個(gè)數(shù)計(jì)算關(guān)系如下:
(1)總核數(shù) = 物理CPU個(gè)數(shù) __ 每顆物理CPU的核數(shù)
(2)總邏輯CPU數(shù) = 物理CPU個(gè)數(shù) __ 每顆物理CPU的核數(shù) __ 超線程數(shù)
一些概念解釋如下:
舉例,在一個(gè)Mac Pro的機(jī)器上,可以通過關(guān)于本機(jī),系統(tǒng)報(bào)告選項(xiàng)中,看到當(dāng)前系統(tǒng)的基本配置情況,如下:
比如上面的信息中,顯示了當(dāng)前的系統(tǒng)物理上只擁有一個(gè)cpu,但是這個(gè)cpu有4個(gè)核。然后,我們查詢其邏輯cpu的個(gè)數(shù),會(huì)發(fā)現(xiàn)顯示是8個(gè):(在Mac上打開活動(dòng)監(jiān)視器,然后雙擊最下面的中間的cpu負(fù)載的地方,就可以看到)
這就是因?yàn)槊總€(gè)核又有2個(gè)超線程,所以8個(gè)邏輯cpu個(gè)數(shù)=1物理cpu個(gè)數(shù) __ 4核 __2個(gè)超線程,最終也就是說如果我要編寫一個(gè)多線程計(jì)算密集型的程序任務(wù),起的線程數(shù)可以以邏輯cpu的個(gè)數(shù)作為參照。當(dāng)然如果是io密集型的任務(wù),可以開的更多一點(diǎn)。
CPU性能參數(shù)
計(jì)算機(jī)的性能在很大程度上由CPU的性能決定,而CPU的性能主要體現(xiàn)在其運(yùn)行程序的速度上。影響運(yùn)行速度的性能指標(biāo)包括CPU的工作頻率、Cache容量、指令系統(tǒng)和邏輯結(jié)構(gòu)等參數(shù)。
大多數(shù)情況下,我們主要關(guān)注的是CPU的主頻,也稱時(shí)鐘頻率,是指同步電路中時(shí)鐘的基礎(chǔ)頻率,它以“每秒時(shí)鐘周期”(clock cycles persecond)來度量,單位是兆赫(MHz)或千兆赫(GHz)用來表示CPU的運(yùn)算、處理數(shù)據(jù)的速度。通常,主頻越高,CPU處理數(shù)據(jù)的速度就越快。
在上面的mac的參數(shù)里面,我們能夠看到在Intel Core i7處理器下,主頻是2.2 GHz,當(dāng)前主頻高的處理器也在4GHz之內(nèi),其主要原因主要在于散熱,提高主頻超過一定范圍后熱密度急速提高,很不經(jīng)濟(jì),也造成散熱困難。
總結(jié)
本文主要介紹了計(jì)算機(jī)操作系統(tǒng)中CPU有關(guān)的知識(shí),計(jì)算機(jī)的核心就在于CPU,了解CPU相關(guān)的知識(shí),可以讓我們更清楚我們的程序底層執(zhí)行的過程,從而寫出更健壯的代碼及調(diào)優(yōu)相關(guān)的程序。
CPU科普知識(shí)
CPU歷來都是一個(gè)高大上的話題,普通吃瓜群眾除了CPU越貴越好之外,可能就一無所知了。曾經(jīng)小編對(duì)于CPU也是一頭霧水,后來請(qǐng)教了很多大神,又查閱了很多資料,才粗略地搞明白了一點(diǎn)。在此,小編就按照自己的理解,盡量用最通俗的語言去撕開CPU神秘的面紗,讓更多人能夠明白CPU。
CPU的中文翻譯叫中央處理器,好吧,這其實(shí)只是一句廢話,不過為了這個(gè)牛逼的翻譯,我們也給它一個(gè)牛逼的比喻,那我們就把CPU比喻成一個(gè)國(guó)家的中央機(jī)構(gòu),接下來我們一一對(duì)應(yīng)打比喻講解。
影響CPU性能的主要因素可以分為兩大塊:主頻和架構(gòu)。這里看不懂不要緊,接下來聽小編為你一一解釋就懂了。
主頻我們可以理解為中央部門的工作能力,架構(gòu)可以理解為國(guó)家的管理制度,主要用于協(xié)調(diào)中央機(jī)構(gòu)各部門之間的工作。所以整個(gè)中央機(jī)構(gòu)的工作效率(CPU性能)主要就是受到這兩個(gè)方面的影響。工作能力越高各部門之間協(xié)調(diào)越好,整體工作效率自然就越高。反之,任何一方面不夠好,都會(huì)對(duì)整體工作效率造成明顯的影響。
我們知道市面上最大的PC處理器主要由兩大品牌Intel和AMD壟斷,而大部分時(shí)間里,Intel都是壓著AMD打的,原因就是因?yàn)锳MD的架構(gòu)不行,雖然主頻對(duì)比Intel不落下風(fēng)甚至稍微領(lǐng)先,但是整體性能卻被Intel徹底壓制了。這就是因?yàn)锳MD的中央機(jī)構(gòu)各部門協(xié)調(diào)能力比Intel差多了,所以即使工作能力差不多,但協(xié)調(diào)不好,所以整體工作性能就比不過了。
說完了性能接下來我們就來說說CPU的結(jié)構(gòu)和工作原理。
CPU的結(jié)構(gòu)主要由運(yùn)算器、控制器、寄存器三大塊組成。
①運(yùn)算器就是中央機(jī)構(gòu)里負(fù)責(zé)執(zhí)行任務(wù)的部門,也就是專門干活的;而控制器就是中央機(jī)構(gòu)的領(lǐng)導(dǎo)小組,針對(duì)不同需要,給運(yùn)算器下達(dá)不同的命令;寄存器可以理解為控制器和運(yùn)算器之間的聯(lián)絡(luò)小組,主要工作就是協(xié)調(diào)控制器和運(yùn)算器。
運(yùn)算器這個(gè)干活的部門,平日里整個(gè)中央機(jī)構(gòu)要干點(diǎn)啥事就找這個(gè)部門。例如東邊洪災(zāi)了,你去賑災(zāi)吧;西邊發(fā)現(xiàn)金礦了,你去主導(dǎo)挖礦吧;北邊下大雪了,你去送溫暖吧;南邊下暴雨了,你去疏導(dǎo)洪流吧……
②而控制器這個(gè)部門比較牛逼,他們是不用干活的,主要就是對(duì)國(guó)家(整部計(jì)算機(jī))發(fā)生的各種情況,做出應(yīng)對(duì),然后讓運(yùn)算器去把活干好。在這里,我們會(huì)發(fā)現(xiàn)一個(gè)大問題:如果這個(gè)部門閑的蛋疼,亂下命令怎么辦?這也好辦,我們就制定出一套行為規(guī)范來限制他們,不讓他們亂搞。而這套行為規(guī)范就是CPU的指令集。
指令集就是CPU的行為規(guī)范,所有的命令都必須嚴(yán)格按照這部行為規(guī)范來執(zhí)行。在這里說明一下不同類型的CPU指令集也不一樣,其中最常見的就是__86架構(gòu)下的復(fù)雜指令集和ARM架構(gòu)下的簡(jiǎn)單指令集。__86就是我們平常電腦CPU的架構(gòu),ARM就是手機(jī)CPU的架構(gòu)。
由于電腦CPU這個(gè)中央機(jī)構(gòu)所在的國(guó)家(電腦)面積大、人口多、國(guó)情復(fù)雜,啥事都會(huì)發(fā)生,所以規(guī)章制度就需要特別完善,考慮到方方面面的情況要怎么應(yīng)對(duì)。而手機(jī)CPU這個(gè)中央機(jī)構(gòu)國(guó)家小、人口少、面積窄,所以規(guī)章制度簡(jiǎn)單一點(diǎn)就可以了。這就是復(fù)雜指令集和簡(jiǎn)單指令集的區(qū)別。
③寄存器這個(gè)部門稍微復(fù)雜一點(diǎn),因?yàn)樗m然沒有運(yùn)算器和控制器那么重要,但是它P事多,控制器平時(shí)總喜歡讓寄存器去給運(yùn)算器傳達(dá)個(gè)命令。而運(yùn)算器有時(shí)候也會(huì)擔(dān)心數(shù)據(jù)太多一時(shí)處理不過來,就讓寄存器幫它先記著,有時(shí)候工作需要紙筆、螺絲刀之類的小工具,也讓寄存器幫它拿著。
了解完寄存器的功能后,又發(fā)現(xiàn)了一個(gè)問題,如果控制部門下達(dá)的命令太多,而運(yùn)算部門又沒那么快可以做完,又或者運(yùn)算器讓它記住的東西或者臨時(shí)拿著的東西太多,寄存器部門太小,人太少,忙不過來怎么辦?好辦,擴(kuò)招人員吧,可是這個(gè)部門的人員都是編制內(nèi)的,沒有在編名額了怎么辦?也好辦,那就招些編外人員吧,也就是我們常說的臨時(shí)工。
招了臨時(shí)工,總要給他個(gè)名號(hào)吧,那就再成立一個(gè)部門,叫高速緩存。為了體現(xiàn)親疏有別,這個(gè)部門把臨時(shí)工分為三個(gè)等級(jí),分別是一級(jí)高速緩存、二級(jí)高速緩存、三級(jí)高速緩存。反正也是臨時(shí)工,名號(hào)就這么隨便叫吧。
在CPU這個(gè)中央機(jī)構(gòu)可跟新聞上說的事給臨時(shí)工做、鍋給臨時(shí)工背不同,在這里高速緩存這個(gè)臨時(shí)工部門是作為寄存器替補(bǔ)而存在的,也是說,必須在寄存器完成不了工作量時(shí),才能交給高速緩存來做。一開始交給一級(jí)高速緩存來做,一級(jí)也做不完再給二級(jí),二級(jí)還做不完就給三級(jí)。這里又有一個(gè)問題出現(xiàn)了,那就是如果三級(jí)也做不完怎么辦?
這完全沒問題,交給中央機(jī)構(gòu)的一個(gè)下屬部門去辦,這個(gè)部門就是內(nèi)存。但是因?yàn)閮?nèi)存畢竟不屬于中央機(jī)構(gòu),工作能力沒有中央機(jī)構(gòu)人員那么強(qiáng),效率也沒有那么高。
所以控制部門要下達(dá)命令或者運(yùn)算部門要做事時(shí),首先想到的就是寄存器,寄存器忙不過來了就找高速緩存幫忙,高速緩存也忙不過來就找內(nèi)存幫忙。那么,內(nèi)存也傳達(dá)不過來呢?內(nèi)存?zhèn)鬟_(dá)不過來那就沒辦法了,只能讓電腦卡著吧,等運(yùn)算部門先把上一件事處理好再說。所以,買電腦,不能光看CPU牛不牛,內(nèi)存容量也要跟上。
還有一個(gè)容易被大家忽略的問題,在這里也說一下吧,那就是晶體管。晶體管是構(gòu)成CPU最基礎(chǔ)的原件,可以理解為整個(gè)中央機(jī)構(gòu)的工作人員。隨著科技的進(jìn)步,CPU生產(chǎn)工藝越來越精細(xì),目前手機(jī)端CPU(ARM架構(gòu))制程已經(jīng)提升到7nm,電腦端也達(dá)到了14nm。
制程的提升,我們可以理解為,縮減每個(gè)辦公人員的辦公面積,以前科技不發(fā)達(dá)每個(gè)辦公人員必須配一個(gè)獨(dú)立辦公室,才能有效完成工作,現(xiàn)在技術(shù)進(jìn)步了,每個(gè)辦公人員只需要一張辦公桌就能完成工作了。所以同樣的一棟大樓,可以容納的辦公人員(晶體管)就多了,工作能力就上升了。
以前一個(gè)CPU由于制程落后,只能容納幾千萬或者幾億個(gè)晶體管,現(xiàn)在制程進(jìn)步了,一個(gè)同樣體積的CPU可以容納幾十億個(gè)晶體管,性能自然就提升了。
那么,為什么晶體管數(shù)量增加了,CPU的能耗卻沒有增加呢?我們可以這么理解,每個(gè)工作人員都需要吃飽了才有力氣干活,以前的工作人員需要吃九菜一湯才夠力氣,現(xiàn)在改為營(yíng)養(yǎng)配餐了,每個(gè)工作人員只需要吃一片營(yíng)養(yǎng)藥丸就可以工作了,所以工作人員雖然增加了,但是整體伙食成本(耗電量)并沒有增加。
最后,我們說一下CPU的核心和進(jìn)程又是什么呢?我們可以這么理解,在單核時(shí)代,每個(gè)CPU只有一個(gè)核心,也就是只有一個(gè)中央機(jī)構(gòu),但是國(guó)家那么大,事那么多,中央機(jī)構(gòu)每天加班25個(gè)小時(shí)都忙不完了。那就沒辦法了,擴(kuò)充中央機(jī)構(gòu)吧。于是乎雙核、四核、多核CPU就出來了。每一個(gè)核心都是一個(gè)獨(dú)立的中央機(jī)構(gòu),都具有相同的工作能力。
這么多個(gè)中央機(jī)構(gòu)成立了,那聽誰的,有事情交給哪個(gè)中央機(jī)構(gòu)去做,要知道它們的權(quán)利和功能都是一樣的啊。這時(shí)候就要改變CPU架構(gòu)了,也就是國(guó)家的管理制度了。以前國(guó)家只有一個(gè)中央機(jī)構(gòu),啥事都交給它去做準(zhǔn)沒錯(cuò),現(xiàn)在突然變成好幾個(gè)中央機(jī)構(gòu)了,怎么辦?
這個(gè)時(shí)候就需要為每個(gè)核心安排去負(fù)責(zé)不同的事務(wù)了,這套中央機(jī)構(gòu)專門負(fù)責(zé)農(nóng)業(yè),那套負(fù)責(zé)工業(yè),剩下的負(fù)責(zé)稅收、財(cái)政等等之類的。
那什么是進(jìn)程呢,進(jìn)程其實(shí)可以理解為一個(gè)中央機(jī)構(gòu)里面的人員組成。有時(shí)候事太多了,光這幾個(gè)中央機(jī)構(gòu)處理起來還是有點(diǎn)吃力,但是為了節(jié)約成本,我們不能再組建新的中央機(jī)構(gòu)了,那就只好折中處理,不另外成立新的中央機(jī)構(gòu)了,就在原有的基礎(chǔ)上,每個(gè)中央機(jī)構(gòu)組建兩套完全一致的工作班子吧。
所以,4核CPU就是擁有四個(gè)獨(dú)立的中央機(jī)構(gòu),都具備相同的工作能力和權(quán)限,但是每個(gè)核心都會(huì)負(fù)責(zé)不同的事務(wù)。4核8線程就是四個(gè)獨(dú)立的中央機(jī)構(gòu),每一個(gè)中央機(jī)構(gòu)都擁有兩套完整的工作班子,每套工作班子權(quán)限也一樣。
這時(shí)候問題又出現(xiàn)了,例如某個(gè)中央機(jī)構(gòu)負(fù)責(zé)的事特別多,忙不過來,而其他的中央機(jī)構(gòu)負(fù)責(zé)的事很少,閑的發(fā)慌,那怎么辦?這時(shí)候,我們的架構(gòu)又出現(xiàn)了,好辦!今天你這個(gè)核心負(fù)責(zé)的事多,就你來主導(dǎo),讓其他事少的核心輔助你工作。明天另外一個(gè)核心負(fù)責(zé)的事多,就由它來主導(dǎo),其他核心輔助它工作。
在這里小編想起來一個(gè)網(wǎng)上很火的段子:MTK的CPU一核有難九核圍觀。這就是架構(gòu)落后造成的,它的管理制度不完善,沒辦法調(diào)節(jié)每個(gè)中央機(jī)構(gòu)之間的互相配合,有事情要做,往死里用一個(gè)核心,其他九個(gè)核心啥事沒有,只好吃瓜圍觀了。
所以,在最后,重申一遍,CPU架構(gòu)很重要!!
第二篇:CPU基礎(chǔ)知識(shí)拓展
CPU 的全稱是 Central Processing Unit,它是你的電腦中最硬核的組件,這種說法一點(diǎn)不為過。CPU是能夠讓你的計(jì)算機(jī)叫計(jì)算機(jī)的核心組件,但是它卻不能代表你的電腦,CPU與計(jì)算機(jī)的關(guān)系就相當(dāng)于大腦和人的關(guān)系。下面就讓小編帶你去看看CPU基礎(chǔ)知識(shí)拓展,希望能幫助到大家!
程序優(yōu)化:CPU緩存基礎(chǔ)知識(shí)
CPU緩存
CPU緩存(CPUCache)的目的是為了提高訪問內(nèi)存(RAM)的效率,這雖然已經(jīng)涉及到硬件的領(lǐng)域,但它仍然與我們息息相關(guān),了解了它的一些原理,能讓我們寫出更高效的程序,另外在多線程程序中,一些不可思議的問題也與緩存有關(guān)。
現(xiàn)代多核處理器,一個(gè)CPU由多個(gè)核組成,每個(gè)核又可以有多個(gè)硬件線程,比如我們說4核8線程,就是指有4個(gè)核,每個(gè)核2個(gè)線程,這在OS看來就像8個(gè)并行處理器一樣。
CPU緩存有多級(jí)緩存,比如L1, L2, L3等:
L1容量最小,速度最快,每個(gè)核都有L1緩存,L1又專門針對(duì)指令和數(shù)據(jù)分成L1d(數(shù)據(jù)緩存),L1i(指令緩存)。
L2容量比L1大,速度比L1慢,每個(gè)核都有L2緩存。
L3容量最大,速度最慢,多個(gè)核共享一個(gè)L3緩存。
有些CPU可能還有L4緩存,不過不常見;此外還有其他類型的緩存,比如TLB(translation lookasidebuffer),用于物理地址和虛擬地址轉(zhuǎn)譯,這不是我們關(guān)心的緩存。
下圖展示了緩存和CPU的關(guān)系:
Linu__用下面命令可以查看CPU緩存的信息:
$ getconf-a | grep CACHE
LEVEL1_ICACHE_SIZE 32768
LEVEL1_ICACHE_ASSOC 8
LEVEL1_ICACHE_LINESIZE 64
LEVEL1_DCACHE_SIZE 32768
LEVEL1_DCACHE_ASSOC 8
LEVEL1_DCACHE_LINESIZE 64
LEVEL2_CACHE_SIZE 262144
LEVEL2_CACHE_ASSOC 8
LEVEL2_CACHE_LINESIZE 64
LEVEL3_CACHE_SIZE 31457280
LEVEL3_CACHE_ASSOC 20
LEVEL3_CACHE_LINESIZE 64
LEVEL4_CACHE_SIZE 0
LEVEL4_CACHE_ASSOC 0
LEVEL4_CACHE_LINESIZE 0
上面顯示CPU只有3級(jí)緩存,L4都為0。
L1的數(shù)據(jù)緩存和指令緩存分別是32KB;L2為256KB;L3為30MB。
在緩存和主存之間,數(shù)據(jù)是按固定大小的塊傳輸?shù)?該塊稱為緩存行(cache line),這里顯示每行的大小為64Bytes。
ASSOC表示主存地址映射到緩存的策略,這里L(fēng)1,L2是8路組相聯(lián),L3是20路組相聯(lián),等一會(huì)兒再說是什么意思。
緩存結(jié)構(gòu)
一塊CPU緩存可以看成是一個(gè)數(shù)組,數(shù)組元素是緩存項(xiàng)(cache entry),一個(gè)緩存項(xiàng)的內(nèi)容大概是這樣的:
+-------------------------------------------+
| tag | data block(cache line)| flag |
+-------------------------------------------+
data block就是從內(nèi)存中拷貝過來的數(shù)據(jù),也就是我們說的cache line,從上面信息可知大小是64字節(jié)。
tag 保存了內(nèi)存地址的一部分,是用來驗(yàn)證是否緩存命中的。
flag 是一些標(biāo)志位,比如緩存是否失效,寫dirty等等。
實(shí)際上LEVEL1_ICACHE_SIZE這個(gè)數(shù)據(jù),是用data block來算的,并不包括tag和flag占用的大小,比如64 __ 512 =32768,表示LEVEL1_ICACHE_SIZE可以緩存512個(gè)cache line。
緩存首先要解決的問題是:怎么映射內(nèi)存地址和緩存地址?比如CPU要檢查一個(gè)內(nèi)存值是否已經(jīng)緩存,那么它首先要能算出這個(gè)內(nèi)存地址對(duì)應(yīng)的緩存地址,然后才能檢查。
為了解決這個(gè)問題,緩存將內(nèi)存地址分成下面幾個(gè)部分:
+-------------------------------------------+
| tag | inde__ | offset |
+-------------------------------------------+
tag和緩存項(xiàng)中的tag對(duì)應(yīng),用來驗(yàn)證是否緩存命中的。
inde__ 緩存項(xiàng)數(shù)組中的索引。
offset 緩存塊(cacheline)中的偏移,因?yàn)榫彺鎵K是64字節(jié),而內(nèi)存值可能只有4個(gè)字節(jié),一個(gè)緩存塊可以保存多個(gè)連續(xù)的內(nèi)存值。這個(gè)offset實(shí)際上就是指明內(nèi)存值在cacheline中的位置。
直接映射緩存
現(xiàn)在我們舉一個(gè)具體的例子,說明內(nèi)存和緩存是如何映射的:
假如緩存的大小是32768B(32KB),緩存塊大小是64B,那么緩存項(xiàng)數(shù)組就有? 32768?/64=512 個(gè)。
CPU要訪問一個(gè)內(nèi)存地址0__1CAABBDD?,它首先檢查這個(gè)內(nèi)存地址是否在緩存中,檢查過程是這樣的:
內(nèi)存地址的二進(jìn)制形式是(低位在前面):
| tag | inde__ | offset |
0 0 0 1 1 1 0 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 1 1 1 0 1 1 1 0 1
先計(jì)算內(nèi)存在cacheline中的偏移,因?yàn)榫彺鎵K是64字節(jié),那么offset需要占6位(2^6=64),即offset=011101=29。
接著要計(jì)算緩存項(xiàng)的索引,因?yàn)榫彺骓?xiàng)數(shù)組是512個(gè),所以inde__需要占9位(2^9=512),即inde__=011101111=239。
現(xiàn)在我們通過offset和inde__已經(jīng)找到緩存塊的具體位置了,但是因?yàn)閮?nèi)存要遠(yuǎn)比緩存大很多,所以多個(gè)內(nèi)存塊是可以映射到同一個(gè)位置的,怎么判斷這個(gè)緩存塊位置存的就是這個(gè)內(nèi)存的值呢?答案就是tag:內(nèi)存地址去掉inde__和offset的部分,剩下的就是tag=***01=0__3955。
通過inde__找到緩存項(xiàng),比較緩存項(xiàng)中的tag是否與內(nèi)存地址中的tag相同,如果相同表示命中,就直接取緩存塊中的值;如果不同表示未命中,CPU需要將內(nèi)存值拷貝到緩存(替換掉老的)。
這種映射方式就稱為直接映射(Directmapped),它的缺點(diǎn)就是多個(gè)內(nèi)存地址會(huì)映射到同一個(gè)緩存地址,拿上面的內(nèi)存地址來看,只要offset和inde__相同的內(nèi)存地址,就一定會(huì)映射到同一個(gè)地方,比如:
***00 011101111 011101
***10 011101111 011101
***11 011101111 011101
如果同時(shí)訪問上面3個(gè)地址,就會(huì)一直替換緩存的值,也就是一直出現(xiàn)緩存沖突,這可能比沒有緩存還要慢,因?yàn)槌嗽L問內(nèi)存外,還多一個(gè)拷貝內(nèi)存值到緩存的操作。
N路組相聯(lián)
為了解決上面的問題,我試著把緩存項(xiàng)數(shù)組分成2個(gè)數(shù)組(2路),比如分成2個(gè)256的數(shù)組,如下圖所示:
查找過程和上面其實(shí)一樣的:
先通過inde__找到數(shù)組索引,只不過因?yàn)槭?路,所以存在2個(gè)數(shù)組。
然后通過內(nèi)存tag依次比較2個(gè)緩存頂?shù)膖ag,如果其中一個(gè)tag相等,說明這個(gè)數(shù)組緩存命中;如果兩個(gè)都不相等,說明緩存不命中,CPU會(huì)拷貝內(nèi)存值到緩存中,但是現(xiàn)在有2個(gè)位置,要拷貝進(jìn)哪個(gè)呢?我的理解CPU應(yīng)該是隨機(jī)選1路拷貝。
offset這個(gè)其實(shí)無關(guān)緊要,因?yàn)樗莄ache line中的偏移。
那這個(gè)和直接映射相比,好在哪里呢,因?yàn)橐粋€(gè)內(nèi)存值會(huì)隨機(jī)拷貝到2路中的1個(gè),所以緩存沖突(多個(gè)內(nèi)存地址映射到同一個(gè)緩存地址)的概率會(huì)降低一半;如果把緩存項(xiàng)數(shù)組分成4個(gè)數(shù)組,這就是4路組相聯(lián)。
上面LEVEL1_ICACHE_ASSOC的值等于8,表明是8路組相聯(lián)。分組越多,緩存沖突率越低,但是CPU要遍歷的數(shù)組就越多,這是一個(gè)權(quán)衡的問題。
通過觀察也可以發(fā)現(xiàn),其實(shí)直接映射就是1路組相聯(lián)。如果直接分成512個(gè)數(shù)組,那每個(gè)數(shù)組只有1項(xiàng),這種就是全相聯(lián),CPU直接遍歷512個(gè)數(shù)組,判斷內(nèi)存地址在哪1個(gè)。
緩存分配策略和更新策略:
當(dāng)CPU從內(nèi)存讀數(shù)據(jù)時(shí),如果該數(shù)據(jù)沒有在緩存中(cache miss),CPU會(huì)把數(shù)據(jù)拷貝到緩存。
當(dāng)CPU往內(nèi)存寫數(shù)據(jù)時(shí):
如果緩存缺失,CPU會(huì)先從內(nèi)存拷貝數(shù)據(jù)到緩存,然后再更新緩存的數(shù)據(jù)。
CPU更新緩存數(shù)據(jù),也可能有多個(gè)策略:
直接寫(write through):更新緩存的數(shù)據(jù),同時(shí)更新內(nèi)存的數(shù)據(jù)。
寫回(write back):只更新緩存的數(shù)據(jù),同時(shí)在緩存項(xiàng)設(shè)置一個(gè)drity標(biāo)志位,內(nèi)存的數(shù)據(jù)只會(huì)在某個(gè)時(shí)刻更新(比如替換cacheline時(shí))。
從上面描述我們知道,當(dāng)我們向一個(gè)內(nèi)存寫數(shù)據(jù)時(shí),內(nèi)存中的數(shù)據(jù)可能不馬上被更新,這個(gè)新數(shù)據(jù)可能還在cacheline呆著。因?yàn)槊總€(gè)核都有自己的緩存,如果CPU不做處理,可以想象一定會(huì)出問題的:比如核1改了數(shù)據(jù),核2去讀同一個(gè)數(shù)據(jù),此時(shí)數(shù)據(jù)還在核1的緩存中,核2讀到的就是老的數(shù)據(jù)。CPU為了處理多核間的緩存同步,那是相當(dāng)?shù)膹?fù)雜。
《裝機(jī)小知識(shí)-CPU篇》
首先給大家講一下,本次內(nèi)容主要給大家普及一下購機(jī)DIY知識(shí),不做深層講述(講了小白也不懂),只求做到簡(jiǎn)單化明了化,給您一個(gè)明確的DIY購機(jī)思路,選擇適合你自己的一臺(tái)電腦,而不是3000進(jìn)吧1萬帶回家用幾年卻只發(fā)揮了2000的性能。
CPU最重要的幾個(gè)參數(shù),制程,架構(gòu),主頻,核心,緩存。以及支持幾代的內(nèi)存和是否有核心顯卡。支持的內(nèi)存肯定是越新越好,內(nèi)存方面的我們?cè)趦?nèi)存一欄詳細(xì)講訴
核心顯卡這里簡(jiǎn)單先講了,目前intel目前最高級(jí)別的核心顯卡UHD630,水平在獨(dú)立顯卡GT730的檔次(略高一點(diǎn))。日常辦公,平面設(shè)計(jì),家庭影音,都沒有問題,DNF,夢(mèng)幻西游,LOL以及各種網(wǎng)頁游戲都能玩。核心顯卡在你使用兩條內(nèi)存組雙通的情況下性能會(huì)有較大提升,所以你想節(jié)約預(yù)算又只玩小型游戲比如LOL就可以考慮組個(gè)雙通內(nèi)存就可以了,可以做到高特效流暢。具體表現(xiàn)可以 點(diǎn)擊此處 觀看測(cè)試視頻(AMD最新一代核顯強(qiáng)于intel核顯)
接下來我們就講CPU最主要的核心參數(shù)。
制程:制程越小代表著同一大小芯片上可以做更多晶體管,提高性能降低功耗(功耗越高耗電越多發(fā)熱量越大,CPU溫度上升性能壽命會(huì)下降,所以功耗很重要),制程越小每個(gè)芯片可以有更多的流水線或者是更多的核心。從第六代酷睿開始intel就一直使用14nm制程工藝,包括最新的9代酷睿,也是14nm的,而AMD二代銳龍是12nm制程工藝,另外可能大家也看到過華為麒麟980宣傳的7nm以及臺(tái)積電公布的突破5nm量產(chǎn)工藝。為什么intel就一直不更新制程工藝,實(shí)際上個(gè)人覺得主要有兩個(gè)方面。
1:intel是自建生產(chǎn)線,只生產(chǎn)自己家產(chǎn)品,如果換制程那么生產(chǎn)線基本要重建,然而14nm的生產(chǎn)線才剛建沒幾年,實(shí)在沒想到芯片制程工藝突破如此迅速。因?yàn)榕_(tái)積電是代工生產(chǎn)芯片,所以他的核心競(jìng)爭(zhēng)力就是要更高端精密的制程工藝,才有更多廠家找他代工。
2:intel得益于自身架構(gòu)的優(yōu)化以及芯片的穩(wěn)定性,即便是14nm制程的芯片功耗也不高。尤其是用在臺(tái)式機(jī)上,中低端主流的i3 i5一般散熱器都能壓住,至于高端超頻系列的CPU,好一點(diǎn)的散熱器也沒有問題。在2017年以前intel在PC芯片都是出于壟斷地位,可能覺得自己不需要這么著急突破,擠擠牙膏就算更新迭代了,所以更新制程帶來的低功耗,高性能在當(dāng)時(shí)的intel看來不是那么急切需要提高,殊不知自己的不思進(jìn)取給了AMD很多的時(shí)間來打一個(gè)翻身仗。。又或者intel早已開發(fā)7nm級(jí)別的PC芯片,只是藏大招沒拿出來而已。不過就這次AMD搶走一半市場(chǎng)以后intel的9代處理器還是14nm,還是加核心的手段看起來又不像有大招。哎神仙打架我們關(guān)切個(gè)什么呢。總之現(xiàn)在,電腦處理器14nm沒有任何問題,不必拿制程說事。
PS:相比PC處理器,手機(jī)處理器就需要更小的制程來達(dá)到高度集成的效果,降低功耗提升性能,增加續(xù)航。所以目前最新制程的處理器都是用在了手機(jī)上面。
架構(gòu):架構(gòu)這個(gè)屬于研發(fā),很復(fù)雜,而且對(duì)裝機(jī)沒有太多的幫助,因?yàn)樾碌腃PU架構(gòu)都是進(jìn)一步優(yōu)化,且產(chǎn)品統(tǒng)一采用的都是新架構(gòu),通常都會(huì)比原架構(gòu)更優(yōu)秀,值得一提的就是intel與AMD雖然都是基于__86指令集研發(fā)的架構(gòu),但是intel比AMD更穩(wěn)定的原因主要就在于架構(gòu)上的優(yōu)勢(shì)(僅限目前,且差距一直在縮小)架構(gòu)其實(shí)是處理器性能非常重要的指標(biāo),只是統(tǒng)一性很高,對(duì)比又很少所以電腦普通用戶沒有必要深究。
主頻(不是越高越好):主頻是直接表現(xiàn)CPU性能的參數(shù)之一,但是以目前的工藝水平,主頻不會(huì)有更大突破,上線基本會(huì)在4G-5GHz,Intel/AMD兩大CPU廠商均將提升性能的手段放在多核心上。主要還是因?yàn)镃PU頻率越高,功耗及發(fā)熱就會(huì)越高,散熱就會(huì)是個(gè)問題,溫度過高壽命及穩(wěn)定性和性能都會(huì)大打折扣。頻率更能反映單核的性能,目前仍然有很多軟件是只支持單線程工作的,所以對(duì)于這類用戶對(duì)頻率的選擇比重更大,比如現(xiàn)在銷量很高的I58400主頻只有2.8Ghz,如果讓它工作只支持單線程的軟件,這個(gè)時(shí)候你會(huì)發(fā)現(xiàn),只有1個(gè)核心占用,剩下的5個(gè)核心占用為0。效果可能還不如i38100的3.6Ghz。
有部分機(jī)友對(duì)于我這個(gè)論斷不滿意,覺得貶低了8400(其實(shí)下文也有為8400正名),這里我主要想表達(dá)的是頻率與單核的關(guān)系,當(dāng)然我自己也忽略了一個(gè)問題就是I38100沒有睿頻,所以部分機(jī)友就拿8400的睿頻來說體驗(yàn)效果是高于8100的,但是兄弟們,你們抓錯(cuò)方向了。
i5 8400 基礎(chǔ)2.8G 睿頻 1核4G 2核3.9G 3核3.9G 4核3.9G 5核3.8G 6核3.8G
這是理論最高值,條件滿足能夠達(dá)到,也的確是比I3 8100強(qiáng),兩款CPU本來也不是一個(gè)檔次的,但是注意用詞,我說的是可能不如I38100,因?yàn)轭nl不可控,板載平臺(tái),供電,散熱,CPU體質(zhì),實(shí)際載荷等等很多都影響著睿頻,也有很多人的8400就是到不了3.8,只有3.2-3.3,你讓他換個(gè)主板還是換個(gè)電源,而且睿頻需要高負(fù)載情況下才有,那非高負(fù)載的程序呢?這樣寫的本質(zhì)是在講述頻率與單核,基礎(chǔ)頻率一樣很重要。請(qǐng)不要忽視。
但是i58400是六核六線程的多核處理器,解決支持多核多線程的軟件即便主頻較低,將處理任務(wù)分?jǐn)偨o多個(gè)核心來工作,那么單核就不需要那么高的性能也能游刃有余的完成任務(wù)。就好比一個(gè)人1秒能算10次,2個(gè)人每人1秒能算7次,對(duì)于支持多線程軟件來說,同樣給你1s我兩個(gè)人可以算14次,而你還是只能10次。如果是只支持單線程的軟件的話,來來來,算10次那個(gè)人,給你發(fā)朵小紅花。
不過雖然8400主頻是2.8GHz但畢竟i5,單核性能也不會(huì)很差,i5 8400總性高出i3 810040%左右。往后發(fā)展游戲多核將更為普遍,各類大型軟件基本也會(huì)往支持多線程開發(fā)。購機(jī)前請(qǐng)先了解自己常用的軟件是否對(duì)單核性能有較高的要求比如PS。如果是小型軟件這些即便只支持單核也可以忽略掉,現(xiàn)在的CPU處理起來都沒有問題。如果你有錢也很任性,選I78700K或者I9 9900K 超到5G大小通吃也是可以的。
關(guān)于頻率選擇,常見的以下幾種,普通用戶就看主頻和睿頻即可。
主頻:CPU工作默認(rèn)頻率。
睿頻:CPU高負(fù)載運(yùn)行下,智能調(diào)節(jié)頻率高于基礎(chǔ)頻率,達(dá)到提高CPU性能的目的(智能可控)
超頻:玩家自己通過主板BIOS設(shè)定CPU頻率和電壓高于基礎(chǔ)頻率或者睿頻頻率,達(dá)到提高CPU性能的目的(超頻有風(fēng)險(xiǎn),燒毀無質(zhì)保,一般超頻到5GHz,好一點(diǎn)的水冷能壓住。極度超頻實(shí)用性不大,降溫成本太高,不少廠商展示的時(shí)候用的都是液氮降溫,只有部分CPU支持超頻比如intel酷睿尾綴代K和AMD銳龍尾綴帶__的。)
核心/線程(不是越多越好):上面講主頻的時(shí)候其實(shí)就已經(jīng)講到核心,總的來說核心要參考單核性能和多核性能,多核雖好,但不一定適合你,還要根據(jù)使用需求,平時(shí)就上網(wǎng)看電影 用辦公軟件啥的買個(gè)I7 8700K也沒什么用,體驗(yàn)基本和i3 8100一樣。如果你喜歡玩大型游戲或者工作上用PS AE PR分析軟件之類的,多核對(duì)你來說就很重要了。核心越多同一時(shí)間數(shù)據(jù)處理能力越強(qiáng)。
超線程:比如8核16線程的I9 9900K相較于8核I7 9700K,前者為擁有超線程技術(shù)的CPU。I79700K處理任務(wù)時(shí),共8核心,一個(gè)核心一條線程,如果任務(wù)沒有占滿核心性能,那么這個(gè)核心剩余性能就閑置了,如果又來一個(gè)任務(wù)就只能用第二顆核心或者等任務(wù)處理完了再進(jìn)行下一個(gè)任務(wù)。I99900K處理任務(wù)時(shí),一個(gè)核心兩條線程,如果任務(wù)沒有占滿核心性能,又來一個(gè)任務(wù),那么就會(huì)用該核心的剩余性能進(jìn)行處理,而不是用第二顆核心來處理,達(dá)到同時(shí)處理更多任務(wù)的目的,提高效率。
超線程是利用特殊的硬件指令一核模擬雙核運(yùn)行,但還是不如雙核來的實(shí)際有用,核心數(shù)量才是性能標(biāo)桿,超線程僅提高了CPU核心的使用效率,不能直接提升核心性能,也就是說如果數(shù)據(jù)計(jì)算已經(jīng)吃滿所有核心那么超不超線程都沒有實(shí)際意義。超線程CPU用在僅支持單線程的程序上可能還達(dá)不到不帶超線程功能的CPU性能,但性能差距也不會(huì)太大。超線程會(huì)大幅提高跑分?jǐn)?shù)據(jù)(跑分沒什么卵用)。
低端的超線程U比如G4560G5400很好用,效果提升顯著,因?yàn)楹诵纳伲€程的話恰好能滿足日常需求,因?yàn)楝F(xiàn)在電腦操作越來越快,同時(shí)下達(dá)的任務(wù)可能會(huì)好幾個(gè)(比如看直播的同時(shí)下載電影然后又在掛游戲,微信,QQ在視頻語音什么的)。以前低端的雙核的CPU現(xiàn)在已經(jīng)不適用了不能同時(shí)處理這么多任務(wù),所以在G4560把超線程用上過后,直接解決了這個(gè)問題,性能及體驗(yàn)直逼i37100價(jià)格卻只有其一半,被大家奉為神U。高端的CPU從酷睿八代或者銳龍1代開始核心就已經(jīng)增多,正常使用情況下6核基本已經(jīng)足夠了,超不超線程的體驗(yàn)差距已經(jīng)不大,高端超線程U比如I78700K9900K在程序游戲多開的情況下效果比較好(這里多開是指同時(shí)開幾個(gè)大型游戲或者幾十個(gè)小型游戲或手游掛機(jī)這種),或者數(shù)據(jù)建模,大型工程分析關(guān)鍵,視頻渲染也是比較占優(yōu)勢(shì)的。
目前大多主流游戲做的都是雙核或者四核處理,新一點(diǎn)的游戲有的做到六核處理,如果你買電腦玩游戲,追求八核十六線程也沒有用,僅有部分核心能用到。游戲體驗(yàn)和i5沒有差別(多開除外)。
緩存(越大越好):緩存是一個(gè)很重要的參考指標(biāo),緩存分一級(jí)緩存 二級(jí)緩存三級(jí)緩存,都集成在CPU上,容量都是越大越好,一級(jí)緩存級(jí)別最高,容量相比最小。CPU緩存相當(dāng)重要,與CPU同頻運(yùn)行,遠(yuǎn)高于內(nèi)存頻率,CPU讀取數(shù)據(jù)時(shí)一級(jí)二級(jí)三級(jí)依次讀取,待三級(jí)緩存都沒有的數(shù)據(jù)才從內(nèi)存中調(diào)取,每級(jí)緩存命中概率都在80%左右,所以要從內(nèi)存調(diào)用的數(shù)據(jù)其實(shí)是很少的,由于緩存速度遠(yuǎn)高于內(nèi)存,所以緩存越大越能在使用過程中存放更多的數(shù)據(jù),降低CPU調(diào)用數(shù)據(jù)的時(shí)間,提高執(zhí)行效率,直接反應(yīng)在使用體驗(yàn)上就是速度快。比如很多朋友升級(jí)CPU過后明顯覺得速度快了很多,用在單核小程序上也是,以為是處理器性能增加的原因,其實(shí)還有很重要的原因是緩存增加了的原因。三級(jí)緩存對(duì)游戲體驗(yàn)效果比較明顯。
這里推薦一下適用于各種需求的CPU
辦公 上網(wǎng) 炒股 影音 家用 2D游戲 頁游 回合游戲
建議1000-1500預(yù)算:G4560G5400的核顯機(jī)就已經(jīng)足夠使用了,單條內(nèi)存4G,配個(gè)固態(tài)提高效率。如果加獨(dú)顯最高加到1050TI這樣級(jí)別的顯卡,玩LOL DOAT 吃雞中檔特效及各類大型游戲也沒有問題。詳細(xì)看此測(cè)評(píng),視頻只看CPU占用,測(cè)評(píng)的是1030和1050,并非1050TI,只是給大家看一下G4560這樣的CPU玩吃雞占用也沒有占滿
如往上升可以加到2000-3000元預(yù)算:I3 8100 I5 84008500酷睿的核顯主機(jī)在組雙通的內(nèi)存的情況下可以做到高特效流暢玩LOL。因CPU的性能大幅閑余所以后期升級(jí)可以直接加一個(gè)高端獨(dú)立顯卡I3+1060,而I5最高建議加到2070,就能玩更高級(jí)的游戲開高特效甚至滿特效。(如果確定后期要升獨(dú)顯,建議再組核顯機(jī)的時(shí)候就把電源配高一點(diǎn)。)
主玩各類網(wǎng)游及各類單機(jī)游戲
建議3000-6000預(yù)算:I3 8100 I5 8400 8500 R5 2600(考慮價(jià)格,排名為推薦先后),獨(dú)顯選1050TI或10606G或同級(jí)別A卡。如果對(duì)大型游戲特效畫質(zhì)要求較高,顯卡可以升到1070TI 或者2070 或者更高,預(yù)算在6000以上。
PS AE PR AI或者工程分析軟件,建模等需要大量數(shù)據(jù)運(yùn)算的工作需求
建議6000-8000預(yù)算:R5 2600__ I5 8600K I5 9600K I5 8500 I79700K(考慮價(jià)格,排名為推薦先后),如若對(duì)游戲需求不大頂多配個(gè)1050TI,充一下4G顯存,內(nèi)存16G起,提高你的工作效率。該級(jí)別處理器也可用于普通直播及LOL直播。預(yù)算充足可往上升R7 2700__ I78700K I9 9900K等。
如主要工作是做視頻,廣告,影視,需頻繁長(zhǎng)時(shí)間渲染高質(zhì)量長(zhǎng)視頻,大型模型應(yīng)力分析軟件,大型網(wǎng)游及單機(jī)游戲直播。
建議1W-1.5W預(yù)算 R7 2700__ I7 8700K I7 8700 I9 9900K(考慮價(jià)格,排名為推薦先后)。
若預(yù)算充足還可以2W以上預(yù)算 升AMD Ryzen ThreadRipper系列或者intel 酷睿I9__系列甚至雙路,因?yàn)榉治鲕浖挠?jì)算需求是沒有上線的。
以上為本人收集知識(shí)編寫推薦,若有不嚴(yán)謹(jǐn)?shù)牡胤竭€請(qǐng)各位多多包涵并提出改正。感謝各位觀看,有不一樣想法的朋友也歡迎留言提出,文明交流。
電腦硬件入門——基礎(chǔ)之CPU架構(gòu)解讀1、9900K整體架構(gòu)
還是先看圖[1]:
9900K整體架構(gòu)圖
9900K大概可以分為5個(gè)部分:
CPU核心:圖中紅框部分為一個(gè)核心,9900K一共有8個(gè)核心。早期的CPU其實(shí)就只有這么一個(gè)東西,但現(xiàn)在的CPU逐步發(fā)展,把一些周邊的部件也集成在同一塊半導(dǎo)體晶片上,因此傳統(tǒng)的CPU就變成了現(xiàn)代CPU上的核心。此外,為了提高CPU的計(jì)算能力,單塊CPU中的核心數(shù)量越來越多,就消費(fèi)級(jí)市場(chǎng)來說,從2005第一款雙核心CPU奔騰D發(fā)布到今天的單塊CPU晶片有8個(gè)核心的i9-9900K。
三級(jí)緩存(Level 3 Cache,簡(jiǎn)寫為L(zhǎng)3、L3$、L3C、L3Cache):圖中中間8個(gè)粉色塊組成的三級(jí)緩存,用于臨時(shí)存放內(nèi)存中的一小部分?jǐn)?shù)據(jù)。這里分成8小塊,對(duì)應(yīng)8個(gè)CPU核心。有時(shí)候L3也叫末級(jí)緩存(LastLevelCache,LLC),當(dāng)然,對(duì)9900K這樣具有三級(jí)緩存的CPU,L3才等同于LLC。有的老式CPU有的只有二級(jí)緩存,LLC就是L2;某些服務(wù)器使用的CPU有四級(jí)緩存,LLC則是指L4。
核心顯卡:圖中左邊紫框部分,這個(gè)以后的文章中我們?cè)俳榻B。
系統(tǒng)代理:圖中右邊綠色部分,這是負(fù)責(zé)連接CPU與其它部件的多個(gè)模塊的集合。從上到下分別是:
顯示控制器:負(fù)責(zé)核心顯卡輸出;
PCI-e控制器:負(fù)責(zé)CPU與外部IO設(shè)備連接,以后的文章我們會(huì)另外介紹;
eDRAM控制器:這個(gè)其實(shí)9900K是沒有的,某些定制型號(hào)會(huì)集成有特殊的內(nèi)存,稱為嵌入式動(dòng)態(tài)隨機(jī)訪問存儲(chǔ)(Embedded DynamicRandom-Access Memory, eDRAM)。一般來說eDRAM是作為核心顯卡的專用顯存使用,這個(gè)控制器就是負(fù)責(zé)從eDRAM讀寫數(shù)據(jù)的。
內(nèi)存控制器:負(fù)責(zé)CPU與內(nèi)存連接,從內(nèi)存中讀寫數(shù)據(jù)。
環(huán)形總線(RingBus):把上面這些模塊連接起來的,上圖中標(biāo)記著Ring的藍(lán)色圈。
2、核心架構(gòu)圖
這張圖看起來很復(fù)雜是不是?不用擔(dān)心,我們一個(gè)一個(gè)說。當(dāng)然,我們這是入門知識(shí),不會(huì)介紹的太細(xì)。
我們上一篇文章提到,現(xiàn)代CPU都是改進(jìn)型哈弗架構(gòu);并且舉了一個(gè)會(huì)計(jì)做財(cái)務(wù)報(bào)告的例子。這里我們繼續(xù)使用這個(gè)例子來介紹。但之前,我們稍微改一下做財(cái)務(wù)報(bào)告的方式,不是一個(gè)人全部做完,我們是一個(gè)團(tuán)隊(duì)。有的同事根據(jù)制作指南列計(jì)算步驟,有的同事根據(jù)計(jì)算步驟在小紙條上列公式,有的同事負(fù)責(zé)從賬本上把數(shù)據(jù)抄到寫好公式的小紙條上,有的同事對(duì)著小紙條用計(jì)算器算數(shù)并且算完了寫回小紙條上,有的同事把小紙條上的數(shù)抄到最終的財(cái)務(wù)報(bào)表上。CPU里面,小紙條有一個(gè)專門的名稱,叫寄存器(Register)。
2.1 緩存子系統(tǒng)(Memory Subsystem)
一家規(guī)模比較大點(diǎn)的企業(yè),完整的賬本很厚。我們做整年的財(cái)務(wù)報(bào)告,通常只需要每個(gè)科目的匯總數(shù)就可以了,為了方便,我們把每個(gè)科目匯總的那幾頁復(fù)印出來放在一起。
完整的財(cái)務(wù)報(bào)告制作指南也很厚,但一個(gè)企業(yè)可能只有其中很少一部業(yè)務(wù)。例如一家軟件公司,就不涉及原材料進(jìn)貨、倉庫存儲(chǔ)之類的業(yè)務(wù);很多公司也沒有貸款、投資之類的業(yè)務(wù)。所以我們也只把跟公司有相關(guān)業(yè)務(wù)的部分復(fù)印出來。
同樣的,內(nèi)存中的數(shù)據(jù)很多,CPU只需要把計(jì)算用到的指令、數(shù)據(jù)放到緩存中——也就是圖中的紫色塊的緩存子系統(tǒng)。
2.2 前端(Front End)
CPU的前端其實(shí)就是我們上篇文章中的控制單元,負(fù)責(zé)對(duì)指令進(jìn)行預(yù)處理。指令預(yù)處理大體上分為取指、預(yù)解碼、融合、解碼、分支預(yù)測(cè)、重排等操作。
取指(Fetch)
我們制作財(cái)務(wù)報(bào)表,第一步就是把制作指南拿出來。CPU也一樣,先把指令載入進(jìn)來。
預(yù)解碼(PreDecode)
制作指南是一整頁的,我們要分解出第一步算哪個(gè)數(shù)據(jù),第二步又是算哪個(gè)數(shù)據(jù),在小紙條上把公式列出來,一張小紙條一個(gè)公式。CPU也一樣,要把程序中一整批的指令數(shù)據(jù),拆分出來第一條是什么指令,第二條是什么指令;可能還需要對(duì)指令進(jìn)行分類標(biāo)志。預(yù)解碼后的指令放在指令隊(duì)列(InstructionQueue)里面。
解碼(Decode),又稱為譯碼
小紙條上的公式寫著:利潤(rùn)=收入-支出,查帳本的同事就需要先把收入和支出數(shù)據(jù)從賬本中找出來,抄到小紙條上。同樣的,CPU碰到類似把內(nèi)存中兩個(gè)數(shù)加起來這樣的指令,需要分解成:
從內(nèi)存載入第一個(gè)數(shù)字;
從內(nèi)存載入第二個(gè)數(shù)字;
兩個(gè)數(shù)字相加
這樣三個(gè)指令。一般來說,我們把原始的指令稱為宏操作(Macro-Operations),分解后的指令稱為微操作(Micro-Operations,μops)。
指令融合(Micro-Fusion/Macro-Fusion)
假設(shè)指南中有一個(gè)數(shù)據(jù)是算平均數(shù)的,某個(gè)按計(jì)算器的同事手上整好有一個(gè)可以直接算平均數(shù)的統(tǒng)計(jì)用計(jì)算器。那么,當(dāng)我們?cè)谥改现锌吹揭粭l類似
這樣的公式的時(shí)候,我們可以直接列算這幾個(gè)數(shù)的平均數(shù)公式,注明給這位同事算。CPU也一樣,某些指令是可以融合起來執(zhí)行的,例如:
比較A和B的大小;
如果A不等于B,跳轉(zhuǎn)到標(biāo)志__的指令。
可以用一條指令JNEA,B,__來代替,這樣的處理稱之為指令融合。指令解碼前的宏操作融合,稱為Macro-Fusion,解碼后的微操作融合,稱為Micro-Fusion。
分支預(yù)測(cè)(Branch Prediction)
理論上,制作指南中列出的所有步驟,我們都要完成上面的這些處理。但假設(shè)制作指南中說,盈利的話要算某幾個(gè)數(shù)據(jù),虧損的話這幾個(gè)數(shù)不用算,要另外算其它幾個(gè)數(shù)據(jù)。當(dāng)我們計(jì)算過第一季度的數(shù)據(jù)知道企業(yè)第一季度是盈利的,我們算第二季度的數(shù)據(jù)時(shí),想偷懶就直接跳過虧損要算的那幾個(gè)數(shù)據(jù)的處理了。CPU處理指令也是一樣的,負(fù)責(zé)預(yù)測(cè)的模塊叫分支預(yù)測(cè)器(BranchPredictor)
當(dāng)然,如果算下來我們發(fā)現(xiàn)第二季度虧損了,還是要重新處理指南上的這些計(jì)算步驟。CPU也一樣。
指令重排,或者叫亂序執(zhí)行(Out-Of-Order,OOO),或者動(dòng)態(tài)執(zhí)行(Dynamic E__ecution)
事實(shí)上,我們不一定要完全按照指南上的步驟第一步算什么,第二步算什么這樣算。只要公式列出來,數(shù)據(jù)抄出來了,就可以直接交給按計(jì)算器的同事去算。所以可能第一步要用的數(shù)據(jù)不太好找,按計(jì)算器的同事就先把第二步算出來了。
當(dāng)然,這里有一個(gè)前提,就是算第二步的時(shí)候,不需要用到第一步的計(jì)算結(jié)果。
2.3 執(zhí)行單元(E__ecution Engine)
執(zhí)行單元也就是上一篇文章提到的運(yùn)算單元了。也就是我們這個(gè)團(tuán)隊(duì)里抄數(shù)據(jù)、按計(jì)算器的各位同事了。其中,按計(jì)算器的同事中,有的用的計(jì)算器簡(jiǎn)單點(diǎn),只能做四則計(jì)算,還只能算整數(shù);有的用高級(jí)點(diǎn)的計(jì)算器,可以算小數(shù);有的用統(tǒng)計(jì)專用的計(jì)算器;有的用更高級(jí)的可以算很多函數(shù)的計(jì)算器。當(dāng)然,有這么多不同的計(jì)算器,什么樣的小紙條給哪位同事用,我們也需要有一個(gè)人來做分配小紙條這件事情。
數(shù)據(jù)存取單元(Load Data/Store Data)
CPU里面也一樣,有負(fù)責(zé)從緩存子系統(tǒng)中載入數(shù)據(jù)的Load Data單元;有把計(jì)算結(jié)果寫回去緩存子系統(tǒng)的Store Data單元。
計(jì)算單元
CPU里面負(fù)責(zé)具體計(jì)算的,根據(jù)計(jì)算類型、計(jì)算的數(shù)據(jù)不同,有多種計(jì)算單元:
整數(shù)算術(shù)邏輯單元(Integer Arithmetic Logic Unit,IntALU),算整數(shù)加減法/二進(jìn)制運(yùn)算;需要說明一下的,電腦里面很多小數(shù)計(jì)算也是通過移位操作處理后,用整數(shù)單元計(jì)算后再數(shù)小數(shù)位這樣的方式來處理的。
整數(shù)乘法器(Integer Multiplier,Int MUL),專門負(fù)責(zé)整數(shù)乘法的;
整數(shù)除法器(Integer Divider,Int DIV),專門負(fù)責(zé)整數(shù)除法的;
分支處理(Branch),負(fù)責(zé)各種跳轉(zhuǎn)指令的;
地址生成器(Address GenerationUnit,AGU),這個(gè)稍微解釋一下,例如制作指南中說,總收入要和上一的總收入對(duì)比算增長(zhǎng)率,那么就需要翻譯成“現(xiàn)在做2018年的年報(bào),上一就是2017總收入”。CPU也是一樣,有的指令是把內(nèi)存地址A1的數(shù)和A1后面第五個(gè)地址的數(shù)相加,那么要先算出來A1后面五個(gè)地址A2到底是哪個(gè)地址。
整數(shù)向量ALU(Int Vect ALU),向量是指類似空間坐標(biāo)+值(__,y,z,value)這樣的一組數(shù)據(jù),其中__、y、z和value都是整數(shù)。類似整數(shù),除了算加減法/二進(jìn)制的整數(shù)向量ALU,還有整數(shù)向量乘法器、除法器(Int VectMUL,Int Vect DIV)。
浮點(diǎn)向量加乘融合單元(Fused multiply–add,F(xiàn)P FMA),這個(gè)也要解釋一下。我們知道,105可以寫成這樣的形式,這種形式在計(jì)算機(jī)中稱為浮點(diǎn)數(shù)。上面提到向量中,如果(__,y,z,value)中的一個(gè)或者多個(gè)都是浮點(diǎn),就是浮點(diǎn)向量。而加乘融合,是指
這樣的計(jì)算,當(dāng)然,可以算加乘融合的,自然也可以用來算加減法和乘法:A=0就是乘法,C=1就是加減法。
浮點(diǎn)除法單元(FP DIV):算浮點(diǎn)除法的,也可以算一些常用函數(shù)例如開方、對(duì)數(shù)等。
其它:例如加密用的AES,字符串處理的Vect String,位查找的bit Scan(對(duì)一個(gè)二進(jìn)制數(shù)據(jù)按照多種方法數(shù)0)
調(diào)度器(Scheduler)
有這么多不同的計(jì)算單元,CPU需要一個(gè)把不同的計(jì)算指令分配給對(duì)應(yīng)計(jì)算單元的調(diào)度器。
不過呢,我們這個(gè)財(cái)務(wù)部比較特殊,分了幾個(gè)小辦公室,某幾個(gè)同事在一個(gè)辦公室里面,另外幾個(gè)同事又在另一個(gè)辦公室里面,而每次我們只能傳一張小紙條到一個(gè)辦公室。
在9900K里面,從圖中可以看到,不同的計(jì)算單元在不同的端口(Port)下,就是類似的情況。
寄存器文件(Register File)
計(jì)算財(cái)務(wù)數(shù)據(jù)的時(shí)候,很多數(shù)據(jù)的計(jì)算是需要多步計(jì)算的,具體到每一步的計(jì)算,可能要分給不同的同事來算。如果每一步列一張小紙條,等某位同事算完第一個(gè)數(shù),再抄到第二張小紙條給另外一位同事,這顯然很慢很麻煩——直接列在一張小紙條上就好了嘛。
另外,我們有這么多同事,分配小紙條的同事每次傳小紙條可以一次分配好多張——當(dāng)然,前提是分給不同的同事。
因?yàn)榭赡芤粡埣垪l要算好幾次,又有這么多紙條傳來傳去,因此為了不出錯(cuò),我們需要標(biāo)明這張小紙條給誰算,算完了,負(fù)責(zé)分配小紙條的同事根據(jù)下一步要算的,把標(biāo)注的名字改一下給另外一位同事去算。
CPU中的寄存器也一樣,一個(gè)數(shù)據(jù)可能需要不同的計(jì)算單元多次處理,又有那么多的計(jì)算單元分成了好幾組。所以我們需要多個(gè)寄存器,這些寄存器的組合稱之為寄存器文件。每個(gè)計(jì)算單元只能處理特定名稱的寄存器里面的數(shù)據(jù),因此調(diào)度器經(jīng)常需要對(duì)寄存器進(jìn)行分配、重命名、退出等操作
第三篇:CPU基礎(chǔ)知識(shí)詳解
CPU基礎(chǔ)知識(shí)大全詳解有哪些?CPU在電腦中是最核心關(guān)鍵的硬件之一,相當(dāng)于人的大腦,決定了電腦運(yùn)算能力,因此CPU的選擇至關(guān)重要。下面就讓小編帶你去看看CPU基礎(chǔ)知識(shí)大全詳解,希望對(duì)你有所幫助吧!
程序員必須了解的CPU知識(shí)-科普篇
1導(dǎo)讀
對(duì)于一名程序員來說,無論你使用的是什么語言,代碼最終都會(huì)交給CPU來執(zhí)行。所以了解CPU相關(guān)的知識(shí)一方面屬于程序員的內(nèi)功,另一方面也可以幫助你在日常編寫代碼時(shí)寫出更加高效的代碼
本文不打算對(duì)CPU進(jìn)行深入探究,相反是以簡(jiǎn)單的語言來幫助大家了解CPU的工作原理以及不得不提到的CPU緩存相關(guān)知識(shí),其中晦澀的內(nèi)容我會(huì)通過配圖來幫助大家理解,最后會(huì)以幾個(gè)例子來幫助大家更直觀的感受到CPU緩存帶來的性能影響
2CPU基礎(chǔ)知識(shí)
CPU即Central ProcessingUnit(中央處理器),是我們的代碼打交道最多的硬件之一,要想讓一個(gè)CPU工作,就必須給它提供指令和數(shù)據(jù),而這里的指令和數(shù)據(jù)一般就放在我們的內(nèi)存當(dāng)中。其中指令就是由我們平常編寫的代碼翻譯而來,數(shù)據(jù)也是我們代碼中需要用到的數(shù)據(jù)(例如一個(gè)int值、一串字符串等等)
以C語言為例,從我們開始編寫到運(yùn)行的生命周期可以粗略的用下圖表示:
大致分為以下幾個(gè)步驟
我們?nèi)粘V惺褂镁庉嬈骰蛘逫DE敲入代碼
代碼編寫完成后使用編譯和鏈接工具生成可以被執(zhí)行的程序,也就是機(jī)器語言(指令的集合)
當(dāng)程序被運(yùn)行時(shí),整個(gè)程序(包括指令和數(shù)據(jù))會(huì)被完整的載入到內(nèi)存當(dāng)中
CPU不停的向內(nèi)存讀取該程序的指令執(zhí)行直到程序結(jié)束
通過上述第4步我們知道,CPU自身是沒有保存我們的程序的,需要不停的向內(nèi)存讀取
那么有個(gè)問題是CPU是如何向內(nèi)存讀取的呢?
這里其實(shí)存在一個(gè)“總線”的概念,即CPU會(huì)通過地址總線、控制總線、數(shù)據(jù)總線來與我們的內(nèi)存進(jìn)行交互。其中地址總線的作用是尋址,即CPU告訴內(nèi)存需要哪一個(gè)內(nèi)存地址上的數(shù)據(jù);控制總線的作用是對(duì)外部組件的控制,例如CPU希望從內(nèi)存讀取數(shù)據(jù)則會(huì)在控制總線上發(fā)一個(gè)“讀信號(hào)”,如果希望往內(nèi)存中寫一個(gè)數(shù)據(jù)則會(huì)發(fā)一個(gè)“寫信號(hào)”;而數(shù)據(jù)總線的作用顧名思義就是用來傳輸數(shù)據(jù)本身的了
例如CPU需要希望從內(nèi)存中讀一條數(shù)據(jù),那么整個(gè)過程為:
到這里我們已經(jīng)知道了CPU在執(zhí)行我們程序的過程中會(huì)不斷的與內(nèi)存交互,讀取需要的指令和數(shù)據(jù)或者寫入相關(guān)的數(shù)據(jù)。這個(gè)過程是非常非常快的,一般CPU與內(nèi)存交互一次需要200個(gè)時(shí)鐘周期左右,而現(xiàn)代的處理器單個(gè)時(shí)鐘周期一般都短于1納秒(1秒= 十億納秒)
但我們的前輩們?nèi)匀粚?duì)這個(gè)速度不滿足,所以又對(duì)CPU設(shè)計(jì)了一套緩存系統(tǒng)來加速對(duì)內(nèi)存中數(shù)據(jù)的讀取
3CPU緩存
現(xiàn)代CPU通常設(shè)計(jì)三級(jí)緩存(L1、L2、L3),其中L1、L2緩存是每個(gè)CPU核心獨(dú)享的,L3緩存是所有CPU核心共享的,而L1緩存又分為數(shù)據(jù)緩存和指令緩存
我們的數(shù)據(jù)就從內(nèi)存先到L3緩存中,再到L2緩存中,再到L1緩存中,最后再到CPU寄存器中
按照大小來看,通常L1 < L2 < L3 < 內(nèi)存 <磁盤,如果你手邊有一臺(tái)Linu__機(jī)器的話,可以通過下面的命令查看CPU各級(jí)緩存的大小
以我手上這臺(tái)服務(wù)器為例,L1指令緩存大小為32K、數(shù)據(jù)緩存大小為32K,L2緩存大小為1MB,L3緩存大小為35.75MB
按照速度來看,通常L1 > L2 > L3 > 內(nèi)存 > 磁盤,以時(shí)鐘周期為計(jì)量單位
L1緩存:約 4 個(gè)CPU時(shí)鐘周期
L2緩存:約 10 個(gè)CPU時(shí)鐘周期
L3緩存:約 40 個(gè)CPU時(shí)鐘周期
內(nèi)存:約 200 個(gè)CPU時(shí)鐘周期
也就意味著如果能命中緩存,我們程序的執(zhí)行速度至少提升5倍左右,如果能命中L1緩存則提升50倍左右,這已經(jīng)屬于相當(dāng)大的性能提升了
有了緩存系統(tǒng)后,CPU就不必要每條指令或數(shù)據(jù)都讀一次了,可以一次性讀取若干條指令或數(shù)據(jù)然后放到緩存里供以后查詢,因?yàn)楦鶕?jù)局部性原理,CPU訪問內(nèi)存時(shí),無論是讀取指令還是數(shù)據(jù),所訪問的內(nèi)存單元都趨于聚集在一個(gè)較小的連續(xù)區(qū)域中,所以一次性讀取一塊連續(xù)的內(nèi)存有利于后續(xù)的緩存命中
現(xiàn)實(shí)中,CPU通常情況下每次的讀取內(nèi)存時(shí)都會(huì)一次性讀取內(nèi)存中連續(xù)的64個(gè)字節(jié),這個(gè)連續(xù)的64字節(jié)術(shù)語就叫做CacheLine(緩存行),所以每一級(jí)CPU緩存就像下面這樣
如果你手邊有一臺(tái)Linu__機(jī)器的話,可以通過下面的命令查看你的機(jī)器使用的CPU的Cache Line大小是多少
對(duì)于我的服務(wù)器來說,L1緩存就有 32KB / 64B = 512 個(gè)Cache Line
到這里,我們已經(jīng)知道了CPU緩存的工作原理和加載方式,這里實(shí)際上還遺留了兩個(gè)話題沒有講,一個(gè)是如何組織每一級(jí)的 Cache Line(例如 L1 的512 個(gè)CacheLine)來提升訪問的命中率;另一個(gè)更加復(fù)雜一點(diǎn),在現(xiàn)代CPU都是多核的場(chǎng)景下如何保證數(shù)據(jù)的一致性,因?yàn)槊總€(gè)核都有自己的L1和L2緩存,那么如果核心1修改的時(shí)候只修改了緩存的數(shù)據(jù)而沒有修改內(nèi)存中的數(shù)據(jù),其他核心讀到的就是舊數(shù)據(jù)了,如何解決這一問題?
由于本篇文章只是期望對(duì)CPU知識(shí)進(jìn)行一個(gè)科普,不希望對(duì)于小白來說一次性接觸大量的新內(nèi)容,所以這兩個(gè)問題我準(zhǔn)備在后面的另外兩篇再進(jìn)行更細(xì)致的討論
4性能對(duì)比
下面以幾個(gè)實(shí)際的例子來加深大家對(duì)Cache Line如何影響程序性能的理解
示例一
我們假設(shè)有一個(gè)5000萬長(zhǎng)度的int數(shù)組,接著把這個(gè)數(shù)組的其中一些元素乘以2,考慮下面這兩份代碼
直覺上代碼一比代碼二少循環(huán)了4倍,并且也少乘2了4倍,理論上代碼一比代碼二快4倍左右才合理
但在我的服務(wù)器上運(yùn)行的結(jié)果是代碼一平均花費(fèi)90毫秒,代碼二平均花費(fèi)93毫秒,性能幾乎是差不多的,讀者可以自行思考一下原因,再點(diǎn)擊下方空白處查看解析
點(diǎn)擊下方空白區(qū)域查看解析
▼
解析
這里最主要的原因還是CacheLine,雖然代碼一需要執(zhí)行的指令確實(shí)比代碼二要少4倍,但由于CPU一次會(huì)把連續(xù)的64個(gè)字節(jié)都讀入緩存,而讀寫緩存的速度又特別快(還記得嗎?L1的讀取速度只有約4個(gè)時(shí)鐘周期,是內(nèi)存的50倍),以至于我們很難察覺到這4倍指令的差距
示例二
假設(shè)我們需要遍歷一個(gè)二維數(shù)組,考慮下面這兩種遍歷方法:
由于數(shù)組長(zhǎng)度是一模一樣的,直覺上我們期望的是兩份代碼運(yùn)行時(shí)間相差無幾。但在我的服務(wù)器上代碼一運(yùn)行需要23毫秒,代碼二運(yùn)行需要51毫秒,讀者可以自行思考一下原因,再點(diǎn)擊下方空白處查看解析
點(diǎn)擊下方空白區(qū)域查看解析
▼
解析
這里最主要的原因依然是Cache Line,由于C語言中二維數(shù)組的內(nèi)存是連續(xù)的,所以我們按行訪問的時(shí)候訪問的一直都是連續(xù)的內(nèi)存,而CacheLine也是連續(xù)的64個(gè)字節(jié),所以按行訪問對(duì)Cache Line更友好,更容易命中緩存
而按列訪問的話每次訪問的內(nèi)存不是連續(xù)的,每次的跨度都是256__sizeof(int)也就是1KB,更容易出現(xiàn)緩存Miss
示例三
假設(shè)我們有一個(gè)數(shù)組,我們希望計(jì)算所有大于100的元素的和,考慮下面兩份代碼
其中代碼一是隨機(jī)生成了個(gè)長(zhǎng)度為1000W的數(shù)組,然后統(tǒng)計(jì)大于100的所有數(shù)字的和;代碼二也是隨機(jī)生成了個(gè)長(zhǎng)度為1000W的數(shù)組,但是是先排完序,再統(tǒng)計(jì)大于100的所有數(shù)字的和。并且可以看到,兩份代碼都是只計(jì)算了統(tǒng)計(jì)sum的那段代碼的消耗時(shí)間,所以兩份代碼都不考慮隨機(jī)生成數(shù)組和排序花費(fèi)的時(shí)間
理論上來講兩份代碼花費(fèi)時(shí)間應(yīng)當(dāng)是相差無幾的,但實(shí)際上在我的機(jī)器上跑出來第一份代碼輸出的是46毫秒,第二份代碼輸出的是23毫秒
讀者可以自行思考一下原因,再點(diǎn)擊下方空白處查看解析,提示:第二份代碼中在統(tǒng)計(jì)sum之前數(shù)組是有序的電腦CPU如何選購?臺(tái)式機(jī)CPU知識(shí)掃盲和選購建議
CPU有幾個(gè)重要的參數(shù):架構(gòu)、主頻、核心、線程、緩存、接口。
架構(gòu):
有句老話叫“拋開架構(gòu)看核心主頻都是耍流氓”,那什么是架構(gòu)?假如我們把架構(gòu)想象成交通工具,那么老的架構(gòu)就是火車,而新的架構(gòu)就是高鐵,所以架構(gòu)的提升直接影響CPU的性能。這也就是為什么老式的CPU雖然也有超高的主頻但性能還是被現(xiàn)在的i3碾壓的原因了。
電腦CPU如何選購?臺(tái)式機(jī)CPU知識(shí)掃盲和選購建議
主頻:
我們常在CPU的信息里看到某某CPU主頻3.6GHz,這里的主頻其實(shí)是CPU內(nèi)核工作的時(shí)鐘頻率,并不直接等于CPU的運(yùn)算速度,但是高的主頻對(duì)于CPU的運(yùn)算速度卻至關(guān)重要。
核心:
核心又稱內(nèi)核,是CPU用來完成所有計(jì)算、接受/存儲(chǔ)命令、處理數(shù)據(jù)等任務(wù)的裝置。我們可以簡(jiǎn)單的把核心理解為人的手,單核就是一只手、雙核就是兩只手、四核就是四只手。
核心數(shù)并不是越多越好的,要看使用場(chǎng)景,比如在打字的時(shí)候,兩只手就比一只手效率高,但是在操作鼠標(biāo)的時(shí)候,使用兩只手只會(huì)起到適得其反的效果。至于什么場(chǎng)景需要使用多少核心的CPU在下面會(huì)講到。
電腦CPU如何選購?臺(tái)式機(jī)CPU知識(shí)掃盲和選購建議
線程:
我們通常會(huì)看到“四核四線程”和“四核八線程”這兩種說法,我們可以簡(jiǎn)單的把工廠里的流水線比作線程,把工人比作核心,早先由于工人工作技能不高,一個(gè)工人只能處理一條流水線的任務(wù),我們可以把這個(gè)稱為單核單線程,但是后來工人技術(shù)熟練了,覺得操作一條流水線很無聊,不能體現(xiàn)自己的價(jià)值,于是就給又分配一條流水線,讓這個(gè)工人同時(shí)處理兩條流水線的任務(wù),我們可以把這個(gè)稱為“單核雙線程”。
緩存:
緩存也是CPU里的一項(xiàng)非常重要的參數(shù),由于CPU的運(yùn)算速度比內(nèi)存條的讀寫速度要快很多,這會(huì)讓CPU花費(fèi)很長(zhǎng)的時(shí)間等待數(shù)據(jù)的到來或是把數(shù)據(jù)寫入內(nèi)存條,這個(gè)時(shí)候CPU內(nèi)的高速緩存可以作為臨時(shí)的存儲(chǔ)介質(zhì)來緩解CPU的運(yùn)算速度與內(nèi)存讀寫速度不匹配的矛盾,所以緩存越大越好。
電腦CPU如何選購?臺(tái)式機(jī)CPU知識(shí)掃盲和選購建議
接口:
CPU需要通過接口安裝在主板上才能工作,而目前CPU的接口都是針腳式接口,AMD和英特爾的CPU在接口上就有很大的差別,所以需要使用適配接口的主板才能正常工作。目前英特爾主流的接口類型為L(zhǎng)GA-1151接口(6、7、8代i3i5 i7都是這種接口);AMD平臺(tái)主流的接口類型有AM4接口(銳龍系列)和FM2+接口(速龍系列、APU系列)。
PS:英特爾最新的酷睿8代CPU雖然也是LGA-1151接口,但不適配老式的LGA-1151接口主板的平臺(tái),需要另購主板
說完了這些重要的參數(shù),相信你也對(duì)CPU有了一個(gè)大概的了解,我們?cè)僬務(wù)劜煌瑘?chǎng)景對(duì)CPU的選擇。
計(jì)算機(jī)系統(tǒng)基礎(chǔ):CPU相關(guān)知識(shí)筆記
1、什么是CPU
計(jì)算機(jī)的基本硬件系統(tǒng)由運(yùn)算器、控制器、存儲(chǔ)器、輸入設(shè)備、輸出設(shè)備5大部件組成。
運(yùn)算器和控制器等部件被集成在一起稱為中央處理單元(Central Processing Unit,CPU).CPU
是硬件系統(tǒng)的核心。
2、CPU的用途
CPU主要負(fù)責(zé)獲取程序指令、對(duì)指令進(jìn)行譯碼并加以執(zhí)行。
CPU的功能如下:
3、CPU的組成CPU主要由運(yùn)算器、控制器、寄存器和內(nèi)部總線等部件組成。
3.1 運(yùn)算器
運(yùn)算器包括算術(shù)邏輯單元(ALU)、累加器、緩沖寄存器、狀態(tài)條件寄存器等。它的主要工作是完成所規(guī)定的的各種算術(shù)和邏輯運(yùn)算。
算術(shù)邏輯單元(ALU):ALU的重要組成部件,負(fù)責(zé)處理數(shù)據(jù),實(shí)現(xiàn)算術(shù)和邏輯運(yùn)算。
累加器(AC):當(dāng)執(zhí)行算術(shù)或邏輯運(yùn)算時(shí),為ALU提供一個(gè)工作區(qū)。
數(shù)據(jù)緩沖器(DR):作為CPU和內(nèi)存、外部設(shè)備之間數(shù)據(jù)傳送的中轉(zhuǎn)站、操作速度的緩沖;
在單累加器結(jié)構(gòu)的運(yùn)算器中,DR還可以作為操作數(shù)寄存器。
狀態(tài)寄存器(PSW):保存算術(shù)指令和邏輯指令運(yùn)行或測(cè)試的結(jié)果建立的的各種條件碼內(nèi)容,分為狀態(tài)標(biāo)志和控制標(biāo)志。
3.2 控制器
用于控制這個(gè)CPU的工作,不僅要保證程序的正確執(zhí)行,還要能處理異常事件。
控制器主要包括指令控制邏輯、時(shí)序控制邏輯、總線控制邏輯、中斷控制邏輯。
3.2.1 指令控制
指令寄存器(IR):當(dāng)執(zhí)行一條指令時(shí),需要先把它從內(nèi)存存儲(chǔ)器取到緩沖寄存器中,再送入IR中暫存,指令譯碼器會(huì)根據(jù)IR的內(nèi)容產(chǎn)生各種微操作命令,控制其他部件協(xié)調(diào)工作,完成指令的功能。
程序計(jì)數(shù)器(PC):PC具有寄存和計(jì)數(shù)兩種功能。又稱為指令計(jì)數(shù)器。
地址寄存器(AR):用來保存當(dāng)前CPU所訪問的內(nèi)存單元地址。
指令譯碼器(ID):包含指令操作碼和地址碼兩部分,為了能執(zhí)行任何給定的指令必須對(duì)操作碼進(jìn)行分析,以便識(shí)別要進(jìn)行的操作。
3.2.2 時(shí)序控制
時(shí)序控制要為每條指令按時(shí)間順序提供應(yīng)有的控制信號(hào)。
3.2.3 總線控制
為多個(gè)功能部件提供服務(wù)的信息通路的控制電路。
3.2.4 中斷控制
用于控制各種中斷請(qǐng)求,并根據(jù)優(yōu)先級(jí)排隊(duì),逐個(gè)交給CPU處理。
3.3 寄存器組
分為專用寄存器、通用寄存器。運(yùn)算器和控制器中的寄存器是專用寄存器,作用是固定的。
通用寄存器用途廣泛由程序員規(guī)定其用途。
4、什么是多核CPU
內(nèi)核:CPU的核心稱為內(nèi)核,是CPU的最重要組成部分。CPU的所有計(jì)算、接收/存儲(chǔ)命令、處理數(shù)據(jù)都是由核心執(zhí)行。
多核:在一個(gè)單芯片上集成兩個(gè)或者更多個(gè)處理器內(nèi)核,并且每個(gè)內(nèi)核都有自己的邏輯單元、控制單元、中端處理器、運(yùn)算單元、一級(jí)Cache、二級(jí)Cache共享或獨(dú)有。
多核CPU優(yōu)點(diǎn):可滿足用戶同時(shí)進(jìn)行多任務(wù)處理等要求。
第四篇:CPU講稿
CPU是Central Processing Unit(中央微處理器)的縮寫,由運(yùn)算器和控制器兩部分組成,按照其處理信息的字長(zhǎng),CPU可以分為:4位微處理器、8位微處理器、16位微處理器、32位微處理器以及正在走紅的64位微處理器。
一、CPU發(fā)展的孕育期(1971~1978)
代表CPU:intel 4004、8008 世界上第一款可用于微型計(jì)算機(jī)的4位處理器,是英特爾公司于1971年推出的包含了2300個(gè)晶體管的4004。由于性能很差,市場(chǎng)反應(yīng)十分冷淡。于是Intel公司隨后又研制出了8080處理器、8085處理器,加上當(dāng)時(shí)Motorola公司的MC6800微處理器和Zilog公司的Z80微處理器,一起組成了8位微處理器的家族。
二、CPU發(fā)展的搖籃期(1978~1979)
代表CPU:intel 8086、8088 這期間的代表是英特爾公司1978年推出的這款8086處理器,它是第一塊16位微處理器,最高主頻為8MHz,內(nèi)存尋址能力為1MB。同時(shí)英特爾還生產(chǎn)出與之相配合的數(shù)學(xué)協(xié)處理器8087,這兩種芯片使用相互兼容的指令集,但i8087指令集中增加了一些專門用于對(duì)數(shù)、指數(shù)和三角函數(shù)等數(shù)學(xué)計(jì)算的指令,人們將這些指令集統(tǒng)一稱之為 x86指令集。雖然以后英特爾又陸續(xù)生產(chǎn)出第二代、第三代等更先進(jìn)和更快的新型CPU,但都仍然兼容原來的x86指令。從這點(diǎn)上來說,雖然用今天的眼光看來,8086的性能是那么的不堪,但是它的誕生卻奠定了以后CPU發(fā)展的基礎(chǔ)。
1979年,英特爾公司再接再厲,又開發(fā)出了8088。8088集成了約29000個(gè)晶體管,采用40針的DIP封裝,最高頻率為8MHz。也正是從8088開始,PC(個(gè)人電腦)的概念開始在全世界范圍內(nèi)發(fā)展起來,因?yàn)?981年IBM公司將8088芯片首先用于其研制的PC機(jī)中,標(biāo)志著PC真正走進(jìn)了人們的工作生活之中。
三、CPU發(fā)展的嬰幼期(1979~1985)
代表CPU:Intel 80286 1982年,英特爾公司在8086的基礎(chǔ)上,研制出了80286微處理器,它 是一顆真正為PC而存在的CPU,IBM公司將80286微處理器首先用在AT機(jī)中,引起了業(yè)界了極大的轟動(dòng)。80286 采用PGA封裝,集成了大約130000個(gè)晶體管,最大主頻為20MHz,內(nèi)、外部數(shù)據(jù)傳輸均為16位,使用24位內(nèi)存儲(chǔ)器的尋址,內(nèi)存尋址能力為16MB,可使用的工作方式包括實(shí)模式和保護(hù)模式兩種。在這之前,INTEL也發(fā)布過80186 CPU,這是一顆性能介于8088,80286之間的的CPU,但因?yàn)槟撤N原因,80186從來都沒有在PC中應(yīng)用過。
四、CPU發(fā)展的幼兒期(1985~1993)
代表CPU:intel 80386、80486 1985年10月,intel推出了386DX,其內(nèi)部包含27.5萬個(gè)晶體管,最高頻率為40MHz,內(nèi)部和外部數(shù)據(jù)總線是32位,地址總線為32位,可以尋址4GB內(nèi)存,管理64TB的虛擬存儲(chǔ)空間,并且有比80286更多的指令。而且在386時(shí)代,英特爾為了解決內(nèi)存的速度瓶頸,采取了用預(yù)讀內(nèi)存的方法來緩解,并為386設(shè)計(jì)了高速緩存(Cache)這一方案。intel的這一設(shè)想無疑是偉大的,不僅一直沿用至今,而且還發(fā)揮著越來越重要的作用。
在intel發(fā)布386的時(shí)候,同時(shí)也有其他的幾家CPU制造商也推出了類似的產(chǎn)品,性能也不錯(cuò),比如Motorola 68000、AMD Am386SX/DX和IBM 386SLC。
1989年,英特爾乘勝追擊推出486芯片,該芯片集成了120萬個(gè)晶體管,使用1微米的制造工藝,頻率從25MHz逐步提高到50MHz。在當(dāng)時(shí),486所采用的技術(shù)是最先進(jìn)的,采用了突發(fā)總線方式,大大提高了與內(nèi)存的數(shù)據(jù)交換速度。性能比80386 DX提高了近4倍。
在intel推出486的同時(shí),其他幾家CPU制造商也不甘寂寞,也都發(fā)布了自己的同性能CPU,其中以TI 486 DX、Cyrix 486DLC和AMD 5x86為代表。
五、CPU發(fā)展的兒童期(1993~1999)
代表CPU:Intel Pentium/Pentium2/Celeron、AMD K5/K6 1993年,intel的Pentium(奔騰)CPU面世,這一全面超越486的性能優(yōu)良的產(chǎn)品為intel贏得了巨大的聲譽(yù),Intel?inside 深入人心,同時(shí)也把其他競(jìng)爭(zhēng)對(duì)手甩在了后面,一舉奠定了市場(chǎng)的霸主的地位。早期奔騰75MHz~120MHz使用0.5微米制造工藝,后期120MHz以上的奔騰則改用0.35微米工藝。
97年~98年,這兩年對(duì)于CPU業(yè)界來說,絕對(duì)是一個(gè)不平凡的一年,也是一個(gè)極其混亂的兩年,這不僅是因?yàn)樵谶@兩年里,各大CPU廠商都拿出了自己的看家法寶,也是因?yàn)樵谶@兩年里,不少CPU制造商因產(chǎn)品性能問題被兼并或倒閉。
97年初intel為了提高電腦在多媒體、3D圖形方面的應(yīng)用能力,發(fā)布了Pentium MMX(多能奔騰),同時(shí)許多新指令集也應(yīng)運(yùn)而生,其中最著名的就是intel的MMX(MultiMedia Extensions,多媒體擴(kuò)展指令集)、SSE和AMD的3D NOW!。這些指令可以一次處理多個(gè)數(shù)據(jù),在軟件的配合下,可以得到最佳的性能。
97年中Pentium II和AMD K6上市,年末Cyrix 6x86MX面市。AMD是一個(gè)生命力異常頑強(qiáng)的公司,在與intel的競(jìng)爭(zhēng)中,一直是屢敗屢戰(zhàn),精神可嘉。在Pentium呼風(fēng)喚雨的年代,AMD在1996年發(fā)布了自己第一塊獨(dú)立生產(chǎn)的x86級(jí)CPU——K5,但性能一般。永不服輸?shù)腁MD在1997年又卷土重來,推出了擁有全新的MMX指令,整體性能要優(yōu)于奔騰MMX,接近同主頻PⅡ的水平K6。
到了98年,經(jīng)過一年混戰(zhàn),CPU市場(chǎng)正式開始洗牌。Intel的Pentium 2發(fā)布,它采用0.25微米工藝制造,最高頻率為400MHZ。但是因?yàn)檗D(zhuǎn)用了Slot 1架構(gòu),所以很多消費(fèi)者并買帳。AMD的K6-2乘機(jī)而入,憑借低廉的價(jià)格一度占得近30%的市場(chǎng)份額,這也給AMD一個(gè)喘息的機(jī)會(huì)。所以到了99年,面對(duì)Intel的猛烈反撲,AMD沒有步Cyrix的后塵,落得被收購的下場(chǎng)。
而在低端市場(chǎng),英特爾為進(jìn)一步搶占市場(chǎng)份額,于98年4月推出了最高頻率為300MHz的Celeron(賽揚(yáng)),但因?yàn)闆]有二級(jí)緩存,該微處理器性能甚為低下,于是intel緊接著又發(fā)布了內(nèi)建32KB L1 Cache、128KB L2 Cache的Celeron300A、333、366,在市場(chǎng)中挽回了一點(diǎn)顏面。
六、CPU發(fā)展的少年期(1999~2001)
代表CPU:Intel Pentium3、AMD Athlon 99年伊始,intel就忙不迭的發(fā)布了采用Katmai核心的Pentium3 CPU,該CPU的系統(tǒng)總線頻率為100MHz,起始主頻為450MHz,一級(jí)緩存為32KB(16KB指令緩存加16KB數(shù)據(jù)緩存),二級(jí)緩存大小為512KB,0.25微米工藝制造,內(nèi)部集成950萬個(gè)晶體管,采用Slot 1架構(gòu)。
反觀AMD方面,為了抵抗來勢(shì)洶洶的P3,AMD于99年6月推出了具有重大意義的K7微處理器,并將其正式命名為Athlon。K7也不負(fù)眾望,在時(shí)鐘頻率上率先進(jìn)入到了G時(shí)代,并給intel的處理器在市場(chǎng)上帶來了很大的壓力,自此,CPU市場(chǎng)真正步入intel、AMD兩強(qiáng)爭(zhēng)霸的時(shí)代。
七、CPU發(fā)展的青年期(2000~2003)
代表CPU:intel Pentium4/Celeron4、AMD Athlon xp/Duron 面對(duì)市場(chǎng)的壓力,intel于2000年發(fā)布了Pentium4處理器。但接下來的一切都不是很順利,光是接口就改了2次。第一次是因?yàn)閯傞_始的423接口的Willamette 核心 P4 所搭配的 RDRAM(i850芯片組)價(jià)格太高,市場(chǎng)反應(yīng)冷淡,于是又改成NORTHWOOD核心的478接口P4。再后來為了提升頻率,intel又將核心改換為 Prescott 核心,接口也換為L(zhǎng)GA775,雖然經(jīng)過這么一折騰,頻率是上去了,最高的達(dá)到了4G,但是發(fā)熱量也高的驚人,而且如此頻繁的改換接口,也令消費(fèi)者不厭其煩。
在低端市場(chǎng),intel則一律把CPU的二級(jí)緩存消減3/4,從512K到128K(后期的 Prescott 核心賽揚(yáng)為256K),使性能大大削弱了。
而AMD公司則在2000年6月份推出了Athlon xp處理器,再次向英特爾發(fā)出了挑戰(zhàn),并在DIY市場(chǎng)取得重大成功,可以這么說,在進(jìn)入到Pentium4時(shí)代以來,在AMD的緊逼下,intel感到了前所未有的危機(jī),這也為AMD后來的K8處理器打下了一個(gè)堅(jiān)實(shí)的基礎(chǔ)。
早期的Palomino核心Athlon XP為0.18微米制造工藝,發(fā)熱量較大。但在AMD采用了新的Thoroughbred核心后,發(fā)熱量問題得到了很好的控制。而兩者除了在發(fā)熱量及DIE尺寸上有所不同外,外形幾乎一樣,都是462針的接口、128K的一級(jí)緩存和256K的二級(jí)緩存和3750萬的晶體管數(shù)。
八、CPU發(fā)展的壯年期(2003~至今)
代表CPU:AMD Athlon 64
第五篇:CPU學(xué)習(xí)心得
CPU學(xué)習(xí)感想
今天終于測(cè)試成功了!
清楚得記得,3周前自己把所有線路都接好時(shí)的興奮和小小的成就感。可是,我并沒有在第一次測(cè)試時(shí)就成功,甚至當(dāng)?shù)谝淮谓由想娫磿r(shí),連可愛的保護(hù)電路都是“罷工”狀態(tài),當(dāng)時(shí)背上就出汗了,驚愕啊!記得當(dāng)時(shí)自己還有點(diǎn)不耐煩,因?yàn)槟菙鄷r(shí)間做事情都很不順利,還遇到好多不開心的事情,現(xiàn)在面前又?jǐn)[了個(gè)不work的CPU電路板,郁悶不說,還產(chǎn)生了放棄的念頭。。在這里真的要感想小孟學(xué)長(zhǎng),若不是他的耐心指導(dǎo)和幫助,讓我看到一點(diǎn)希望,我想我也許就放棄了吧。
說實(shí)話,從去聽課介紹CPU,到自己上網(wǎng)查各類資料,再到和老師溝通,再到開始動(dòng)手插面包板,到最后的測(cè)試找Bug并且Debug,這一過程中,我學(xué)到的不僅僅只是關(guān)于CPU的知識(shí),還有耐心、細(xì)心、謙虛。
我本身對(duì)電腦知識(shí)了解的很少,剛?cè)ヂ犝n時(shí),對(duì)什么CPU的基本知識(shí)都一無所知,像ALU,CAD等等,也找不到頭緒,不知道從哪下手,感覺自己不知道得實(shí)在太多。我開始和老師頻繁得通e-mail,詢問老師各種看來都很低級(jí)的問題,金老師有個(gè)特點(diǎn),他不會(huì)直接告訴你答案,而是要你自己去思考和尋找答案——這也是我在學(xué)習(xí)CPU時(shí)最大的收獲,并且已經(jīng)感覺到它的重要性。老師會(huì)給我指一個(gè)方向,給我一點(diǎn)提示,接下來都要靠自己去思考自己動(dòng)手。我開始對(duì)CPU有了大致的了解和概念,也對(duì)自己制作這樣一個(gè)電路板有了一些信心。
在開始動(dòng)手后,有一個(gè)讓我印象格外深——輸入A由register file出來后要與check做AND再輸入IC7483,可是,平時(shí)做的AND,2個(gè)輸入都是1bit,現(xiàn)在一個(gè)輸入A(4bit)另一個(gè)輸入check(1bit),這要怎么做呢?看著IC7408,恍然發(fā)現(xiàn),可以讓A的4個(gè)bit分別與check做AND,然后再依序輸出,就能得到4bit的A與1bit的check做AND的結(jié)果了!當(dāng)時(shí)很開心,一路接下去也很順利。沿途還注意到IC7483是做加法器用,所以Co要接地;總共有2個(gè)clock,IC74195 和IC74157,并且每種有2顆,當(dāng)時(shí)我就想到,可以只做一個(gè)clock電路,讓IC74157的clock位接到Q,IC74195的enable位接Q’,因?yàn)楫?dāng)74157的選擇位是0時(shí),會(huì)選擇輸出B的資料,第一次就把B寫進(jìn)去了,摁下clock后就會(huì)將A寫進(jìn)去,這樣就能完成接下來的A*B的工作;同時(shí),我還想,接一個(gè)保護(hù)電路的話,保護(hù)力度會(huì)不夠,所以在第二塊板上也加了一個(gè)保護(hù)電路;感覺自己做的最明智得就是將重要的輸入輸出都拉出來,經(jīng)過LED顯示,并在板子周邊貼上小紙條做標(biāo)記,心想,這樣出來的效果會(huì)更明顯些。在接近尾聲時(shí),發(fā)現(xiàn)自己的材料不夠,甚至IC還有拿錯(cuò)的,我2次跑去實(shí)驗(yàn)室找學(xué)長(zhǎng)拿材料,那時(shí)候心情也很好,覺得自己在做一件很偉大的事情一樣。
測(cè)試時(shí)經(jīng)歷時(shí)間最長(zhǎng)的,在第三次時(shí)終于成功了。也許是在宿舍放太久了吧,第一次接上電源,保護(hù)電路的LED都不亮,自信心一下子就澆滅了一半。學(xué)長(zhǎng)建議換個(gè)LED試試,這才看到一絲光亮。第一次測(cè)試,經(jīng)過換LED、換IC、重接clock電路,讓保護(hù)電路和clock電路正常work了。第二次測(cè)試,我和學(xué)長(zhǎng)從9點(diǎn)一直Debug到12點(diǎn)半,各種稀奇古怪的情況和小錯(cuò)誤,類似LED壞了,IC壞了,有線沒插好,線插錯(cuò)位置了,DIPI開關(guān)接錯(cuò)等等,一點(diǎn)一點(diǎn)找問題,然后再解決。我們順利讓74157和register file工作了。我還確定了,剩下的問題來自于7483,導(dǎo)致74195無法正常work。這真的很鍛煉耐性和細(xì)心。我記得那次從實(shí)驗(yàn)室里走出來,腿都軟了。第三次測(cè)試,只花了半小時(shí)。學(xué)長(zhǎng)和我一開始怎么都找不到7483那塊問題所在,我們甚至還把所有DIPI開關(guān)和排阻來控制輸入的電路換了另一種接法(其中,我知道LED不亮并不代表off,只有它真正接地才是off狀態(tài)),試圖想“喚醒”7383.,可是7483 很不給“面子”,其他都正常,就它在“罷工”,最后沒轍,決定換顆IC試試。不能怕麻煩,真的,即使那顆IC被很多線纏繞,也要耐性把它從里面“解救”出來并且把好的在放到正確的位置。當(dāng)新的7483按上的那一瞬間,期望的LED都亮了!開心得不得了!那種喜悅,真的只有真正經(jīng)歷的人才能體會(huì)哈!
感謝一路幫我的小孟學(xué)長(zhǎng)。
感謝最最最好的金老師,教會(huì)我好多,學(xué)習(xí)上的,做人做事上的,讓我受益匪淺!