現在的位置: 首頁 > 雲計算 > 正文

CPU硬核知識:CPU結構是怎樣的

2020年02月24日 雲計算 ⁄ 共 4090字 ⁄ 字型大小 評論關閉

  CPU對每個程序員來說,是個既熟悉又陌生的東西?

  如果你只知道CPU是中央處理器的話,那可能對你並沒有什麼用,那麼作為程序員的我們,必須要搞懂的就是CPU這傢伙是如何運行的,尤其要搞懂它裡面的寄存器是怎麼一回事,因為這將讓你從底層明白程序的運行機制。

  CPU結構

  對於CPU來說,我們首先就要搞明白它是怎麼回事,也就是它的內部構造,當然,CPU那麼牛的一個東西,構造一定是極其複雜的,畢竟是超高科技玩意,所以啊,我們今天說的組成什麼的,都是指的主要的,對我們程序員有用的,需要了解的那一部分,切莫抬杠哦。

  首先嘞,我希望你先記住這句話:

  CPU所負責的就是解釋和運行最終轉換成機器語言的程序內容

  另外啊,說起CPU,一定離不開內存,在今天的介紹中,也會簡單的說說內存,因為後期也會單獨出一篇講解下內存,畢竟了解這些對我們程序員來說很重要的,所以CPU和內存經常在一塊來講,他們其實是有很多的晶體管組成的,一般稱他們為IC,也就是集成電路的意思。

  接下來我們就來看看CPU的組成,注意我之前說的,這裡說的組成一般是指的主要部分,畢竟CPU結構複雜。

  運算器

  字面意思理解就是跟運算有關的,簡單說就是負責運算從內存讀取到寄存器中的數據,可以看作一個數據加工廠,就是對寄存器中的數據做運算,這些運算包含基本的算術和邏輯運算。

  然後對於運算器來說,我們要了解其中的幾個重要角色,接下來我會挨個介紹:

  算術邏輯單元(ALU)

  這個是運算器中重要的一個組成,主要負責的就是對數據的處理,從而實現對數據的算術和邏輯運算。

  累計寄存器(AC)

  通常叫做累計器,是一個通用寄存器,這個有啥用呢?上面說的ALU,當ALU處理完算術運算或者邏輯運算之後,會得到一個結果,這個結果就會保存在AC中。

  數據緩衝寄存器(DR)

  這個DR也是存放數據的,存放的主要是從內存讀取過來的數據,會暫時存放在這個DR中,這裡就相當於內存和CPU之間做數據傳送的一個中轉站,為啥會有這個,大家都是到CPU和內存的速度是有很大差別的,中間引入一個DR,一定程度上起到了速度上的緩衝作用,不至於速度相差太猛

  狀態條件寄存器(PSW)

  這個貌似有點不好理解,首先寄存器還是保存數據的,所以PSW自然也是保存某一類數據的,它保存的主要是由算術指令和邏輯指令運行或者測試的結果建立的各種條件碼內容,一般分為狀態標誌和控制標誌,知道就行。

  我們需要了解以上的這幾個組成部分,這都是運算器的核心,另外需要特別說一下的就是它們每一個其實都有一個英文縮寫,比如ALU就是算術邏輯單元的意思,為啥要說這個嘞,因為英文縮寫畢竟簡便而且有逼格,所以我們一般交流的時候會說ALU而不是算術邏輯單元,因此,記住他們的縮寫也很重要哦。

  不然跟別人交流起來的話,別人一出口就是ALU,DR啥的,你很容易跟不上節奏啊。

  對CPU中的運算器有個基本認識以後,我們再來看看另外一個重要組成 控制器。

  控制器

  控制控制,也就是起到一個控制作用,上面介紹的運算器只是起到了運算的功能,但是控制器就比較牛,它是控制整個CPU的工作,對於控制器,一般要能夠保證程序的正確執行以及能夠處理異常事件。

  同樣的,對於控制器來說,我們需要重點關注如下幾個:

  指令寄存器(IR)

  寄存器是保存東西的,指令寄存器自然就是保存指令的,也就是說CPU要執行一條指令的話,需要先把指令從內存上讀取,然後放到我們上面說的數據緩衝寄存器中,之後再從DR放到IR中,接著嘞,會有一個叫做指令解碼器的東西根據IR的內容生成很多的微操作指令,從而去控制其他部件已完成相應的功能。

  程序計數器(PC)

  這個學過Java內存結構的應該了解,它保存著下一條要執行的指令,也就是說當一個程序要執行的時候,會把這個程序的起始地址存到這個PC中,如果這個指令被執行的話也不用擔心,CPU會自動修改,使得PC存放下一條要執行的指令。

  地址寄存器(AR)

  這個就是保存著CPU訪問內存上的那一塊內存的內存地址,為啥要保存這個,因為CPU和內存速度相差比較大,所以CPU要保存著正在訪問的那塊內存的地址,直到內存的讀寫操作完成,不然,找不到之前訪問的是哪個內存單元了啊。

  指令解碼器(ID

  簡單點就是對指令做分析的,看看你這個指令要幹啥。

  不知道你有沒有發現,我們上面無論再介紹運算器還是控制器的時候,都大量提及寄存器,這足以說明寄存器的重要性,不是有句話說其實CPU就是寄存器的集合體,不過在說寄存器之前,我們還是很有必要先來簡單的看看內存。

  CPU和內存總是分不開的,這裡簡單對內存坐下介紹,方便對CPU的理解,內存自然而然是存儲部件,存儲的是啥呢?一般來說,就是數據和指令,而且我們常說的內存指的就是電腦中的內存條,就是用來存儲程序啊,數據啊,指令啊這些東西。

  形象點說,其實內存可以看作一個個的小格子,每個格子都是用來存儲數據的,而且每個格子還有編號,也就是內存地址,根據它可與拿到對應內存存儲的數據,還需要知道的就是,如果斷電的話,內存中的數據會被清除的。

  CPU的大部分都是寄存器

  上面說了CPU其實由運算器和控制器兩大部分組成,其實無論是運算器還是控制器,都離不開寄存器,可以說,CPU就是寄存器的天下,因此,對於CPU,一定要掌握好寄存器,CPU做的一些運算其實就是通過寄存器來實現的,可以看看這篇文章:一個程序在計算機中是怎麼運行的?

  先記住一句話:

  我們使用的Java,python這些都是高級語言,編寫的程序最終會轉成機器語言,之後就會進入CPU運算,實質就是通過CPU內部的寄存器來做相應的處理的。

  寄存器

  這個是我們需要掌握的,寄存器這玩意,不同的CPU中含有的寄存器數量和種類都不同,不過大體有如下幾種寄存器,按照功能來分的。

  另外其實就可以把CPU理解為是寄存器的集合體,然後你需要知道程序計數器,累加寄存器,標誌寄存器,指令寄存器和棧寄存器只有一個,其他的寄存器一般會有多個。

  說說這個程序計數器

  為啥要說這個,因為這玩意決定著程序的執行流程,我們進一步來看看。

  比如看這個,這個表示的是兩個數相加的操作,關於這個操作涉及到的數據和指令都保存在了內存中,而且每個數據和指令所在的內存單元都是有編號的,也就是內存地址,就是圖中0100,0101那些,自上而下就是該操作的執行順序。

  上面也提到過,程序計數器是保存程序執行的指令的,準確說保存的是程序執行指令的地址值,怎麼理解呢?也就是說程序的每一步操作,底層來說都是有一系列指令對應著的,這些指令就是表明這一步該怎麼操作,比如a+b這個操作,載入進內存後就是對應著一系列的指令。

  首先就是一個指令,表明要把a這個數值做相加操作,需要先把a保存到累加寄存器,而這個指令被保存在內存中的一個內存單元中,這個內存地址比如說就是0100,而此時程序計數器就是保存的這個0100內存地址,要執行程序的時候,CPU去看看程序計數器保存的第一個地址,發現是0100,然後去內存這個0100的位置,看看保存的是啥,一看是一個指令,分析指令,原來是要把0105地址中的值保存到累加寄存器中,然後就開始幹活……

  所以說啊,程序計數器其實我是決定管理程序的執行流程的。

  CPU是如何做比較的

  這個也需要了解一下,CPU的比較其實就是再內部做減法運算,什麼意思呢?比如要比較a和b,就是再內部做一個a-b的操作,然後依據得到的結果來對a和b做比較,這裡面肯定是要藉助寄存器來完成,比如得到的結果就會放到標誌寄存器中。

  CPU做的事其實很簡單

  我們在之前的文章說過,CPU其實主要就是干如下的四件事情:

  從內存中讀取數據,然後放到寄存器中;

  把寄存器中的數據寫入到內存;

  進行數學運算和邏輯運算(加減乘除,AND,OR);

  依據相應的條件進行跳轉,執行其他指令(一條指令跳轉到另外一條指令)。

  我們知道,CPU是依據指令做事情的,為什麼CPU只做上面的四件事情,主要就是看CPU 能執行的機器語言指令有哪些,主要就是如下這些。

  這麼一看,CPU能幹的事也沒有那麼複雜啊。

  CPU指令執行過程

  經過上面的講解,我們應該知道CPU就是看指令做事情的,那麼關於指令,CPU又是怎麼操作的呢? 我們要知道的是幾乎所有的馮·諾伊曼型計算機的CPU,其工作都可以分為5個步驟:取指令、指令解碼、執行指令、訪問取數、結果寫回。

  可能你不懂了,沒啥,其實不就是這五個步驟嘛,搞清楚他們不就ok,接下來咱們來看看:

  第一:取指令

  字面意思很好理解啊,不就是拿到需要的指令嘛,那麼指令在哪嘞,必須是在內存啊,也就是需要從內存中取出我們需要的指令,然後幹嘛,不就是把指令放到CPU中的寄存器嘛,這個取指令就是這麼一個過程。

  第二:指令解碼

  這個是不是很快想到我們上面說的指令解碼器,這個不就是對上一步拿到的指令做分析嘛,幹嘛要分析,我得看看你這個指令到底要幹啥啊,不然CPU怎麼幹活嘞。

  第三:執行指令

  這個不就更好理解了,就是開始幹活啦,實現相應的功能了。

  第四:訪問取數

  直觀上好像沒有那麼好理解,其實啊,說的就是,我們根據上面的操作,有可能需要從內存中去拿數據,啥意思嘞,要知道,內存存放的是數據和指令,比如執行a+b的操作,我們得到相加的指令,對於a和b都是操作數,它們也是存放在內存中的,是不是也需要去內存中去拿到它們。

  看上面那個圖,0100對應的指令是不是要去0105對應的地址中去拿數據123,這不就是訪問取數嘛。

  第五:結果寫回

  這又是啥,經過上面那麼些個步驟,做的運算肯定得有結果啊,這結果咋弄,你不得保存在哪啊,通常是保存在CPU內部的寄存器中,一般是標誌寄存器,這不是就是結果寫回嘛。

  好啦,到這裡,關於CPU的知識咱們就介紹的差不多了,當然,CPU的知識遠遠不止如此,但是作為程序員的你,最起碼也得知道這些啊。

抱歉!評論已關閉.