01什么是CPU?
CPU和計(jì)算機(jī)之間的關(guān)系相當(dāng)于大腦和人類(lèi)之間的關(guān)系。它是一種小型計(jì)算機(jī)芯片,通常嵌入在計(jì)算機(jī)的主板上。CPU是通過(guò)在一個(gè)計(jì)算機(jī)芯片上放置數(shù)十億個(gè)微小的晶體管來(lái)構(gòu)建的。這些晶體管使其能夠執(zhí)行運(yùn)行存儲(chǔ)在系統(tǒng)存儲(chǔ)器中的程序所需的計(jì)算。所以,也可以說(shuō)CPU決定了你電腦的計(jì)算能力。
02 CPU實(shí)際做什么?
CPU工作的核心是從程序或應(yīng)用程序中獲取指令并執(zhí)行計(jì)算。這個(gè)過(guò)程有三個(gè)關(guān)鍵階段:提取、解碼和執(zhí)行。CPU從系統(tǒng)的RAM中獲取指令,然后對(duì)指令的實(shí)際內(nèi)容進(jìn)行解碼,最后由CPU的相關(guān)部分執(zhí)行指令。
03 CPU內(nèi)部結(jié)構(gòu)
剛才提到了很多CPU的重要性,那么CPU的內(nèi)部結(jié)構(gòu)是什么呢?它是由什么組成的?下圖顯示了一個(gè)通用程序的運(yùn)行過(guò)程(以C語(yǔ)言為例)。一般來(lái)說(shuō),了解程序的運(yùn)行過(guò)程是掌握程序運(yùn)行機(jī)制的基礎(chǔ)和前提。

