在徵得作者同意的情況下,本網站的作品允許非盈利性引用,並請註明出處:「作者:luomuxiaoxiao 轉載自:www.luomuxiaoxiao.com"字樣,以尊重作者的勞動成果。版權歸原作者所有。未經允許,嚴禁轉載。


這篇文章我們主要從整體上了解一下計算機程序是如何運行的。在此過程中,我們將會引出操作系統中一些很重要的概念,並在後續的文章中對這些概念將強化和深入理解。

首先從計算機的硬體開始談起。在這裡我們只考慮和程序運行直接相關的硬體。其基本的硬體如下圖所示:

圖1. 一個典型的計算機系統構成

圖片來源於Computer Systems: A Programmers Perspective 2nd Edition Page 8

各硬體及其作用如下:

  1. 匯流排 匯流排是個抽象的概念,計算機中處理的程序和數據都是通過匯流排來傳輸的。
  2. IO設備 即input/output設備,這裡的輸入輸出都是相對於CPU來講的。IO設備都通過對應的控制器與匯流排連接,這樣就可以從匯流排上獲取數據或者往匯流排上發送數據。典型的輸入設備有滑鼠、鍵盤和磁碟等,典型的輸出設備有顯示器。
  3. 主存 就是我們常說的計算機中的內存。字面意思就可以看出來,它是一個存儲設備,用來存儲程序執行時的代碼和數據。它可以理解成一個很大的數組,想訪問數組的數據或者代碼就需要數據索引,該地址我們稱之為地址。
  4. 中央處理器(CPU) CPU是計算機的「大腦」。計算機所有的指令執行和數據運算都是由CPU完成的。CPU內部有一些寄存器,程序在運行時就是直接從這些寄存器中獲取指令和數據的。

那麼,程序究竟是怎樣在上述硬體組成的計算機中運行呢?

在思考這個問題之前,我們需要了解一些事實:

  1. 計算機只能識別二進位的代碼和數據,也就是說代碼和數據不管是存放、傳輸還是運算都是以二進位形式進行的。
  2. 匯流排總是以為單位傳輸數據的,構成字的基本單位是位元組,一個位元組有8位(bit)。我們所說的32位CPU或者64位CPU中的「32」或者「64」就是CPU所支持的匯流排的字長。
  3. CPU的寄存器長度是一個的長度。 > 寄存器是中央處理器內的組成部分。寄存器是有限存貯容量的高速存貯部件,它們可用來暫存指令、數據和地址。
  4. 主存可以看做是一個數組,每個數組索引(地址)對應了一個長度的數據。

圖2. 32位系統中主存中地址與數據的對應關係

> 左邊數字表示內存的地址,右邊每個格子表示一位(bit),其中存放「0」或者「1」,這些「0」或者「1」組成了一個二進位的數據,該數據表示對應的內存地址存放的數據。

  1. CPU是通過其內部一個叫做程序計數器(PC)的寄存器來讀取指令的,其執行指令的中間結果,可以保存在其他寄存器中。
  2. PC寄存器總是指向下一條待處理指令,也就是說,PC寄存器中總是存放著下一條指令的地址。

其實,程序運行的基本邏輯很簡單:

  1. 我們編寫好的代碼是由ASCII字元組成的,需要經過編譯生成計算機可以執行的二進位文件。
  2. 當運行該可執行文件時,載入器將可執行文件載入到主存中去。
  3. CPU根據PC寄存器中的地址,取出待執行的指令,開始執行,並將PC寄存器指向下一條指令。一般情況下,指令總是順序執行的,除非遇到跳轉指令。

那麼請思考以下問題:

1. 代碼是經過編譯生成的二進位文件。編譯的過程是什麼樣的呢? 2. 載入器根據什麼載入把二進位文件到主存中去的呢? 3. CPU是如何載入指令和數據的呢?

後續我們將一一回答這些問題。

如果你覺得有收穫,請點擊左下角的贊,你的支持是我繼續寫的動力!謝謝!


想第一時間查看我的文章嗎?請關注我的微信公眾號號,搜索「落木蕭蕭技術論壇」,更多精彩文章等你。

微信公眾號


推薦閱讀:
相關文章