前言
看了網(wǎng)上的一些描述CPU執(zhí)行程序的過程,發(fā)現(xiàn)他們涉及到的內(nèi)容太多了,恨不能把整個(gè)CPU的底層結(jié)構(gòu)都拿出來(lái)說(shuō),這對(duì)計(jì)算機(jī)理論知識(shí)匱乏的新人甚至是一些老人都是非常不友好的。這個(gè)問題也是當(dāng)初攔在我面前的一只大老虎,把這個(gè)原理寫出來(lái)也有助于我自己的深入理解。
YouTube上的一個(gè)視頻How does CPU execute program,是一個(gè)很好的CPU執(zhí)行程序原理的總結(jié),英文水平還行的人建議看原視頻,就不用聽我瞎BB了。雖然沒有字幕,如果能看懂里面的PPT,就基本能理解了。
以下內(nèi)容主要是將視頻內(nèi)容大致解釋一下,是寫給英文水平欠缺一點(diǎn)或者沒辦法看原視頻的人看的。如有錯(cuò)誤,歡迎指正。
相關(guān)術(shù)語(yǔ)
RAM:指內(nèi)存,斷電后內(nèi)容無(wú)法保存,因此叫做易失性存儲(chǔ);另一個(gè)相關(guān)的概念是ROM,一般指外存,例如硬盤。RAM的速度遠(yuǎn)快于ROM,CPU與內(nèi)存直接進(jìn)行數(shù)據(jù)交換。
CPU:計(jì)算機(jī)的所有計(jì)算操作都由它執(zhí)行,只要先記住它是一塊有輸入和輸出的集成電路就行了。
Instruction:指令,是CPU進(jìn)行操作的基本單元,大致包含操作對(duì)象、操作對(duì)象的地址、對(duì)操作對(duì)象進(jìn)行何種操作。
RAM相關(guān)結(jié)構(gòu)
程序要想被CPU執(zhí)行,首先要被編譯成CPU可以執(zhí)行的指令操作,這里就不詳細(xì)介紹,本文就假設(shè)程序已經(jīng)被編譯好了,放在了內(nèi)存中。內(nèi)存中存放的數(shù)據(jù)分為兩類,一類是指令;另一類是數(shù)據(jù),不管是指令還是數(shù)據(jù)都有其對(duì)應(yīng)的地址。
下圖就是接下來(lái)我們將會(huì)涉及的內(nèi)存結(jié)構(gòu),這是從視頻中直接截取下來(lái)的,大家將就著看。
在上圖中,現(xiàn)在已經(jīng)存放了地址為100、104、108、112的一系列指令;地址為2000、2004、2008的一系列數(shù)據(jù)。
CPU相關(guān)結(jié)構(gòu)
這里只放出CPU的執(zhí)行指令時(shí)涉及的基本結(jié)構(gòu),真實(shí)的情況還會(huì)復(fù)雜很多。
這里涉及到的結(jié)構(gòu)有Program Counter(程序計(jì)數(shù)器)、Instruction Register(指令寄存器)、Data Register(數(shù)據(jù)寄存器)、ALU(算數(shù)邏輯單元),可以將計(jì)數(shù)器、寄存器都可以簡(jiǎn)單理解為存放數(shù)據(jù)的器件。上述程序計(jì)數(shù)器用來(lái)存放指令的地址;指令寄存器用來(lái)存放指令(初學(xué)者可能會(huì)搞混數(shù)據(jù)和地址的區(qū)別,稍加區(qū)分就可以分辨);數(shù)據(jù)寄存器存放參與計(jì)算的數(shù)據(jù),下圖中的A、B、C都是數(shù)據(jù)寄存器;ALU就是用于計(jì)算的器件。
執(zhí)行過程
本文內(nèi)容為便于理解,僅涉及到CPU和內(nèi)存間的數(shù)據(jù)交換。
在了解了RAM和CPU相關(guān)結(jié)構(gòu)之后,接下來(lái)就可以正式開始說(shuō)明執(zhí)行的過程,其實(shí)就是對(duì)以上敘述內(nèi)容的一個(gè)組合。
- 程序計(jì)數(shù)器初始內(nèi)容為100,指向內(nèi)存中的某一項(xiàng)指令,注意100指的是地址;
- 指令寄存器根據(jù)程序計(jì)算器的指向地址,將內(nèi)存中地址為100的指令抓取到自身,此時(shí)存放LOAD A,2000;
- CPU按照指令內(nèi)容,將內(nèi)存地址為2000的數(shù)據(jù),上載到數(shù)據(jù)寄存器A中,此時(shí)CPU和RAM的狀態(tài)如下圖所示;
- 以上3步已完成一個(gè)指令的基本操作步驟。接下來(lái)程序計(jì)數(shù)器依次指向104指令地址、108指令地址、112指令地址,分別完成將2004地址的數(shù)據(jù)賦值給B數(shù)據(jù)寄存器;ALU將A、B內(nèi)的數(shù)據(jù)相乘賦值給C數(shù)據(jù)寄存器;將C數(shù)據(jù)寄存器數(shù)據(jù)寫入內(nèi)容地址2008中。
- 這樣就完成了50×0.1這個(gè)簡(jiǎn)單程序的計(jì)算,最后CPU和RAM所處狀態(tài)如下圖所示。
