1. cpu 如何使用內存
一、 指令系統
要講CPU,就必須先講一下指令系統。指令系統指的是一個CPU所能夠處理的全部指
令的集合,是一個CPU的根本屬性。比如我們現在所用的CPU都是採用x86指令集的,他們都是同一類型的CPU,不管是PIII、Athlon或Joshua。我們也知道,世界上還有比PIII和Athlon快得多的CPU,比如Alpha,但它們不是用x86指令集,不能使用數量龐大的基於x86指令集的程序,如Windows98。之所以說指令系統是一個CPU的根本屬性,是因為指令系統決定了一個CPU能夠運行什麼樣的程序。
所有採用高級語言編出的程序,都需要翻譯(編譯或解釋)成為機器語言後才能運行,這些機器語言中所包含的就是一條條的指令。
1、 指令的格式
一條指令一般包括兩個部分:操作碼和地址碼。操作碼其實就是指令序列號,用來告訴CPU需要執行的是那一條指令。地址碼則復雜一些,主要包括源操作數地址、目的地址和下一條指令的地址。在某些指令中,地址碼可以部分或全部省略,比如一條空指令就只有操作碼而沒有地址碼。
舉個例子吧,某個指令系統的指令長度為32位,操作碼長度為8位,地址長度也為8位,且第一條指令是加,第二條指令是減。當它收到一個「」的指令時,先取出它的前8位操作碼,即00000010,分析得出這是一個減法操作,有3個地址,分別是兩個源操作數地址和一個目的地址。於是,CPU就到內存地址00000100處取出被減數,到00000001處取出減數,送到ALU中進行減法運算,然後把結果送到00000110處。
這只是一個相當簡單化的例子,實際情況要復雜的多。
2、 指令的分類與定址方式
一般說來,現在的指令系統有以下幾種類型的指令:
(1)算術邏輯運算指令
算術邏輯運算指令包括加減乘除等算術運算指令,以及與或非異或等邏輯運算指令。現在的指令系統還加入了一些十進制運算指令以及字元串運算指令等。
(2)浮點運算指令
用於對浮點數進行運算。浮點運算要大大復雜於整數運算,所以CPU中一般還會有專門負責浮點運算的浮點運算單元。現在的浮點指令中一般還加入了向量指令,用於直接對矩陣進行運算,對於現在的多媒體和3D處理很有用。
(3)位操作指令
學過C的人應該都知道C語言中有一組位操作語句,相對應的,指令系統中也有一組位操作指令,如左移一位右移一位等。對於計算機內部以二進制不碼表示的數據來說,這種操作是非常簡單快捷的。
(4)其他指令
上面三種都是運算型指令,除此之外還有許多非運算的其他指令。這些指令包括:數據傳送指令、堆棧操作指令、轉移類指令、輸入輸出指令和一些比較特殊的指令,如特權指令、多處理器控制指令和等待、停機、空操作等指令。
對於指令中的地址碼,也會有許多不同的定址(編址)方式,主要有直接定址,間接定址,寄存器定址,基址定址,變址定址等,某些復雜的指令系統會有幾十種甚至更多的定址方式。
3、 CISC與RISC
CISC,Complex Instruction Set Computer,復雜指令系統計算機。RISC,Reced Instruction Set Computer,精簡指令系統計算機。雖然這兩個名詞是針對計算機的,但下文我們仍然只對指令集進行研究。
(1)CISC的產生、發展和現狀
一開始,計算機的指令系統只有很少一些基本指令,而其他的復雜指令全靠軟體編譯時通過簡單指令的組合來實現。舉個最簡單的例子,一個a乘以b的操作就可以轉換為a個b相加來做,這樣就用不著乘法指令了。當然,最早的指令系統就已經有乘法指令了,這是為什麼呢?因為用硬體實現乘法比加法組合來得快得多。
由於那時的計算機部件相當昂貴,而且速度很慢,為了提高速度,越來越多的復雜指令被加入了指令系統中。但是,很快又有一個問題:一個指令系統的指令數是受指令操作碼的位數所限制的,如果操作碼為8位,那麼指令數最多為256條(2的8次方)。
那麼怎麼辦呢?指令的寬度是很難增加的,聰明的設計師們又想出了一種方案:操作碼擴展。前面說過,操作碼的後面跟的是地址碼,而有些指令是用不著地址碼或只用少量的地址碼的。那麼,就可以把操作碼擴展到這些位置。
舉個簡單的例子,如果一個指令系統的操作碼為2位,那麼可以有00、01、10、11四條不同的指令。現在把11作為保留,把操作碼擴展到4位,那麼就可以有00、01、10、1100、1101、1110、1111七條指令。其中1100、1101、1110、1111這四條指令的地址碼必須少兩位。
然後,為了達到操作碼擴展的先決條件:減少地址碼,設計師們又動足了腦筋,發明了各種各樣的定址方式,如基址定址、相對定址等,用以最大限度的壓縮地址碼長度,為操作碼留出空間。
就這樣,慢慢地,CISC指令系統就形成了,大量的復雜指令、可變的指令長度、多種的定址方式是CISC的特點,也是CISC的缺點:因為這些都大大增加了解碼的難度,而在現在的高速硬體發展下,復雜指令所帶來的速度提升早已不及在解碼上浪費點的時間。除了個人PC市場還在用x86指令集外,伺服器以及更大的系統都早已不用CISC了。x86仍然存在的唯一理由就是為了兼容大量的x86平台上的軟體。
(2)RISC的產生、發展和現狀
1975年,IBM的設計師John Cocke研究了當時的IBM370CISC系統,發現其中占總指令數僅20%的簡單指令卻在程序調用中佔了80%,而占指令數80%的復雜指令卻只有20%的機會用到。由此,他提出了RISC的概念。
事實證明,RISC是成功的。80年代末,各公司的RISC CPU如雨後春筍般大量出現,占據了大量的市場。到了90年代,x86的CPU如pentium和k5也開始使用先進的RISC核心。
RISC的最大特點是指令長度固定,指令格式種類少,定址方式種類少,大多數是簡單指令且都能在一個時鍾周期內完成,易於設計超標量與流水線,寄存器數量多,大量操作在寄存器之間進行。由於下文所講的CPU核心大部分是講RISC核心,所以這里就不多介紹了,對於RISC核心的設計下面會詳細談到。
RISC目前正如日中天,Intel的Itanium也將最終拋棄x86而轉向RISC結構。
二、CPU內核結構
好吧,下面來看看CPU。CPU內核主要分為兩部分:運算器和控制器。
(一) 運算器
1、 算術邏輯運算單元ALU(Arithmetic and Logic Unit)
ALU主要完成對二進制數據的定點算術運算(加減乘除)、邏輯運算(與或非異或)以及移位操作。在某些CPU中還有專門用於處理移位操作的移位器。
通常ALU由兩個輸入端和一個輸出端。整數單元有時也稱為IEU(Integer Execution Unit)。我們通常所說的「CPU是XX位的」就是指ALU所能處理的數據的位數。
2、 浮點運算單元FPU(Floating Point Unit)
FPU主要負責浮點運算和高精度整數運算。有些FPU還具有向量運算的功能,另外一些則有專門的向量處理單元。
3、通用寄存器組
通用寄存器組是一組最快的存儲器,用來保存參加運算的操作數和中間結果。
在通用寄存器的設計上,RISC與CISC有著很大的不同。CISC的寄存器通常很少,主要是受了當時硬體成本所限。比如x86指令集只有8個通用寄存器。所以,CISC的CPU執行是大多數時間是在訪問存儲器中的數據,而不是寄存器中的。這就拖慢了整個系統的速度。而RISC系統往往具有非常多的通用寄存器,並採用了重疊寄存器窗口和寄存器堆等技術使寄存器資源得到充分的利用。
對於x86指令集只支持8個通用寄存器的缺點,Intel和AMD的最新CPU都採用了一種叫做「寄存器重命名」的技術,這種技術使x86CPU的寄存器可以突破8個的限制,達到32個甚至更多。不過,相對於RISC來說,這種技術的寄存器操作要多出一個時鍾周期,用來對寄存器進行重命名。
4、 專用寄存器
專用寄存器通常是一些狀態寄存器,不能通過程序改變,由CPU自己控制,表明某種狀態。
(二) 控制器
運算器只能完成運算,而控制器用於控制著整個CPU的工作。
1、 指令控制器
指令控制器是控制器中相當重要的部分,它要完成取指令、分析指令等操作,然後交給執行單元(ALU或FPU)來執行,同時還要形成下一條指令的地址。
2、 時序控制器
時序控制器的作用是為每條指令按時間順序提供控制信號。時序控制器包括時鍾發生器和倍頻定義單元,其中時鍾發生器由石英晶體振盪器發出非常穩定的脈沖信號,就是CPU的主頻;而倍頻定義單元則定義了CPU主頻是存儲器頻率(匯流排頻率)的幾倍。
3、 匯流排控制器
匯流排控制器主要用於控制CPU的內外部匯流排,包括地址匯流排、數據匯流排、控制匯流排等等。
4、中斷控制器
中斷控制器用於控制各種各樣的中斷請求,並根據優先順序的高低對中斷請求進行排隊,逐個交給CPU處理。
(三) CPU核心的設計
CPU的性能是由什麼決定的呢?單純的一個ALU速度在一個CPU中並不起決定性作用,因為ALU的速度都差不多。而一個CPU的性能表現的決定性因素就在於CPU內核的設計。
1、超標量(Superscalar)
既然無法大幅提高ALU的速度,有什麼替代的方法呢?並行處理的方法又一次產生了強大的作用。所謂的超標量CPU,就是只集成了多個ALU、多個FPU、多個解碼器和多條流水線的CPU,以並行處理的方式來提高性能。
超標量技術應該是很容易理解的,不過有一點需要注意,就是不要去管「超標量」之前的那個數字,比如「9路超標量」,不同的廠商對於這個數字有著不同的定義,更多的這只是一種商業上的宣傳手段。
2、流水線(Pipeline)
流水線是現代RISC核心的一個重要設計,它極大地提高了性能。
對於一條具體的指令執行過程,通常可以分為五個部分:取指令,指令解碼,取操作數,運算(ALU),寫結果。其中前三步一般由指令控制器完成,後兩步則由運算器完成。按照傳統的方式,所有指令順序執行,那麼先是指令控制器工作,完成第一條指令的前三步,然後運算器工作,完成後兩步,在指令控制器工作,完成第二條指令的前三步,在是運算器,完成第二條指令的後兩部……很明顯,當指令控制器工作是運算器基本上在休息,而當運算器在工作時指令控制器卻在休息,造成了相當大的資源浪費。解決方法很容易想到,當指令控制器完成了第一條指令的前三步後,直接開始第二條指令的操作,運算單元也是。這樣就形成了流水線系統,這是一條2級流水線。
如果是一個超標量系統,假設有三個指令控制單元和兩個運算單元,那麼就可以在完成了第一條指令的取址工作後直接開始第二條指令的取址,這時第一條指令在進行解碼,然後第三條指令取址,第二條指令解碼,第一條指令取操作數……這樣就是一個5級流水線。很顯然,5級流水線的平均理論速度是不用流水線的4倍。
流水線系統最大限度地利用了CPU資源,使每個部件在每個時鍾周期都工作,大大提高了效率。但是,流水線有兩個非常大的問題:相關和轉移。
在一個流水線系統中,如果第二條指令需要用到第一條指令的結果,這種情況叫做相關。以上面哪個5級流水線為例,當第二條指令需要取操作數時,第一條指令的運算還沒有完成,如果這時第二條指令就去取操作數,就會得到錯誤的結果。所以,這時整條流水線不得不停頓下來,等待第一條指令的完成。這是很討厭的問題,特別是對於比較長的流水線,比如20級,這種停頓通常要損失十幾個時鍾周期。目前解決這個問題的方法是亂序執行。亂序執行的原理是在兩條相關指令中插入不相關的指令,使整條流水線順暢。比如上面的例子中,開始執行第一條指令後直接開始執行第三條指令(假設第三條指令不相關),然後才開始執行第二條指令,這樣當第二條指令需要取操作數時第一條指令剛好完成,而且第三條指令也快要完成了,整條流水線不會停頓。當然,流水線的阻塞現象還是不能完全避免的,尤其是當相關指令非常多的時候。
另一個大問題是條件轉移。在上面的例子中,如果第一條指令是一個條件轉移指令,那麼系統就會不清楚下面應該執行那一條指令?這時就必須等第一條指令的判斷結果出來才能執行第二條指令。條件轉移所造成的流水線停頓甚至比相關還要嚴重的多。所以,現在採用分支預測技術來處理轉移問題。雖然我們的程序中充滿著分支,而且哪一條分支都是有可能的,但大多數情況下總是選擇某一分支。比如一個循環的末尾是一個分支,除了最後一次我們需要跳出循環外,其他的時候我們總是選擇繼續循環這條分支。根據這些原理,分支預測技術可以在沒有得到結果之前預測下一條指令是什麼,並執行它。現在的分支預測技術能夠達到90%以上的正確率,但是,一旦預測錯誤,CPU仍然不得不清理整條流水線並回到分支點。這將損失大量的時鍾周期。所以,進一步提高分支預測的准確率也是正在研究的一個課題。
越是長的流水線,相關和轉移兩大問題也越嚴重,所以,流水線並不是越長越好,超標量也不是越多越好,找到一個速度與效率的平衡點才是最重要的。
三、CPU的外核
1、解碼器(Decode Unit)
這是x86CPU才有的東西,它的作用是把長度不定的x86指令轉換為長度固定的類似於RISC的指令,並交給RISC內核。解碼分為硬體解碼和微解碼,對於簡單的x86指令只要硬體解碼即可,速度較快,而遇到復雜的x86指令則需要進行微解碼,並把它分成若干條簡單指令,速度較慢且很復雜。好在這些復雜指令很少會用到。
Athlon也好,PIII也好,老式的CISC的x86指令集嚴重製約了他們的性能表現。
2、一級緩存和二級緩存(Cache)
以及緩存和二級緩存是為了緩解較快的CPU與較慢的存儲器之間的矛盾而產生的,以及緩存通常集成在CPU內核,而二級緩存則是以OnDie或OnBoard的方式以較快於存儲器的速度運行。對於一些大數據交換量的工作,CPU的Cache顯得尤為重要。
好了,看到了吧,CPU其實也就這樣,並不是很神秘。這篇文章的所有內容都不針對某一種CPU,而是適合於任何CPU,是一些最基本的CPU原理,希望能夠對你有所幫助。
2. 如何在CPU中加入緩存
返回到CPU生產廠商~
然後打報告給公司~
批下來了~~~就能在CPU增加緩存了~
自己是加不進去的~
3. CPU的緩存是如何工作的
CPU執行指令時,會將執行結果放在一個叫「寄存器」的元件中,由於「寄存器」集成在CPU內部,與ALU等構成CPU的重要元件,因此寄存器中的指令很快被CPU所訪問,但畢竟寄存器的容量太小,CPU所需的大量指令和數據還在內存(RAM)當中,所以CPU為了完成指令操作,需要頻繁地向內存發送接收指令、數據。
由於內存的處理速度遠遠低於CPU,所以傳統的系統瓶頸在這里就產生了,CPU在處理指令時往往花費很多時間在等待內存做准備工作。
為了解決這個問題,人們在CPU內部集成了一個比內存快許多的「Cache」,這就是最早的「高速緩存」。
L1高速緩存是與CPU完全同步運行的存儲器,也就是我們常說的一級緩存,如果CPU需要的數據和指令已經在高速緩存中了,那麼CPU不必等待,直接就可以從一級緩存(L1)中取得數據,如果數據不在L1中,CPU再從二級緩存(L2)中提取數據,大大提高了系統的工作效率。
4. cpu的緩存是如何工作的
CPU要讀取一個數據時,首先從Cache中查找,如果找到就立即讀取並送給CPU處理;如果沒有找到,就用相對慢的速度從內存中讀取並送給CPU處理,同時把這個數據所在的數據塊調入Cache中,可以使得以後對整塊數據的讀取都從Cache中進行,不必再調用內存。
正是這樣的讀取機制使CPU讀取Cache的命中率非常高(大多數CPU可達90%左右),也就是說CPU下一次要讀取的數據90%都在Cache中,只有大約10%需要從內存讀取。這大大節省了CPU直接讀取內存的時間,也使CPU讀取數據時基本無需等待。總的來說,CPU讀取數據的順序是先Cache後內存。
5. CPU的緩存有什麼用
緩存是CPU自己的「內存」,用來放暫時處理不及的東西,因為它的作用像內存對電腦的作用,但為什麼CPU不用內存而用自己的緩存呢?因為內存的速度雖然很快,但依然達不到CPU的讀寫頻率,所以CPU需要這樣一個緩存來快速讀寫。而內存用來存放目前運行的程序所必須佔用的空間。
而CPU又分為一級(L1)二級(L2)三級(L3)緩存,你通常會看到L1最小,L2次之,L3最大(很多普通CPU並沒有三級,只有一二級),成這種結構是因為,L1製造難度大,成本高,但往大了做對系統提升卻比較有限,所以都很小。而CPU的讀取順序也是先從L1里讀,然後L2→L3→內存。L2作為其外部緩沖,而L3就是L2的緩沖(備胎當到老)。緩存當然是越大越好,畢竟它們都比內存快嘛,但以目前相同情況下,L1還是越大越好,相同L1比L2,相同L2比L3。
6. 怎樣增大CPU緩存
很正常不是CPU的問題。
7. CPU的緩存
cpu緩存現在都分兩個級別,一及緩存稱L1 cache,二級緩存稱為L2 cache.
當然對於不同cpu,兩及緩存的作用是不同的.但總體來說,緩存是儲存cpu急需處理的數據的地方,當cpu要處理東西的時候,緩存中就開始儲存這些數據,由於緩存速度非常之高,所以,cpu讀取這些數據的速度就相當快.
由於緩存容量相當小,但是當緩存中的數據處理完了又沒有來得及重新添滿的時候,或者是緩存中的數據不是cpu馬上要處理的數據的時候,cpu就只有跳過緩存,直接村內存讀取,內存的速度要相對慢得多,所以這個時候cpu整體的速度就下降了.
當然,AMD和intel在緩存上的結構完全不同,這個造成了為什麼intel的主流處理器的L2 cache緩存在2-4Mb,而AMD的L2 cache只有256kb-512kb.這個我們就要說到他們L1 cache的區別了.
intel的L1中不儲存cpu要處理的實際數據,他儲存的都是L2中數據的目錄,也就是intel的cpu要處理數據的時候先要訪問L1,為的是了解他要儲存的實際數據在L2中具體的位置.這個大大減少了cpu尋找L2數據的時間.比喻起來,intel的L2是一個倉庫,L1關於就是這個倉庫中儲存東西具體位置的目錄.
AMD完全不同,L1中就儲存實際數據,L2也儲存實際數據,當L1中的數據用完了的時候,或者L1不能裝的過大的數據的時候,cpu就直接處理L2中的數據.比喻起來,AMD的L1是個小倉庫,L2是個大倉庫.
然後是為什麼他們對L2需求不同.
AMD的很好理解,他cpu處理數據的時候是有續處理的,先處理L1,處理完了再處理L2,數據一個接一個.
intel採取的是則是亂處理方式,cpu不會衣順序處理數據,而是隨即挑選數據來處理,當他隨便挑選的數據在L2中時,他就讀取L1了解數據在L2的位置,然後處理這個數據,但是當數據不在L2中時,就讀取內存.
這個造就了他們L2大小不同,intel的處理方式像是一個人隨機的在扔飛標,飛標落在標盤每個地方的幾率是相同的,標盤內的紅心就是L2的數據,標盤的其他地方是內存.前面說了,L2中數據是高速的,只有處理L2的,才能更快,否則要慢很多。所以,一個隨機扔飛標的人為了讓飛標落在紅心的幾率更大,最好的辦法就是加大紅心的面積,也就是L2.因此為了提高cpu的速度,intel需要很大的紅心,也就是L2.
AMD則不同,他是一個接一個處理的,不是隨機的扔飛標,他要考慮的只是L1和L2中單個數據的大小,因為cpu要處理的數據幾乎都在0-2Mb之間,0-128kb的佔了50%,128-256kb佔了25%,256-512的佔了24%,大於512kb的只佔了1%.
因此,512kb就能滿足cpu幾乎所有的需求了,只有處理那些1%的大於512kb的數據的時候AMD才會訪問內存.因此AMD需求很小的L2.
8. 如何清理CPU緩存
清理CPU緩存最好的方法是關機或重啟設備。
CPU緩存(Cache Memory)是位於CPU與內存之間的臨時存儲器,它的容量比內存小的多但是交換速度卻比內存要快得多。高速緩存的出現主要是為了解決CPU運算速度與內存讀寫速度不匹配的矛盾,因為CPU運算速度要比內存讀寫速度快很多,這樣會使CPU花費很長時間等待數據到來或把數據寫入內存。在緩存中的數據是內存中的一小部分,但這一小部分是短時間內CPU即將訪問的,當CPU調用大量數據時,就可避開內存直接從緩存中調用,從而加快讀取速度。
9. 如何設置CPU緩存
CPU的緩存是無法設置的,他的大小有CPU決定,但是你可以選擇要不要打開》不打開的話機器賊慢。
10. cpu緩存的問題
CPU運算指令直接從L1緩存里提取,L1不必很大,只要能夠控制其他緩存的取址參數就可以了。
L2是高速數據緩存,是CPU直接要調用計算的部分,越大越好
L3原理相似,只是輔助性質更強了