如果你只知道CPU是中央處理器的話,那可能對你并沒有什么用,那么作為程序員的我們,必須要搞懂的就是CPU這家伙是如何運行的,尤其要搞懂它里面的寄存器是怎么一回事,因為這將讓你從底層明白程序的運行機制。
隨我一起,來好好認識下CPU這貨吧
把CPU掰開來看
對于CPU來說,我們首先就要搞明白它是怎么回事,也就是它的內部構造,當然,CPU那么牛的一個東西,構造一定是極其復雜的,畢竟是超高科技玩意,所以啊,我們今天說的組成什么的,都是指的主要的,對我們程序員有用的,需要了解的那一部分,切莫抬杠哦
首先嘞,我希望你先記住這句話:
CPU所負責的就是解釋和運行最終轉換成機器語言的程序內容
另外啊,說起CPU,一定離不開內存,在今天的介紹中,也會簡單的說說內存,因為后期也會單獨出一篇講解下內存,畢竟了解這些對我們程序員來說很重要的,所以CPU和內存經常在一塊來講,他們其實是有很多的晶體管組成的,一般稱他們?yōu)?a target="_blank">IC,也就是集成電路的意思。
接下來我們就來看看CPU的組成,注意我之前說的,這里說的組成一般是指的主要部分,畢竟CPU結構復雜。
我們需要知道的CPU結構
重點需要關注寄存器
運算器
字面意思理解就是跟運算有關的,簡單說就是負責運算從內存讀取到寄存器中的數(shù)據(jù),可以看作一個數(shù)據(jù)加工廠,就是對寄存器中的數(shù)據(jù)做運算,這些運算包含基本的算術和邏輯運算。
然后對于運算器來說,我們要了解其中的幾個重要角色,接下來我會挨個介紹:
算術邏輯單元(ALU)
這個是運算器中重要的一個組成,主要負責的就是對數(shù)據(jù)的處理,從而實現(xiàn)對數(shù)據(jù)的算術和邏輯運算
累計寄存器(AC)
通常叫做累計器,是一個通用寄存器,這個有啥用呢?上面說的ALU,當ALU處理完算術運算或者邏輯運算之后,會得到一個結果,這個結果就會保存在AC中
數(shù)據(jù)緩沖寄存器(DR)
這個DR也是存放數(shù)據(jù)的,存放的主要是從內存讀取過來的數(shù)據(jù),會暫時存放在這個DR中,這里就相當于內存和CPU之間做數(shù)據(jù)傳送的一個中轉站,為啥會有這個,大家都是到CPU和內存的速度是有很大差別的,中間引入一個DR,一定程度上起到了速度上的緩沖作用,不至于速度相差太猛
狀態(tài)條件寄存器(PSW)
這個貌似有點不好理解,首先寄存器還是保存數(shù)據(jù)的,所以PSW自然也是保存某一類數(shù)據(jù)的,它保存的主要是由算術指令和邏輯指令運行或者測試的結果建立的各種條件碼內容,一般分為狀態(tài)標志和控制標志,知道就行
我們需要了解以上的這幾個組成部分,這都是運算器的核心,另外需要特別說一下的就是它們每一個其實都有一個英文縮寫,比如ALU就是算術邏輯單元的意思,為啥要說這個嘞,因為英文縮寫畢竟簡便而且有逼格,所以我們一般交流的時候會說ALU而不是算術邏輯單元,因此,記住他們的縮寫也很重要哦。
不然跟別人交流起來的話,別人一出口就是ALU,DR啥的,你很容易跟不上節(jié)奏啊。
對CPU中的運算器有個基本認識以后,我們再來看看另外一個重要組成 控制器
控制器
控制控制,也就是起到一個控制作用,上面介紹的運算器只是起到了運算的功能,但是控制器就比較牛,它是控制整個CPU的工作,對于控制器,一般要能夠保證程序的正確執(zhí)行以及能夠處理異常事件
同樣的,對于控制器來說,我們需要重點關注如下幾個:
指令寄存器(IR)
寄存器是保存東西的,指令寄存器自然就是保存指令的,也就是說CPU要執(zhí)行一條指令的話,需要先把指令從內存上讀取,然后放到我們上面說的數(shù)據(jù)緩沖寄存器中,之后再從DR放到IR中,接著嘞,會有一個叫做指令譯碼器的東西根據(jù)IR的內容生成很多的微操作指令,從而去控制其他部件已完成相應的功能
程序計數(shù)器(PC)
這個學過Java內存結構的應該了解,它保存著下一條要執(zhí)行的指令,也就是說當一個程序要執(zhí)行的時候,會把這個程序的起始地址存到這個PC中,如果這個指令被執(zhí)行的話也不用擔心,CPU會自動修改,使得PC存放下一條要執(zhí)行的指令
地址寄存器(AR)
這個就是保存著CPU訪問內存上的那一塊內存的內存地址,為啥要保存這個,因為CPU和內存速度相差比較大,所以CPU要保存著正在訪問的那塊內存的地址,直到內存的讀寫操作完成,不然,找不到之前訪問的是哪個內存單元了啊
指令譯碼器(ID)
簡單點就是對指令做分析的,看看你這個指令要干啥
不知道你有沒有發(fā)現(xiàn),我們上面無論再介紹運算器還是控制器的時候,都大量提及寄存器,這足以說明寄存器的重要性,不是有句話說其實CPU就是寄存器的集合體,不過在說寄存器之前,我們還是很有必要先來簡單的看看內存。
簡單說下內存(以后會單獨說)
CPU和內存總是分不開的,這里簡單對內存坐下介紹,方便對CPU的理解,內存自然而然是存儲部件,存儲的是啥呢?一般來說,就是數(shù)據(jù)和指令,而且我們常說的內存指的就是電腦中的內存條,就是用來存儲程序啊,數(shù)據(jù)啊,指令啊這些東西。
形象點說,其實內存可以看作一個個的小格子,每個格子都是用來存儲數(shù)據(jù)的,而且每個格子還有編號,也就是內存地址,根據(jù)它可與拿到對應內存存儲的數(shù)據(jù),還需要知道的就是,如果斷電的話,內存中的數(shù)據(jù)會被清除的。
CPU的大部分都是寄存器
上面說了CPU其實由運算器和控制器兩大部分組成,其實無論是運算器還是控制器,都離不開寄存器,可以說,CPU就是寄存器的天下,因此,對于CPU,一定要掌握好寄存器,CPU做的一些運算其實就是通過寄存器來實現(xiàn)的,可以看看這篇文章:一個程序在計算機中是怎么運行的?
先記住一句話:
我們使用的Java,python這些都是高級語言,編寫的程序最終會轉成機器語言,之后就會進入CPU運算,實質就是通過CPU內部的寄存器來做相應的處理的
寄存器
這個是我們需要掌握的,寄存器這玩意,不同的CPU中含有的寄存器數(shù)量和種類都不同,不過大體有如下幾種寄存器,按照功能來分的
另外其實就可以把CPU理解為是寄存器的集合體,然后你需要知道程序計數(shù)器,累加寄存器,標志寄存器,指令寄存器和棧寄存器只有一個,其他的寄存器一般會有多個。
說說這個程序計數(shù)器
為啥要說這個,因為這玩意決定著程序的執(zhí)行流程,我們進一步來看看
比如看這個,這個表示的是兩個數(shù)相加的操作,關于這個操作涉及到的數(shù)據(jù)和指令都保存在了內存中,而且每個數(shù)據(jù)和指令所在的內存單元都是有編號的,也就是內存地址,就是圖中0100,0101那些,自上而下就是該操作的執(zhí)行順序。
上面也提到過,程序計數(shù)器是保存程序執(zhí)行的指令的,準確說保存的是程序執(zhí)行指令的地址值,怎么理解呢?也就是說程序的每一步操作,底層來說都是有一系列指令對應著的,這些指令就是表明這一步該怎么操作,比如a+b這個操作,加載進內存后就是對應著一系列的指令。
首先就是一個指令,表明要把a這個數(shù)值做相加操作,需要先把a保存到累加寄存器,而這個指令被保存在內存中的一個內存單元中,這個內存地址比如說就是0100,而此時程序計數(shù)器就是保存的這個0100內存地址,要執(zhí)行程序的時候,CPU去看看程序計數(shù)器保存的第一個地址,發(fā)現(xiàn)是0100,然后去內存這個0100的位置,看看保存的是啥,一看是一個指令,分析指令,原來是要把0105地址中的值保存到累加寄存器中,然后就開始干活……
所以說啊,程序計數(shù)器其實我是決定管理程序的執(zhí)行流程的
CPU是如何做比較的
這個也需要了解一下,CPU的比較其實就是再內部做減法運算,什么意思呢?比如要比較a和b,就是再內部做一個a-b的操作,然后依據(jù)得到的結果來對a和b做比較,這里面肯定是要借助寄存器來完成,比如得到的結果就會放到標志寄存器中。
CPU做的事其實很簡單
我們在之前的文章說過,CPU其實主要就是干如下的四件事情:
從內存中讀取數(shù)據(jù),然后放到寄存器中
把寄存器中的數(shù)據(jù)寫入到內存
進行數(shù)學運算和邏輯運算(加減乘除,AND,OR)
依據(jù)相應的條件進行跳轉,執(zhí)行其他指令(一條指令跳轉到另外一條指令)
我們知道,CPU是依據(jù)指令做事情的,為什么CPU只做上面的四件事情,主要就是看CPU 能執(zhí)行的機器語言指令有哪些,主要就是如下這些
這么一看,CPU能干的事也沒有那么復雜啊。
CPU指令執(zhí)行過程
經過上面的講解,我們應該知道CPU就是看指令做事情的,那么關于指令,CPU又是怎么操作的呢? 我們要知道的是幾乎所有的馮·諾伊曼型計算機的CPU,其工作都可以分為5個步驟:取指令、指令譯碼、執(zhí)行指令、訪問取數(shù)、結果寫回。
可能你不懂了,沒啥,其實不就是這五個步驟嘛,搞清楚他們不就ok,接下來咱們來看看:
第一:取指令
字面意思很好理解啊,不就是拿到需要的指令嘛,那么指令在哪嘞,必須是在內存啊,也就是需要從內存中取出我們需要的指令,然后干嘛,不就是把指令放到CPU中的寄存器嘛,這個取指令就是這么一個過程。
第二:指令譯碼
這個是不是很快想到我們上面說的指令譯碼器,這個不就是對上一步拿到的指令做分析嘛,干嘛要分析,我得看看你這個指令到底要干啥啊,不然CPU怎么干活嘞
第三:執(zhí)行指令
這個不就更好理解了,就是開始干活啦,實現(xiàn)相應的功能了
第四:訪問取數(shù)
直觀上好像沒有那么好理解,其實啊,說的就是,我們根據(jù)上面的操作,有可能需要從內存中去拿數(shù)據(jù),啥意思嘞,要知道,內存存放的是數(shù)據(jù)和指令,比如執(zhí)行a+b的操作,我們得到相加的指令,對于a和b都是操作數(shù),它們也是存放在內存中的,是不是也需要去內存中去拿到它們
看上面那個圖,0100對應的指令是不是要去0105對應的地址中去拿數(shù)據(jù)123,這不就是訪問取數(shù)嘛。
第五:結果寫回
這又是啥,經過上面那么些個步驟,做的運算肯定得有結果啊,這結果咋弄,你不得保存在哪啊,通常是保存在CPU內部的寄存器中,一般是標志寄存器,這不是就是結果寫回嘛
好啦,到這里,關于CPU的知識咱們就介紹的差不多了,當然,CPU的知識遠遠不止如此,但是作為程序員的你,最起碼也得知道這些啊。
責任編輯:Ct
評論
查看更多