通用程序操作流程
在這個(gè)過(guò)程中,CPU負(fù)責(zé)解釋和運(yùn)行最終轉(zhuǎn)換為機(jī)器語(yǔ)言的內(nèi)容。CPU主要由兩部分組成:控制單元和算術(shù)邏輯單元(ALU)。
控制單元:從存儲(chǔ)器中提取指令并對(duì)其進(jìn)行解碼以供執(zhí)行;
算術(shù)邏輯單元(ALU):處理算術(shù)和邏輯運(yùn)算。
CPU和存儲(chǔ)器都是由許多晶體管組成的電子部件,可以比作計(jì)算機(jī)的心臟和大腦。它能夠接收數(shù)據(jù)輸入、執(zhí)行指令和處理相關(guān)信息,并與向CPU發(fā)送數(shù)據(jù)和從CPU接收數(shù)據(jù)的輸入/輸出(I/O)設(shè)備進(jìn)行通信。
從功能的角度來(lái)看,CPU的內(nèi)容由四個(gè)部分組成:寄存器、控制器、算術(shù)單元和時(shí)鐘,每個(gè)部分都通過(guò)通電信號(hào)連接。
接下來(lái),讓我們簡(jiǎn)單介紹一下內(nèi)存。當(dāng)談到CPU時(shí),為什么我們需要談?wù)搩?nèi)存?因?yàn)閮?nèi)存是與CPU通信的橋梁。計(jì)算機(jī)中的所有程序都在內(nèi)存中運(yùn)行。存儲(chǔ)器通常稱(chēng)為主存儲(chǔ)器,其功能是存儲(chǔ)CPU中的操作數(shù)據(jù)以及與硬盤(pán)等外部存儲(chǔ)設(shè)備交換的數(shù)據(jù)。
當(dāng)計(jì)算機(jī)運(yùn)行時(shí),CPU會(huì)將需要計(jì)算的數(shù)據(jù)傳輸?shù)街鞔鎯?chǔ)器中進(jìn)行操作。操作完成后,CPU發(fā)送結(jié)果,主存儲(chǔ)器的操作也決定了計(jì)算機(jī)的穩(wěn)定運(yùn)行。主存儲(chǔ)器通常通過(guò)控制芯片連接到CPU,由可讀寫(xiě)元件組成,每個(gè)字節(jié)都有一個(gè)地址號(hào)。
CPU通過(guò)地址從主存儲(chǔ)器讀取數(shù)據(jù)和指令,也可以根據(jù)地址寫(xiě)入數(shù)據(jù)。請(qǐng)注意,當(dāng)計(jì)算機(jī)關(guān)閉時(shí),內(nèi)存中的指令和數(shù)據(jù)也將被清除。
04 CPU是寄存器的集合
在CPU的四種結(jié)構(gòu)中,寄存器的重要性遠(yuǎn)高于其他三種,為什么我們這么說(shuō)?因?yàn)槌绦蛲ǔ⒓拇嫫髅枋鰹閷?duì)象。談到寄存器,我們必須談?wù)搮R編語(yǔ)言,談到匯編語(yǔ)言,我們必須討論高級(jí)語(yǔ)言,當(dāng)我們談?wù)摳呒?jí)語(yǔ)言時(shí),我們必須提到語(yǔ)言的概念。
05計(jì)算機(jī)語(yǔ)言
人與人之間最古老、最直接的通信媒介是語(yǔ)言,但要與計(jì)算機(jī)通信,必須根據(jù)計(jì)算機(jī)指令進(jìn)行交換,這涉及到語(yǔ)言問(wèn)題。最早,為了解決計(jì)算機(jī)和人類(lèi)之間的通信問(wèn)題,出現(xiàn)了匯編語(yǔ)言。然而,匯編語(yǔ)言晦澀難懂,因此有C、C++和Java等高級(jí)語(yǔ)言。因此,計(jì)算機(jī)語(yǔ)言通常分為低級(jí)語(yǔ)言和高級(jí)語(yǔ)言。用高級(jí)語(yǔ)言編寫(xiě)的程序只有在編譯并轉(zhuǎn)換為機(jī)器語(yǔ)言后才能運(yùn)行,而匯編語(yǔ)言可以由匯編程序轉(zhuǎn)換為機(jī)器語(yǔ)。
06匯編語(yǔ)言
這是用匯編語(yǔ)言編寫(xiě)程序的一部分。匯編語(yǔ)言使用助記符來(lái)編寫(xiě)程序。每個(gè)原本是電信號(hào)的機(jī)器語(yǔ)言指令都有相應(yīng)的助記符。例如,mov和add分別是數(shù)據(jù)存儲(chǔ)(移動(dòng))和加法的簡(jiǎn)寫(xiě)。
匯編語(yǔ)言和機(jī)器語(yǔ)言有一對(duì)一的對(duì)應(yīng)關(guān)系,這與高級(jí)語(yǔ)言不同。我們通常將用匯編語(yǔ)言編寫(xiě)的程序轉(zhuǎn)換為機(jī)器語(yǔ)言。這個(gè)過(guò)程稱(chēng)為組裝。相反,將機(jī)器語(yǔ)言轉(zhuǎn)換為匯編語(yǔ)言的過(guò)程被稱(chēng)為反匯編。
匯編語(yǔ)言可以幫助你理解計(jì)算機(jī)的功能。機(jī)器語(yǔ)言級(jí)別的程序是通過(guò)寄存器處理的。上面代碼中的eax和ebp都是寄存器,它們是CPU內(nèi)部寄存器的名稱(chēng)。因此,可以說(shuō)CPU是一系列寄存器的集合。
通常,存儲(chǔ)器中的存儲(chǔ)器由地址號(hào)表示,寄存器的類(lèi)型由名稱(chēng)區(qū)分。這些不同類(lèi)型的CPU具有不同類(lèi)型和數(shù)量的內(nèi)部寄存器,以及存儲(chǔ)在寄存器中的值的范圍。
07程序計(jì)數(shù)器
程序計(jì)數(shù)器用于存儲(chǔ)下一條指令所在單元的地址。當(dāng)程序被執(zhí)行時(shí),PC的初始值被用作程序的第一條指令的地址。當(dāng)順序執(zhí)行程序時(shí),控制器首先根據(jù)程序計(jì)數(shù)器指示的指令地址從存儲(chǔ)器中取出指令,然后分析并執(zhí)行該指令。同時(shí),PC的值增加1,指向要執(zhí)行的下一條指令。
我們可以通過(guò)一個(gè)例子來(lái)仔細(xì)觀察程序計(jì)數(shù)器的執(zhí)行情況:

