作為一個程式設計師,CPU的這些硬核知識你必須會!
CPU對每個程式設計師來說,是個既熟悉又陌生的東西?
如果你只知道CPU是中央處理器的話,那可能對你並沒有什麼用,那麼作為程式設計師的我們,必須要搞懂的就是CPU這傢伙是如何執行的,尤其要搞懂它裡面的暫存器是怎麼一回事,因為這將讓你從底層明白程式的執行機制。
隨我一起,來好好認識下CPU這貨吧
把CPU掰開來看
對於CPU來說,我們首先就要搞明白它是怎麼回事,也就是它的內部構造,當然,CPU那麼牛的一個東西,構造一定是極其複雜的,畢竟是超高科技玩意,所以啊,我們今天說的組成什麼的,都是指的主要的,對我們程式設計師有用的,需要了解的那一部分,切莫抬槓哦
首先嘞,我希望你先記住這句話:
CPU所負責的就是解釋和執行最終轉換成機器語言的程式內容
另外啊,說起CPU,一定離不開記憶體,在今天的介紹中,也會簡單的說說記憶體,因為後期也會單獨出一篇講解下記憶體,畢竟瞭解這些對我們程式設計師來說很重要的,所以CPU和記憶體經常在一塊來講,他們其實是有很多的電晶體組成的,一般稱他們為IC,也就是積體電路的意思。
接下來我們就來看看CPU的組成,注意我之前說的,這裡說的組成一般是指的主要部分,畢竟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的知識遠遠不止如此,但是作為程式設計師的你,最起碼也得知道這些啊。
感謝閱讀
大學的時候選擇了自學Java,工作了發現吃了計算機基礎不好的虧,學歷不行這是沒辦法的事,只能後天彌補,於是在編碼之外開啟了自己的逆襲之路,不斷的學習Java核心知識,深入的研習計算機基礎知識,所有心得全部書寫成文,整理成有目錄的PDF,持續原創,PDF在公眾號持續更新,如果你也不甘平庸,那就與我一起在編碼之外,不斷成長吧!
其實這裡不僅有技術,更有那些技術之外的東西,比如,如何做一個精緻的程式設計師,而不是“屌絲”,程式設計師本身就是高貴的一種存在啊,難道不是嗎?
非常歡迎你的加入,未來的日子,編碼之外,有你有我,一起做一個人不傻,錢很多,活得久的快樂的程式設計師吧!
回覆關鍵字“PDF”,獲取技術文章合集,已整理好,帶有目錄,歡迎一起交流技術!
另外回覆“慶哥”,看慶哥給你準備的驚喜大禮包,只給首次關注的你哦!
任何問題,可以加慶哥微信:H653836923,另外,我有個交流群,我會***不定期在群裡分享學習資源,不定時福利***,感興趣的可以說下我邀請你!
對了,如果你是個Java小白的話,也可以加我微信,我相信你在學習的過程中一定遇到不少問題,或許我可以幫助你,畢竟我也是過來人了!
感謝各位大大的閱讀?
相關文章
- 作為程式設計師,這些實用工具你必須要知道!程式設計師
- 想要成為一個合格的Java程式設計師, 你必須要做到這些!Java程式設計師
- 作為一個程式設計師,告訴你一些編碼知識程式設計師
- 作為一個Java程式設計師,這 8 個開源類庫你必須知道!Java程式設計師
- 程式設計師需要了解的硬核知識之CPU程式設計師
- Nacos必知必會:這些知識點你一定要掌握!
- 關於JVM,你必須知道的這些知識點JVM
- 作為UI / UX設計師,這些使用者心理學原理必須瞭解UIUX
- java程式設計師進階架構師你必須掌握的架構知識體系Java程式設計師架構
- Java 異常你必須瞭解的一些知識Java
- 這 20 多個高併發程式設計必備的知識點,你都會嗎?程式設計
- 程式設計師必須瞭解的知識點——你搞懂mysql索引機制了嗎?程式設計師MySql索引
- 作為程式設計師,無論你在哪個階段,這些書都值得你看程式設計師
- 作為ui設計師,你必須要熟練的幾款設計軟體UI
- JAVA程式設計師“黃金5年”必須要掌握的知識技能Java程式設計師
- 強烈推薦:程式設計師必須懂的資料庫知識程式設計師資料庫
- 一網打盡:Java 程式設計師必須瞭解的計算機底層知識!Java程式設計師計算機
- 身為Java程式設計師,這些開源工具你一定要學會!Java程式設計師開源工具
- 7個Web前端程式設計師必須會用CSS技巧Web前端程式設計師CSS
- 程式設計師需要了解的硬核知識之磁碟程式設計師
- linux嵌入式程式設計開發必備知識,這些你都要知道Linux程式設計
- 這些必會的計算機網路知識點你都掌握了嗎計算機網路
- Java入門基礎學習,成為一個Java程式設計師的必備知識Java程式設計師
- IT程式設計師必知!TCP/IP為什麼會有這麼多的致命漏洞?程式設計師TCP
- JavaScript大師必須掌握的12個知識點JavaScript
- 作為一個程式設計師,記憶體和磁碟的這些事情,你不得不知道啊!!!程式設計師記憶體
- 作為程式設計師必須掌握的Java虛擬機器中的22個重難點程式設計師Java虛擬機
- 科普,想成為厲害的 Java 後端程式設計師,你需要懂這 13 個知識點Java後端程式設計師
- Java程式設計師必須掌握的5個註解!Java程式設計師
- 程式設計師生存指南:你必須要掌握的兩點!程式設計師
- 關於Linux作業系統,這些你必須知道!Linux作業系統
- 一個成熟的程式設計師必會技能:賺錢程式設計師
- 程式設計師需要了解的硬核知識之控制硬體程式設計師
- 程式設計師需要了解的硬核知識之記憶體程式設計師記憶體
- 軟體工程師必須知道20個知識點你瞭解多少?軟體工程工程師
- 「程式設計羽錄」上線,程式設計師必備的這些技能你能get到嘛?程式設計師
- 程式設計師成為大佬必須學的演算法程式設計師演算法
- c++程式設計師必知必會的技術,推薦你們一份qt書單C++程式設計師QT