漫談計算機組成原理(一)之程式執行的過程
大家都知道,作業系統、計算機組成原理、資料結構與演算法、計算機網路、被稱作計算機四大基礎課。不但是計算機專業考研的四門專業課,而且是每一個程式設計師必須掌握的內容。其實大家能夠看到,為什麼絕大多數企業都不想招培訓班出來的“程式設計師”,其中有一個非常重要的原因就是他們的計算機基礎知識過於薄弱,也就是上面說到的四門課程。
最近發現,研究計算機組成原理其實是非常有意思的一件事情。為什麼這樣說呢?不知道你有沒有想過,當你寫完一個程式之後(以c語言程式為例子),原始碼通過編譯器編譯成組合語言,然後組合語言再通過解釋,成為機器語言,經過黑盒子(你不知道的方式),得到你想要的結果。你只是看到了程式輸出的最終結果,卻不知道為什麼能夠得到你想要的最終結果,對吧。
那麼,你有沒有想過,一個程式究竟是如何跑起來的呢,究竟在計算機的最底層經過了怎樣的執行過程呢?這就是我的這篇博文想要展示給大家的。
概述
我們知道,計算機是由軟體和硬體共同組成的。沒有硬體,軟體就沒有用武之地;沒有軟體,硬體就只能是一堆廢鐵。
而軟體又分為兩類:
- 系統軟體
- 應用軟體
其實這是從巨集觀上的封裝和層次劃分,對相關的內容沒有了解的開發者理解起來可能會有些難度,不過這不是我們今天的重點。
我嘗試著從程式設計師的視角來給大家分析一下,一個程式的完整執行過程。
計算機如何才能執行程式?
還是接著從序言的部分說起。
我們所用的語言,不論是C語言、Java還是其他的什麼語言,都是屬於高階語言。而高階語言編寫的程式,計算機肯定是不能直接執行的,因為計算機只能識別0和1。為了能夠讓計算機執行高階語言編寫的程式,需要經過下面的這些步驟:
首先,高階語言程式通過編譯器編譯,成為組合語言;然後這個彙編程式再經過一個不知道的步驟成為機器語言。
究竟是經過了什麼樣的過程,組合語言才會變成機器語言呢?這需要一個東西介入。
就是我們剛才提到的系統軟體,泛泛的講就是作業系統。
作業系統是負責和底層的硬體進行互動的,也就是說,這個把組合語言變成機器語言的東西,只能是作業系統。如果你下過jdk,如果你夠細心,你會發現有arm、i586、x64等型別。這是為什麼呢?就是因為計算機硬體或者說晶片是不基於不同的指令集的,那麼相同的彙編程式,經過作業系統,轉換成對應的機器語言肯定也是不同的。順便說一下,我們今天的主題是機器語言在底層硬體的流轉。
經過這裡,我們成功得到了機器語言。當作業系統將彙編程式解釋成對應的指令集的機器語言之後,就要看硬體部分究竟是如何處理機器語言的了。
我們前面說的指令系統,就是解釋執行機器語言的,這樣看來,機器語言實際上就是微指令。
總的來講,指令系統也好,微指令系統也好,其功能就是來控制硬體執行的。所以,在指令系統得到了機器語言(微指令)後,對硬體進行的相關操作,才是能使我們程式執行的根本原因。
到這裡,我們知道了
- 只有機器語言計算機才能夠識別並執行
- 相同的組合語言程式在不同指令集平臺下生成的機器語言是不同的
- 機器語言就是微指令
- 微指令系統的作用就是指揮計算機的各部分工作
好了,只有知道了這些內容,我們才能進行後續的東西。
現代計算機的結構
剛才說了,微指令系統是指導計算機硬體執行的。那麼,這些計算機硬體都包括什麼呢?
眾所周知,現代計算機是在馮若依曼體系計算機的基礎之上發展起來的,在開始我們的講述之前,瞭解下馮若依曼計算機的結構還是很有必要的。
- 運算器:進行算數邏輯運算
- 儲存器:存放資料以及程式
- 控制器:控制程式、資料、運算處理結果
- 輸入裝置:將指令轉換成機器可識別的機器語言
- 輸出裝置:將指令轉換成人可以識別的內容
可以看到,馮諾依曼結構的計算機是以運算器為核心的,而現在的計算機則是以儲存器為核心的。這其中的原因暫不表述,有興趣的可以查閱相關資料。
雖然現代計算機是以儲存器為中心的,但是還是基於馮若依曼體系的。馮若依曼體系計算機的特點現代計算機都有。
現代計算機的結構是這樣的:(純手畫,略醜,見諒)
主機中由主儲存器和CPU組成,再有就是外部的IO裝置,現代的計算機結構雖然和馮諾依曼結構有些不太一樣,但是仍是基於馮諾依曼結構的。
注意:這裡面有一個非常重要的內容,那就是指令的格式。
剛才說了,指令其實就是機器語言,那麼,一條機器語言的格式究竟是什麼樣子呢?是這樣的:機器語言或者說指令,分為兩個部分,一部分是操作碼,另外一部分是資料地址。
比如說,我現在要做的操作是將0000111011地址的資料存到儲存器之中,那麼操作就是這樣的:
前面的是指令碼,後面的是地址碼。我們發現,在這種情況下,地址碼和指令碼都是二進位制的資料,處於同樣的地位,這也是馮若依曼體系計算機的一大特點。
好了,瞭解了以上內容,我們馬上就能看到一個程式究竟是如何跑起來的了。
計算機的工作過程
我們上面看到了現代計算機的體系結構:儲存器、算數邏輯(運算器)、控制單元(控制器),當然還有IO裝置。
現在,我們知道了微指令(機器語言)就是在這些部件之中游走,完成程式的操作,但是具體是如何遊走的,或者說微指令系統是如何執行機器語言的,我們仍然不知道。
就我們目前掌握的內容來看,只能瞭解到這個層次了,若要是想再進一步,我們對更底層的東西還是要再進行分解。
儲存器
下圖是儲存器的基本結構:
看了這張圖你可能會-有很多的疑問,比如說儲存體是個什麼東西?其實,再細分的東西,這篇部落格就暫不作介紹了,因為並不影響我們的閱讀,如果你感興趣的話,歡迎持續關注我的部落格,我會把漫談計算機組成原理作為一個系列的文章,來仔細為大家講述計算機組成的奧祕。
對於儲存體,你只需要知道這就是個儲存的部件即可,可以存放資料。
MAR:儲存器地址暫存器;MDR:儲存器資料暫存器。
所謂的暫存器,就是臨時存放的意思。所以,上面兩個就是臨時存放地址和資料的地方。至於為什麼這麼叫,再最後一部分你會非常明白的,這裡我就先不做介紹,你只需要知道有這麼個東西就行了。
運算器
這是運算器的結構圖。
我們知道,運算器就是做邏輯運算的,比如說加減乘除等運算,簡而言之就是做資料處理的。
圖中顯示的什麼累加暫存器、乘商暫存器等這些東西,不必讓這些名詞困擾你。我來簡單說一下,累加暫存器就是差與和存放的地方。那麼你就會問,為啥有差、和卻叫累加暫存器呢?那是因為在計算機中是沒有減法的,如果有,那就是加上一個負數而已,只能是這樣。至於乘商暫存器肯定就是放乘積和商的地方了。
至於X,這貨叫運算元暫存器。比如說X+3。X是放到ACC中的,這個後面的加數就是放在X這個暫存器中,等待著操作的進行。
控制器
控制器的作用:解釋指令,保證指令有序執行。
控制器的結構如下:
剛才我們講,再馮諾依曼體系中,指令和資料是以同等的地位存在於系統之中的,也就都是二進位制。你也看到了一條指令的格式。地址碼指向的是IO裝置的地址,而控制碼呢?計算機是如何知道這條指令要執行的是加法操作還是乘法操作呢?實際上,操作碼就是存放在CU控制單元之中的。指令暫存器會對CU控制單元發出請求,得到的就是具體的操作。
PC的作用又是什麼呢?它的作用實際上是執行完當前指令後,自動加一。也就指向了下一個地址,那裡又存放著一條指令,然後繼續這個過程。
主機完成指令的過程
好了,終於走到了最後一部分。
在前面的幾個過程中,你瞭解到了現代計算機的每一個部件的組成以及具體功能,在知道了這些內容後,下面的東西理解起來是會很簡單的。在最後的這一部分,我會舉出兩個具體的例子,讓你知道程式程式碼最終形成的機器語言究竟是如何執行的。
取數指令
描述:簡單的講,就是把一個數取出,存到ACC(一般加法操作時,ACC就是作為被加數)中的具體過程。先來看下面的這張圖,最好結合著我下面的介紹看。
- 1.程式計數器+1,開始指向下一個地址。
- 2.儲存器地址暫存器中存放著下一個地址,根據這個地址(地址暫存器的名字來歷),指向儲存體中的指令資料。
- 3.從儲存體得到資料,存入資料暫存器(資料暫存器的名字就是這麼來的)
- 4.得到指令,格式為指令碼+操作碼(當前操作就是:取數操作-地址),指令寫入IR指令暫存器中。
- 5.指令暫存器詢問CU控制單元當前是何種操作,得到取指令操作的回覆
- 6.指令中的資料地址存入地址暫存器
- 7.通過地址暫存器得到儲存體中當前地址儲存的資料
- 8.得到的資料存入資料暫存器中
- 9.資料暫存器中的資料寫入ACC,完成整個操作
- 10.PC程式計數器+1,開始新一輪的判斷。
有了這個,相信你已經對整個操作過程有了很深刻的理解,下面我們再來一個例子,加深理解。
ax^2+bx+c程式執行過程(程式程式碼已經成為了機器語言)
- 1.程式由IO裝置送至計算機
- 2.PC+1,得到程式首地址
- 3.程式開始啟動
- 4.取數指令:PC–>MAR–>儲存體–>MDR–>IR(指令暫存器)
- 5.分析指令:取出指令暫存器中的操作碼,送入CU控制單元進行分析,得到指令意義
- 6.執行指令:取出IR中的地址碼–>MAR—>儲存體–>MDR–>ACC
- 7.PC+1=PC,得到新的地址
- 8.取數指令:PC–>MAR–>儲存體–>MDR–>IR(指令暫存器)
- 9.分析指令:取出指令暫存器中的操作碼,送入CU控制單元進行分析,得到指令意義
- 10.執行指令:取出IR中的地址碼–>MAR—>儲存體–>MDR–>X
- ……
- 最終出現結果
- 程式執行完畢
好了,進行到這裡,我們的漫談計算機組成原理的第一篇文章就算是結束了。如果大家發現我的部落格存在問題,或者大家有什麼疑問的地方,歡迎私信我,歡迎志同道合的夥伴聯絡我!郵箱:roobtyan@aliyun.com
相關文章
- 漫談計算機組成原理(八)原碼、補碼、反碼計算機
- 在計算機組成原理中x,計算機組成原理計算機
- 計算機組成原理計算機
- 計算機組成原理 - 計算篇計算機
- 【重學計算機】計算機組成原理計算機
- 計算機組成原理之匯流排設計計算機
- 計算機執行彙編程式碼的原理計算機
- 計算機組成原理基礎知識(一)計算機
- 計算機組成原理學習 筆記一計算機筆記
- 【計算機組成原理】第6章 計算機的運算方法計算機
- 計算機組成原理核心考點計算機
- 王道計算機組成原理筆記計算機筆記
- 計算機組成原理複習0625計算機
- 計算機組成原理——I/O通道計算機
- 計算機組成原理-全套影片教程計算機
- 計算機組成原理-錯題本計算機
- 漫談程式和執行緒執行緒
- 漫談計算機架構計算機架構
- 漫談計算機編碼計算機
- 計算機組成原理與介面技術筆記(一)計算機筆記
- 計算機組成原理學習 Part 2計算機
- 計算機組成原理-全套視訊教程計算機
- 計算機系統的層次結構(計算機組成原理5)計算機
- 計算機科班生學計算機組成原理的意義何在呢?計算機
- (計算機組成原理)RISC與CISC的區別計算機
- 計算機組成原理期末複習小結計算機
- 計算機組成原理常見英文縮寫計算機
- 計算機組成原理名詞指令縮寫計算機
- 計算機組成原理期末考試題計算機
- 計算機組成原理浮點數加減計算機
- 計算機組成原理與介面技術(二)計算機
- 設計模式漫談之組合模式設計模式
- 計算機組成與系統結構 cache 原理與計算計算機
- 唐朔飛《計算機組成原理》第一章-計算機系統概論計算機
- 計算機組成原理01-系統概論計算機
- Python併發程式設計之談談執行緒中的“鎖機制”(三)Python程式設計執行緒
- 揭秘計算機指令執行的神秘過程:CPU內部的絕密操作計算機
- Java 程式執行過程Java