今日文章:
小林coding:CPU 是如何執行程序的?
目錄
- 內存
- 中央處理器
- 指令及其周期
- 指令類型
- MIPS指令類型
- 指令周期
- 指令的執行速度
馮諾依曼計算機遵循了圖靈機的設計,使用了電子元件構造,約定了用二進制進行計算和存儲
圖靈機基本由紙帶和和讀寫頭組成,讀寫頭上有存儲單元,控制單元和運算單元
馮諾依曼模型定義了計算機基本結構為5部分:運算器、控制器、存儲器、輸入設備、輸出設備
關系大致如圖,運算器和控制器在中央處理器中,存儲器為內存,輸入輸出設備則是計算器外接的設備
內存
內存存儲數據的基本單位是字節(byte),1字節等于8位(8bit)
程序和數據都存儲在內存中,內存的存儲區域是線性的,地址從0開始編號,自增排列,所以內存讀寫任何一個數據的速度基本一致
中央處理器
即CPU,32位和64位CPU最主要的區別在于一次能處理多少字節數據
32位寄存器一次能計算的最大整數是4294967295,即 2 32 2^{32} 232
32CPU配32位地址總線理論最大尋址空間為4GB,若需訪問更大內存,需通過內存分段映射(如 PAE)等技術實現邏輯擴展。所以理論上32位CPU最大只能操作4GB內存,而64位CPU尋址范圍則很大,理論上最大的尋址空間為 2 64 2^{64} 264,但受硬件和系統限制,實際支持的內存通常為 GB 至 TB 級。
指令及其周期
指令類型
指令的類型指令從功能角度劃分,可以分為 5 大類:
- 數據傳輸類型的指令,比如 store/load 是寄存器與內存間數據傳輸的指令,mov 是將一個內存地址的數據移動到另一個內存地址的指令;
- 運算類型的指令,比如加減乘除、位運算、比較大小等等,它們最多只能處理兩個寄存器中的數據;
- 跳轉類型的指令,通過修改程序計數器的值來達到跳轉執行指令的過程,比如編程中常見的 if-else、switch-case、函數調用等。
- 信號類型的指令,比如發生中斷的指令 trap;
- 閑置類型的指令,比如指令 nop,執行后 CPU 會空轉一個周期;
MIPS指令類型
- R 指令,用在算術和邏輯操作,里面有讀取和寫入數據的寄存器地址。如果是邏輯位移操作,后面還有位移操作的「位移量」,而最后的「功能碼」則是再前面的操作碼不夠的時候,擴展操作碼來表示對應的具體指令的;
- I 指令,用在數據傳輸、條件分支等。這個類型的指令,就沒有了位移量和功能碼,也沒有了第三個寄存器,而是把這三部分直接合并成了一個地址值或一個常數;
- J 指令,用在跳轉,高 6 位之外的 26 位都是一個跳轉后的地址;
指令周期
CPU讀取程序計數器對應內存地址的指令,稱為Fetch
CPU對指令進行解碼,稱為Decode
CPU執行指令,這個部分稱為Execution
CPU將計算結果存回寄存器或者將寄存器的值存入內存,這個部分稱為Store
CPU讀取[程序計數器]的值,這個值是指令的內存地址,然后CPU的[控制單元]通過[地址總線]通知內存,內存將對應數據通過[數據總線]傳給CPU,CPU的[控制單元]將收到的數據暫存到[指令寄存器],[程序計數器]自增指向下一條指令
[控制單元]解析[指令寄存器]中的指令,確定指令的類型和參數
將計算類型的指令,交給算數邏輯單元處理,其他指令由控制單元處理
最后有結果將結果寫回到內存或其他寄存器
指令的執行速度
CPU的時鐘頻率指每秒產生的脈沖信號次數,而每次脈沖信號高低電平的轉換就是一個周期,稱為時鐘周期
指令的執行主要看指令所需的CPU時鐘周期數以及CPU時鐘周期
主頻越高,CPU時鐘周期越短,CPU工作速度就越快
想要程序跑的快,可以從以下三點進行優化:
- 指令數,表示執行程序所需要多少條指令,以及哪些指令。這個層面是基本靠編譯器來優化,畢竟同樣的代碼,在不同的編譯器,編譯出來的計算機指令會有各種不同的表示方式。
- 每條指令的平均時鐘周期數 CPI,表示一條指令需要多少個時鐘周期數,現代大多數 CPU 通過流水線技術(Pipeline),讓一條指令需要的 CPU 時鐘周期數盡可能的少;
- 時鐘周期時間,表示計算機主頻,取決于計算機硬件。有的 CPU 支持超頻技術,打開了超頻意味著把 CPU 內部的時鐘給調快了,于是 CPU 工作速度就變快了,但是也是有代價的,CPU 跑的越快,散熱的壓力就會越大,CPU 會很容易奔潰。