CPU

一 什麼是CPU?
CPU的全稱是 center Processing Unit,它是電腦中最硬核的組件
二 cpu的作用
cpu的核心是從程序或應用程序獲取指令並執行計算。
分爲三個關鍵階段:
1 取指令
2 分析指令 並解碼
3 執行
CPU從系統的RAM(隨機存取存儲器)提取指令 ----》解碼指令----》Cpu相關指令執行該指令
注:RAM : 隨機存取存儲器(英語:Random Access Memory,縮寫:RAM),也叫主存,是與 CPU 直接交換數據的內部存儲器。它可以隨時讀寫(刷新時除外),而且速度很快,通常作爲操作系統或其他正在運行中的程序的臨時數據存儲介質
三 CPU的內部結構
在這裏插入圖片描述
cpu主要有兩部分構成:
控制單元和算術邏輯單元(ALU)

  • 控制單元:從內存中提取指令並解碼執行
  • 算術邏輯單元:處理算術和邏輯單元
  • CPU 是計算機的心臟和大腦,它和內存都是由許多晶體管組成的電子部件。它接收數據輸入,執行指令並處理信息。它與輸入/輸出(I / O)設備進行通信,這些設備向 CPU 發送數據和從 CPU 接收數據。
  • 從內部結構上來看
  • CPU內部由寄存器 控制器 運算器 和時鐘四部分組成
  • 在這裏插入圖片描述
  • 寄存器:是中央處理器內的組成部分,他們用來暫存指令 數據和地址 可以看做內存或緩存根據種類的不同 一個CPU內部會有20-100個寄存器
  • 在這裏插入圖片描述
  • 程序計數器:是用來存儲下一條指令所在單元的地址
  • 程序執行時,PC的初值爲程序第一條指令的地址,在順序執行程序時,控制器首先按程序計數器所指出的指令地址從內存中取出一條指令,然後分析和執行該指令,同時將PC的值加1指向下一條要執行的指令。

我們還是以一個事例爲準來詳細的看一下程序計數器的執行過程
在這裏插入圖片描述
這是一段進行相加的操作,程序啓動,在經過編譯解析後會由操作系統把硬盤中的程序複製到內存中,示例中的程序是將 123 和 456 執行相加操作,並將結果輸出到顯示器上。由於使用機器語言難以描述,所以這是經過翻譯後的結果,實際上每個指令和數據都可能分佈在不同的地址上,但爲了方便說明,把組成一條指令的內存和數據放在了一個內存地址上。

地址 0100 是程序運行的起始位置。Windows 等操作系統把程序從硬盤複製到內存後,會將程序計數器作爲設定爲起始位置 0100,然後執行程序,每執行一條指令後,程序計數器的數值會增加1(或者直接指向下一條指令的地址),然後,CPU 就會根據程序計數器的數值,從內存中讀取命令並執行,也就是說,程序計數器控制着程序的流程。
條件分支和循環機制
我們都學過高級語言,高級語言中的條件控制流程主要分爲三種:順序執行、條件分支、循環判斷三種,順序執行是按照地址的內容順序的執行指令。條件分支是根據條件執行任意地址的指令。循環是重複執行同一地址的指令。

順序執行的情況比較簡單,每執行一條指令程序計數器的值就是 + 1。
條件和循環分支會使程序計數器的值指向任意的地址,這樣一來,程序便可以返回到上一個地址來重複執行同一個指令,或者跳轉到任意指令。
下面以條件分支爲例來說明程序的執行過程(循環也很相似)
在這裏插入圖片描述
程序的開始過程和順序流程是一樣的,CPU 從0100處開始執行命令,在0100和0101都是順序執行,PC 的值順序+1,執行到0102地址的指令時,判斷0106寄存器的數值大於0,跳轉(jump)到0104地址的指令,將數值輸出到顯示器中,然後結束程序,0103 的指令被跳過了,這就和我們程序中的 if() 判斷是一樣的,在不滿足條件的情況下,指令會直接跳過。所以 PC 的執行過程也就沒有直接+1,而是下一條指令的地址。
標誌寄存器
條件和循環分支會使用到 jump(跳轉指令),會根據當前的指令來判斷是否跳轉,上面我們提到了標誌寄存器,無論當前累加寄存器的運算結果是正數、負數還是零,標誌寄存器都會將其保存(也負責溢出和奇偶校驗)
溢出(overflow):是指運算的結果超過了寄存器的長度範圍
奇偶校驗(parity check):是指檢查運算結果的值是偶數還是奇數
CPU 在進行運算時,標誌寄存器的數值會根據當前運算的結果自動設定,運算結果的正、負和零三種狀態由標誌寄存器的三個位表示。標誌寄存器的第一個字節位、第二個字節位、第三個字節位各自的結果都爲1時,分別代表着正數、零和負數。
在這裏插入圖片描述
CPU 的執行機制比較有意思,假設累加寄存器中存儲的 XXX 和通用寄存器中存儲的 YYY 做比較,執行比較的背後,CPU 的運算機制就會做減法運算。而無論減法運算的結果是正數、零還是負數,都會保存到標誌寄存器中。結果爲正表示 XXX 比 YYY 大,結果爲零表示 XXX 和 YYY 相等,結果爲負表示 XXX 比 YYY 小。程序比較的指令,實際上是在 CPU 內部做減法運算。
函數調用機制
接下來,我們繼續介紹函數調用機制,哪怕是高級語言編寫的程序,函數調用處理也是通過把程序計數器的值設定成函數的存儲地址來實現的。函數執行跳轉指令後,必須進行返回處理,單純的指令跳轉沒有意義,下面是一個實現函數跳轉的例子
在這裏插入圖片描述
圖中將變量 a 和 b 分別賦值爲 123 和 456 ,調用 MyFun(a,b) 方法,進行指令跳轉。圖中的地址是將 C 語言編譯成機器語言後運行時的地址,由於1行 C 程序在編譯後通常會變爲多行機器語言,所以圖中的地址是分散的。在執行完 MyFun(a,b)指令後,程序會返回到 MyFun(a,b) 的下一條指令,CPU 繼續執行下面的指令。

