【計算機原理】CPU部分.md
本文由CPU阿甘改編而得,主要講的是系統啟動和程序執行時CPU做的工作。
CPU的構成
中央處理器(CPU,Central Processing Unit)由運算器、控制器、Cache等。
控制器:主要是對指令進行譯碼。
運算器:主要是執行定點或者浮點運算等。
寄存器:主要功能是保存計算的中間結果
可以看出CPU的主要功能是接收指令,執行指令。不過CPU不能保存指令。
最大的優點在於速度快,以ns為單位,內存比它慢了100倍,硬盤比它慢了1000多萬倍。
下面我們主要介紹一下計算機從加電到加載操作系統中,CPU主要做了什麽事情。
啟動
當計算機上電了以後,CPU就先會執行內存最頂端的指令,現是一條跳轉指令
我們知道BIOS的主要功能是系統自檢,看看內存、硬盤、顯卡等是否有問題。自檢完成以後,會產生中斷,BIOS會告訴CPU是多少號中斷。
中斷了以後,CPU怎麽知道去哪裏執行響應中斷的指令呢?我們可以用一張表來保存中斷指令的響應代碼,但是為了讓這張表不那麽臃腫,可以讓這張表只保存響應代碼的入口地址。
比如
中斷類型號 | 響應指令的地址 |
---|---|
0x01 | 地址A |
0x02 | 地址B |
…… | …… |
這張表就稱為中斷向量表,保存的是響應中斷的指令的入口地址,類似於響應代碼的房間號。
CPU可以通過中斷向量表查找到對應的指令,這條指令的目的是把磁盤的第一扇區(磁盤的BIOS)運到內存中
到目前為止,硬件的初始化就完成了,下面應該加載操作系統
運行程序
操作系統加載入內存中以後,會接管整個系統的管理工作。
下面我們來談一下如何運行程序。
首先操作系統會為CPU分配進程,不過對CPU而言,它只關心自己的寄存器和程序計數器
寄存器:工作現場,包括一些計算的中間結果
程序計數器:要執行的下一條指令的地址。
要運行程序,首先需要從硬盤上加載程序。但是從硬盤上讀程序實在太慢,CPU沒有必要一直等著它,完全可以異步處理。
硬盤把返回的數據通過直接內存訪問(DMA)把數據裝載到內存中。這樣CPU就解放出來,切換到另一個進程裏面,當然相關的運行環境(寄存器、程序計數器)發生了改變。
但是上一個進程不可能放棄不執行了吧,所以等到當上一個進程的數據已經裝載到了內存以後,CPU會收到一個中斷,這樣就可以切換回去了。
總結一下CPU的主要工作是,從內存中取出指令,進行譯碼,分解成為一系列的微操作,然後發出各種控制命令。
對CPU而言,主要關心的是它的寄存器和程序計數器,其中寄存器保存了計算的中間結果,而程序計數器可以用告訴CPU下一條指令去那裏執行。
性能參數
CPU的主要性能參數有:
主頻:表示CPU內數字脈沖信號震蕩的速度,與實際的運算速度沒有直接的聯系,比如1GHz的Itanium芯片與2.66GHz的至強芯片一樣快,因為CPU的運算速度除了有主頻的因素,還有CPU的流水線、總線等各方面的影響。
外頻:CPU的基準頻率,MHz,可以決定主板的運行速度,如果把CPU超頻了,可以CPU與主板會異步運行,所以整個系統有可能不穩定,一般來說服務器CPU不允許超頻。
總線頻率:指的是前端總線的頻率,而前端總線指的是CPU與北橋之間的總線。
那麽總線頻率其實直接影響CPU與內存的之間的交互速率,即每秒CPU能接收的數據傳輸量。這點與外頻不一樣,外頻是整塊主板的運行速度。
Cache:因為CPU與內存之間存在速度差,同時我們發現程序的加載有局部性的特點,也就是說一個內存位置被訪問了,附近的位置很快也會訪問到。那麽我們完全可以把內存中的部分代碼提前加載到Cache裏面。
既然Cache的主要作用是CPU與內存的緩沖層,那麽Cache的速度應該接近於CPU,基本上是與CPU同頻運作。
緩存都集成在CPU芯片上,而CPU單位面積的價格很昂貴,Cache一般都很小。
指令集
我們知道CPU的主要功能是解析指令,執行指令,也就是說CPU是靠一條一條的指令來計算和控制整個系統的。
也就是說不管是什麽CPU,都有與之相匹配的指令系統。常用的指令集有兩種
復雜指令集:一般來說程序的指令是按照順序串行執行的,而指令中的各個操作也是串行執行的。這樣控制簡單,但是利用率不高。
x86架構的CPU主要使用的就是復雜指令集,AMD屬於後起之秀,所以一定會兼容x86架構,它也是復雜指令架構的。
精簡指令集:
復雜指令集最大的缺點在於微處理器太過復雜,所以研發成本高。而精簡指令集,顧名思義,其指令系統得到大量的精簡,而且指令格式統一,所以可以使用流水線結構,處理速度就上去了。
服務器中采用RSIC指令的CPU主要有:PowerPC、MIPS處理器。
處理技術
本章主要介紹一下CPU體系架構裏面常用的技術
流水線
每條指令都會經過取指(Fetch),譯碼(D1, main decode),轉址(D2, translate),執行(EX, execute),寫回(WB)結果等步驟。
那麽當CPU預取完畢,進行譯碼的時候,預取部分的電路單元其實是空閑的。那麽能不能讓下一條指令進來執行預取的過程呢?答案是完全可以。
如下圖所示,我們可以每過一個周期放入一條指令,這樣在第5個時刻,最開始放入的指令其實已經執行到了最後一步WB了,第2條進入執行的指令比它晚一拍,執行到了EX上,其他的一次類推。
這樣不斷的有新的指令進入,同一時刻5條指令都在執行,只是說他們執行的階段不一樣。這樣就實現了並行處理。
【計算機原理】CPU部分.md