计算机基础--认识CPU
計算機基礎- -認識CPU
文章目錄
- 計算機基礎- -認識CPU
- 一、CPU是什么
- 二、CPU實際做什么
- 三、CPU的內部結構
- 1.程序編譯執行的過程
- 2.CPU是寄存器的集合體
- 計算機語言
- 匯編語言
- 3.程序計數器
- 4.條件分支和循環機制
- 5.標志寄存器
- 5.函數調用機制
- 6.通過地址和索引實現數組
- 四、CPU指令執行過程
大家都是程序員,大家都是和計算機打交道的程序員,大家都是和計算機中軟件硬件打交道的程序員,大家都是和CPU打交道的程序員, 所以, 不管你是玩兒硬件的還是做軟件的, 你的世界都少不了 計算機最核心的-CPU
一、CPU是什么
CPU的全稱是Central Processing Unit, 它是你的電腦中最硬核的組件, 這種說法一點不為過,一點不夸張。
CPU是能夠讓你的計算機叫計算機的核心組件, 但是它卻不能代表你的電腦。
CPU與計算機的關系就相當于大腦和人的關系。它是一種小型的計算機芯片,它嵌入在臺式機、筆記本電腦或者平板電腦的主板上。
通過在單個計算機芯片上放置數十億個微型晶體管來構建CPU。這些晶體管使它能夠執行、運行存儲在系統內存中的程序所需的計算, 也就是說CPU決定了你電腦的計算能力
二、CPU實際做什么
- CPU的核心是從程序或應用程序獲取指令并執行計算。此過程可以分為三個關鍵階段:提取、解碼和執行。
- CPU從系統的RAM中提取指令, 然后解碼該指令的實際內容,然后再由CPU的相關部分執行該指令。
RAM:隨機存取存儲器(英語:Random Access Memory, 縮寫:RAM) , 也叫主存, 是與CPU直接交換數據的內部存儲器。它可以隨時讀寫(刷新時除外) , 而且速度很快,通常作為操作系統或其他正在運行中的程序的臨時數據存儲介質
三、CPU的內部結構
說了這么多CPU的重要性, 那么CPU的內部結構是什么呢?又是由什么組成的呢?
下圖展示了一般程序的運行流程(以C語言為例),可以說 了解程序的運行流程是掌握程序運行機制的基礎和前提。
1.程序編譯執行的過程
-
在這個流程中, CPU負責的就是解釋和運行最終轉換成機器語言的內容。
-
CPU主要由兩部分構成:
-
控制單元和算術邏輯單元(ALU)
-
● 控制單元:從內存中提取指令并解碼執行
-
● 算數邏輯單元(ALU) :處理算數和邏輯運算
-
CPU是計算機的心臟和大腦, 它和內存都是由許多晶體管組成的電子部件。
-
它接收數據輸入, 執行指令并處理信息。它與輸入/輸出(I/O) 設備進行通信, 這些設備向CPU發送數據和從CPU接收數 據。
-
從功能來看, CPU的內部由寄存器、控制器、運算器和時鐘四部分組成, 各部分之間通過電信號連通。
-
CPU內部結構圖
-
寄存器是中央處理器內的組成部分。它們可以用來暫存指令、數據和地址。可以將其看作是內存的一種。根據種類的不同, 一個CPU內部會有20-100個寄存器。
-
控制器負責把內存上的指令、數據讀入寄存器,并根據指令的結果控制計算機
-
運算器負責運算從內存中讀入寄存器的數據
-
時鐘負責發出CPU開始計時的時鐘信號
-
接下來簡單解釋一下內存, 為什么說CPU需要講一下內存呢, 因為內存是與CPU進行溝通的橋梁。
-
👏計算機所有程序的運行都是在內存中運行的, 內存又被稱為主存, 其作用是存放CPU中的運算數據,以及與硬盤等外部存儲設備交換的數據。
-
👏只要計算機在運行中, CPU就會把需要運算的數據調到主存中進行運算, 當運算完成后CPU再將結果傳送出來, 主存的運行也決定了計算機的穩定運行。
-
👏主存通過控制芯片與CPU進行相連, 由可讀寫的元素構成, 每個字節(1byte=8bits) 都帶有一個地址編號, 注意是一個字節, 而不是一個位。
-
👏CPU通過地址從主存中讀取數據和指令, 也可以根據地址寫入數據。注意一點:當計算機關機時,內存中的指令和數據也會被清除
2.CPU是寄存器的集合體
在CPU的四個結構中, 我們程序員只需要了解寄存器就可以了, 其余三個不用過多關注, 為什么這么說?因為程序是把寄存器作為對象來描述的。
計算機語言
我們生而為人最明顯的一個特征是我們能通過講話來實現彼此的交流,但是計算機聽不懂你說的話,你要想和他交流必須按照計算機指令來交換,這就涉及到語言的問題
計算機是由二進制構成的,它只能聽的懂二進制也就是機器語言,但是普通人是無法看懂機器語言的,這個時候就 需要一種電腦既能識別,人又能理解的語言
最先出現的就是匯編語言。但是匯編語言晦澀難懂,所以又出現了像是C,C++, Java的這種高級語言。
- 所以計算機語言一般分為兩種:低級語言(機器語言,匯編語言)和高級語言。使用高級語言編寫的程序,經過編譯轉換成機器語言后才能運行,而匯編語言經過匯編器才能轉換為機器語言。
匯編語言
首先來看一段用匯編語言表示的代碼清單
這是采用匯編語言(assembly) 編寫程序的一部分。匯編語言采用助記符(me monic)
每一個原本是電信號的機器語言指令會有一個與其對應的助記符, 例如mov, add
來編寫程序,分別是數據的存儲(move) 和相加(addition) 的簡寫。
匯編語言和機器語言是一一對應的,這一點和高級語言有很大的不同。
- 通常我們將匯編語言編寫的程序轉換為機器語言的過程稱為語言的過程稱為反匯編,將機器語言轉化為匯編語言稱為匯編
匯編語言能夠幫助你理解計算機做了什么工作,機器語言級別的程序是通過寄存器來處理的,上面代碼中的eax,ebp都是表示的寄存器, 是CPU內部寄存器的名稱, 所以可以說CPU是一系列寄存器的集合體。
- 在內存中的存儲通過地址編號來表示,而寄存器的種類則通過名字來區分。
- 不同類型的CPU, 其內部寄存器的種類, 數量以及寄存器存儲的數值范圍都是不同的。
不過, 根據功能的不同,可以將寄存器劃分為下面這幾類
- 其中程序計數器、累加寄存器、標志寄存器、指令寄存器和棧寄存器都只有一個,其他寄存器一般有多個。
3.程序計數器
- 程序計數器(Program Counter) 是用來存儲下一條指令所在單元的地址。
- 程序執行時,PC的初值為程序第一條指令的地址,在順序執行程序時,控制器首先按程序計數器所指出的指令地址從內存中取出一條指令,然后分析和執行該指令,同時將PC的值加1指向下一條要執行的指令。
- 我們還是以一個事例為準來詳細的看一下程序計數器的執行過程程序計數器數值的變化
- 這是一段進行相加的操作,程序啟動,在經過編譯解析后會由操作系統把硬盤中的程序復制到內存中
- 示例中的程序是將123和456執行相加操作,并將結果輸出到顯示器上。
- 由于使用機器語言難以描述,所以這是經過翻譯后的結果,實際上每個指令和數據都可能分布在不同的地址上,但為了方便說明,把組成一條指令的內存和數據放在了一個內存地址上。
- 地址 0100是程序運行的起始位置。Windows等 操作系統把程序從硬盤復制到內存后, 會將程序計數器作為設定為起始位置0100,然后執行程序,每執行一條指令后,程序計數器的數值會增加1(或者直接指向下一條指令的地址) 👏
- 然后, CPU就會根據程序計數器的數值, 從內存中讀取命令并執行, 也就是說,程序計數器控制著程序的流程
4.條件分支和循環機制
-
我們都學過高級語言,高級語言中的條件控制流程主要分為三種:順序執行、條件分支、循環判斷三種
-
順序執行是按照地址的內容順序的執行指令。條件分支是根據條件執行任意地址的指令。循環是重復執行同一地址的指令。
-
順序執行的情況比較簡單,每執行一條指令程序計數器的值就是+1。
-
條件和循環分支會使程序計數器的值指向任意的地址,這樣一來,程序便可以返回到上一個地址來重復執行同一個指令,或者跳轉到任意指令。
下面以條件分支為例來說明程序的執行過程(循環也很相似)
- 程序的開始過程和順序流程是一樣的, CPU從0100處開始執行命令, 在0100和0101都是順序執行,PC的值順序+1
- 執行到0102地址的指令時, 判斷0106寄存器的數值大于0, 跳轉(jump) 到0104地址的指令,將數值輸出到顯示器中,然后結束程序
- 0103的指令被跳過了,這就和我們程序中的判斷是一樣的,在不滿足條件的情況下,指令會直接跳過。所以PC的執行過程也就沒有直接+1,而是下一條指令的地址。
5.標志寄存器
- 條件和循環分支會使用到jump(跳轉指令) , 會根據當前的指令來判斷是否跳轉
- 上面我們提到了標志寄存器,無論當前累加寄存器的運算結果是正數、負數還是零,標志寄存器都會將其保存(也負責溢出和奇偶校驗)
溢出(overflow) :是指運算的結果超過了寄存器的長度范圍
奇偶校驗(parity check) :是指檢查運算結果的值是偶數還是奇數
-
CPU在進行運算時, 標志寄存器的數值會根據當前運算的結果自動設定, 運算結果的正、負和零三種狀態由標志寄存器的三個位表示。
-
標志寄存器的第一個字節位、第二個字節位、第三個字節位各自的結果都為1時,分別代表著正數、零和負數。
-
CPU的執行機制比較有意思, 假設累加寄存器中存儲的XXX和通用寄存器中存儲的YYY做比較
-
執行比較的背后, CPU的運算機制就會做減法運算。而無論減法運算的結果是正數、零還是負數, 都會保存到標志寄存器中。
-
結果為正表示XXX比YYY大,結果為零表示XXX和YYY相等,結果為負表示
XXX比YYY小。程序比較的指令, 實際上是在CPU內部做減法運算。
5.函數調用機制
接下來,我們繼續介紹函數調用機制,哪怕是高級語言編寫的程序,函數調用處理也是通過把程序計數器的值設定成函數的存儲地址來實現的。
- 函數執行跳轉指令后,必須進行返回處理,單純的指令跳轉沒有意義
下面是一個實現函數跳轉的例子
- 圖中將變量a和b分別賦值為123和456, 調用My Fun(a, b) 方法, 進行指令跳轉。
- 圖中的地址是將C語言編譯成機器語言后運行時的地址,由于1行C程序在編譯后通常會變為多行機器語言,所以圖中的地址是分散的。
- 在執行完My Fun(a ,b) 指令后, 程序會返回到My Fun(a, b) 的下一條指令, CPU繼續執行下面的指令。
- 函數的調用和返回很重要的兩個指令是call和return指令
- 在將函數的入口地址設定到程序計數器之前, call指令會把調用函數后要執行的指令地址存儲在名為棧的主存內。
- 函數處理完畢后, 再通過函數的出口來執行return指令。return指令的功能是把保存在棧中的地址設定到程序計數器。
- My Fun函數在被調用之前, 0154地址保存在棧中, My Fun函數處理完成后, 會把0154的地址保存在程序計數器中。
這個調用過程如下
- 在一些高級語言的條件或者循環語句中, 函數調用的處理會轉換成call指令, 函數結束后的處理則會轉換成return指令。
6.通過地址和索引實現數組
- 接下來我們看一下基址寄存器和變址寄存器,通過這兩個寄存器,我們可以對主存上的特定區域進行劃分,來實現類似數組的操作
- 首先,我們用十六進制數將計算機內存上的00000000-FFFFFFFF的地址劃分出來。
- 那么,凡是該范圍的內存地址,只要有一個32位的寄存器,便可查看全部地址
- 但如果想要想數組那樣分割特定的內存區域以達到連續查看的目的的話,使用兩個寄存器會更加方便。
- 例如,我們用兩個寄存器(基址寄存器和變址寄存器)來表示內存的值
- 這種表示方式很類似數組的構造,數組是指同樣長度的數據在內存中進行連續排列的數據構造。
- 用數組名表示數組全部的值,通過索引來區分數組的各個數據元素,例如:a[0]-a[4],[]內的0-4就是數組的下標。
四、CPU指令執行過程
那么CPU是如何執行一條條的指令的呢?
- 幾乎所有的馮·諾伊曼型計算機的CPU, 其工作都可以分為5個階段:取指令、指令譯碼、執行指令、訪存取數、結果寫回。
- 👏取指令階段是將內存中的指令讀取到CPU中寄存器的過程, 程序寄存器用于存儲下一條指令所 在的地址
- 指令譯碼階段,在取指令完成后,立馬進入指令譯碼階段,在指令譯碼階段,指令譯碼器按照預定的指令格式,對取回的指令進行拆分和解釋,識別區分出不同的指令類別以及各種獲取操作數的方法。
- 執行指令階段,譯碼完成后,就需要執行這一條指令了,此階段的任務是完成指令所規定的各種操作,具體實現指令的功能。
- 訪問取數階段,根據指令的需要,有可能需要從內存中提取數據,此階段的任務是:根據指令地址碼,得到操作數在主存中的地址,并從主存中讀取該操作數用于運算。
- 結果寫回階段, 作為最后一個階段, 結果寫回(WriteBack, WB) 階段把執行指令階段的運行結果數據“寫回”到某種存儲形式:結果數據經常被寫到CPU的內部寄存器中, 以便被后續的指令快速地存取;
總結
以上是生活随笔為你收集整理的计算机基础--认识CPU的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 进程和线程基础知识(已经是最详细的啦)
- 下一篇: 计算机基础- -计算机为什么要使用二进制