本文由[CPU阿甘](https://mp.weixin.qq.com/s?__biz=MzAxOTc0NzExNg==&mid=2665513017&idx=1&sn=5550ee714abd36d0b580713f673e670b&scene=21#wechat_redirect)改編而得,主要講的是系統啟動和程序執行時CPU做的工作。
# CPU的構成
中央處理器(CPU,Central Processing Unit)由運算器、控制器、Cache等。
- 控制器:主要是對指令進行譯碼。
- 運算器:主要是執行定點或者浮點運算等。
- 寄存器:主要功能是保存計算的中間結果
可以看出CPU的主要功能是接收指令,執行指令。不過CPU不能保存指令。
最大的優點在于**速度快**,以ns為單位,內存比它慢了100倍,硬盤比它慢了1000多萬倍。

下面我們主要介紹一下計算機從加電到加載操作系統中,CPU主要做了什么事情。

# 啟動
當計算機上電了以后,CPU就先會執行**內存最頂端的指令**,現是一條**跳轉指令**,所以會去執行BIOS里面的代碼。
我們知道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條指令都在執行,只是說他們執行的階段不一樣。這樣就實現了并行處理。