函數的調用和返回很重要的兩個指令是 call 和 return 指令,再將函數的入口地址設定到程序計數器之前,call 指令會把調用函數後要執行的指令地址存儲在名爲棧的主存內。函數處理完畢後,再通過函數的出口來執行 return 指令。return 指令的功能是把保存在棧中的地址設定到程序計數器。MyFun 函數在被調用之前,0154 地址保存在棧中,MyFun 函數處理完成後,會把0154的地址保存在程序計數器中。這個調用過程如下
在這裏插入圖片描述
在一些高級語言的條件或者循環語句中,函數調用的處理會轉換成 call 指令,函數結束後的處理則會轉換成 return 指令。
通過地址和索引實現數組
接下來我們看一下基址寄存器和變址寄存器,通過這兩個寄存器,我們可以對主存上的特定區域進行劃分,來實現類似數組的操作,首先,我們用十六進制數將計算機內存上的 00000000 - FFFFFFFF 的地址劃分出來。那麼,凡是該範圍的內存地址,只要有一個 32 位的寄存器,便可查看全部地址。但如果想要想數組那樣分割特定的內存區域以達到連續查看的目的的話,使用兩個寄存器會更加方便。

例如,我們用兩個寄存器(基址寄存器和變址寄存器)來表示內存的值
在這裏插入圖片描述
這種表示方式很類似數組的構造,數組是指同樣長度的數據在內存中進行連續排列的數據構造。用數組名錶示數組全部的值,通過索引來區分數組的各個數據元素,例如: a[0] - a[4],[]內的 0 - 4 就是數組的下標。

  • 控制器 負責把內存上的指令 數據讀入寄存器 並根據指令的結果控制計算機
  • 運算器 負責運算從內存中讀入寄存器的數據
  • 時鐘 負責發出cpu開始計時的時鐘信號
  • 接下來簡單解釋一下內存,爲什麼說 CPU 需要講一下內存呢,因爲內存是與 CPU 進行溝通的橋樑。計算機所有程序的運行都是在內存中運行的,內存又被稱爲主存,其作用是存放 CPU 中的運算數據,以及與硬盤等外部存儲設備交換的數據。只要計算機在運行中,CPU 就會把需要運算的數據調到主存中進行運算,當運算完成後CPU再將結果傳送出來,主存的運行也決定了計算機的穩定運行。

主存通過控制芯片與 CPU 進行相連,由可讀寫的元素構成,每個字節(1 byte = 8 bits)都帶有一個地址編號,注意是一個字節,而不是一個位。CPU 通過地址從主存中讀取數據和指令,也可以根據地址寫入數據。注意一點:當計算機關機時,內存中的指令和數據也會被清除。
四 CPU的執行過程
那麼 CPU 是如何執行一條條的指令的呢?

幾乎所有的馮·諾伊曼型計算機的CPU,其工作都可以分爲5個階段:取指令、指令譯碼、執行指令、訪存取數、結果寫回。

取指令階段是將內存中的指令讀取到 CPU 中寄存器的過程,程序寄存器用於存儲下一條指令所在的地址
指令譯碼階段,在取指令完成後,立馬進入指令譯碼階段,在指令譯碼階段,指令譯碼器按照預定的指令格式,對取回的指令進行拆分和解釋,識別區分出不同的指令類別以及各種獲取操作數的方法。
執行指令階段,譯碼完成後,就需要執行這一條指令了,此階段的任務是完成指令所規定的各種操作,具體實現指令的功能。
訪問取數階段,根據指令的需要,有可能需要從內存中提取數據,此階段的任務是:根據指令地址碼,得到操作數在主存中的地址,並從主存中讀取該操作數用於運算。
結果寫回階段,作爲最後一個階段,結果寫回(Write Back,WB)階段把執行指令階段的運行結果數據“寫回”到某種存儲形式:結果數據經常被寫到CPU的內部寄存器中,以便被後續的指令快速地存取;
重點:取指令----指令譯碼----執行指令—訪問數據-----結果寫回
五 總結
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章