程序計(jì)數(shù)器執(zhí)行
這是一個(gè)添加操作,程序啟動(dòng),經(jīng)過(guò)編譯和解析后,硬盤(pán)中的程序?qū)⑼ㄟ^(guò)操作系統(tǒng)復(fù)制到內(nèi)存中。
上述示例程序是執(zhí)行123和456的相加操作,然后將結(jié)果輸出到顯示器。因?yàn)楹茈y用機(jī)器語(yǔ)言描述,所以這些都是翻譯后的結(jié)果。
事實(shí)上,每個(gè)指令和數(shù)據(jù)可以分布在不同的地址,但為了更好地說(shuō)明,組成指令的存儲(chǔ)器和數(shù)據(jù)被放置在一個(gè)存儲(chǔ)器地址。
地址0100是程序運(yùn)行的起始位置。Windows和其他操作系統(tǒng)將程序從硬盤(pán)復(fù)制到內(nèi)存后,會(huì)將程序計(jì)數(shù)器設(shè)置為起始位置0100,然后執(zhí)行程序。每次執(zhí)行指令后,計(jì)數(shù)器的值都會(huì)增加1,或者直接指向下一條指令的地址。
然后,CPU將從存儲(chǔ)器中讀取命令,并根據(jù)程序計(jì)數(shù)器的值執(zhí)行該命令。換句話(huà)說(shuō),程序計(jì)數(shù)器控制程序的流程。
08有條件的分支和循環(huán)機(jī)制
高級(jí)語(yǔ)言總結(jié)的條件控制流主要分為三種類(lèi)型:順序執(zhí)行、條件分支和循環(huán)判斷。
順序執(zhí)行是按照地址內(nèi)容的順序執(zhí)行命令。
條件分支是根據(jù)條件在任意地址執(zhí)行指令。
循環(huán)是指重復(fù)執(zhí)行相同地址的指令。
通常,順序執(zhí)行的情況相對(duì)簡(jiǎn)單,每次執(zhí)行指令時(shí)程序計(jì)數(shù)器的值為+1。條件分支和循環(huán)分支使程序計(jì)數(shù)器指向任意地址,這樣程序就可以返回到前一個(gè)地址來(lái)重復(fù)相同的指令,或者跳到任何其他指令。
下面,我們以條件分支為例來(lái)說(shuō)明程序的執(zhí)行過(guò)程:

程序的啟動(dòng)過(guò)程與順序流程相同,程序的順序流程與啟動(dòng)過(guò)程相同。CPU從0100開(kāi)始執(zhí)行命令。它在0100和0101中依次執(zhí)行。PC的值為+1的順序。當(dāng)執(zhí)行0102地址的指令時(shí),判斷0106寄存器的值大于0,并跳到0104地址的指令。然后將該值輸入到顯示器,然后結(jié)束程序,跳過(guò)0103的指令。這與我們程序中的if()判斷相同。如果不滿(mǎn)足條件,通常會(huì)直接跳過(guò)指令。因此,PC的執(zhí)行不是直接+1,而是下一條指令的地址。
09標(biāo)志寄存器
條件分支和循環(huán)分支將使用跳轉(zhuǎn)(跳轉(zhuǎn)指令),它將根據(jù)當(dāng)前指令決定是否跳轉(zhuǎn)。我們?cè)谏厦嫣岬搅藰?biāo)志寄存器。無(wú)論當(dāng)前累積寄存器的運(yùn)算結(jié)果是正、負(fù)還是零,標(biāo)志寄存器都將被保存。當(dāng)CPU執(zhí)行操作時(shí),標(biāo)志寄存器的值將根據(jù)當(dāng)前操作的結(jié)果自動(dòng)設(shè)置,并且操作結(jié)果的正、負(fù)和零狀態(tài)由標(biāo)志寄存器的三位表示。
當(dāng)標(biāo)志寄存器的第一字節(jié)位、第二字節(jié)位和第三字節(jié)位的相應(yīng)結(jié)果均為1時(shí),它們分別表示正數(shù)、零和負(fù)數(shù)。

標(biāo)志寄存器
CPU的執(zhí)行機(jī)制很有趣。假設(shè)存儲(chǔ)在累加寄存器中的XXX與存儲(chǔ)在通用寄存器中的YYY進(jìn)行比較。在比較的背后,CPU的操作機(jī)制將執(zhí)行減法運(yùn)算。無(wú)論減法運(yùn)算的結(jié)果是正、零還是負(fù),它都將存儲(chǔ)在標(biāo)志寄存器中。陽(yáng)性結(jié)果表示XXX大于YYY,結(jié)果為零表示XXX和YYY相等,陰性結(jié)果表示XXX小于YYY。程序比較指令實(shí)際上是CPU內(nèi)部的減法運(yùn)算。
10功能調(diào)用機(jī)制
函數(shù)調(diào)用和條件分支,循環(huán)機(jī)制不同,簡(jiǎn)單的跳轉(zhuǎn)指令無(wú)法實(shí)現(xiàn)函數(shù)調(diào)用。函數(shù)調(diào)用需要在函數(shù)內(nèi)部進(jìn)行處理后,處理流程返回到函數(shù)調(diào)用點(diǎn)(函數(shù)調(diào)用指令的下一個(gè)地址)。函數(shù)調(diào)用處理是通過(guò)將程序計(jì)數(shù)器的值設(shè)置為函數(shù)的存儲(chǔ)器地址來(lái)實(shí)現(xiàn)的。
11通過(guò)地址和索引實(shí)現(xiàn)數(shù)組
接下來(lái)是基址寄存器和索引寄存器,通過(guò)它們可以劃分主存儲(chǔ)器上的特定區(qū)域,以實(shí)現(xiàn)類(lèi)似陣列的操作。首先,計(jì)算機(jī)內(nèi)存中00000000-FFFFFFFFF的地址可以用十六進(jìn)制數(shù)劃分。這樣,對(duì)于這個(gè)范圍內(nèi)的任何內(nèi)存地址,只要有一個(gè)32位寄存器,就可以查看所有地址。然而,如果你想劃分一個(gè)特定的內(nèi)存區(qū)域進(jìn)行連續(xù)查看,比如數(shù)組,那么使用兩個(gè)寄存器更方便,例如,我們使用兩個(gè)注冊(cè)表來(lái)表示內(nèi)存的值。
這種表示方式與數(shù)組的結(jié)構(gòu)非常相似。數(shù)組是指在存儲(chǔ)器中連續(xù)排列相同長(zhǎng)度的數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)。使用數(shù)組名稱(chēng)表示數(shù)組的所有值,并通過(guò)索引區(qū)分?jǐn)?shù)組的每個(gè)數(shù)據(jù)元素,例如,a[0]-a[4],[]中的0-4是數(shù)組的下標(biāo)。
12CPU指令執(zhí)行過(guò)程
說(shuō)了這么多,CPU是如何一個(gè)接一個(gè)地執(zhí)行指令的?馮·諾依曼型計(jì)算機(jī)的幾乎所有CPU都可以在五個(gè)階段工作:指令獲取、指令解碼、執(zhí)行指令、訪問(wèn)數(shù)據(jù)和寫(xiě)回結(jié)果。指令獲取階段是將存儲(chǔ)器中的指令讀取到CPU中的寄存器的過(guò)程,程序寄存器用于存儲(chǔ)下一條指令的地址。
指令提取完成后,立即進(jìn)入指令解碼階段。在指令解碼階段,指令編碼器根據(jù)預(yù)指令格式對(duì)提取的指令進(jìn)行拆分和解釋?zhuān)⒆R(shí)別和區(qū)分不同的指令類(lèi)別和各種方法以獲得操作數(shù);
執(zhí)行指令階段的任務(wù)是完成指令指定的各種操作,具體實(shí)現(xiàn)指令的功能;
存取取階段的任務(wù)是:根據(jù)指令地址碼,獲取主內(nèi)存中操作數(shù)的地址,并從主內(nèi)存中讀取操作數(shù)進(jìn)行操作;
結(jié)果回寫(xiě)階段:作為最后一個(gè)階段,執(zhí)行指令階段的運(yùn)算結(jié)果數(shù)據(jù)被“回寫(xiě)”到某種存儲(chǔ)形式:結(jié)果數(shù)據(jù)通常被寫(xiě)入CPU的內(nèi)部寄存器,以便后續(xù)指令能夠快速訪問(wèn)。
電話(huà)
微信

抖音
