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

一個程序在計算機中是如何運行的

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

  你有沒有想過,你寫的程序,是如何在計算機中運行的嗎?比如我們搞Java的,肯定寫過這段代碼:

  public class HelloWorld {

  public static void main(String[] args) {

  System.out.println("Hello World!");

  }

  }

  熟悉吧,可能大家都知道,運行輸出「Hello World!」,不過嘞,今天我帶你從內存和CPU的角度去剖析一下這段代碼在計算機中是如何執行的。

  Hello World保存在哪?

  首先問你個很簡單的問題,當你寫下這段代碼的時候,你把它保存在哪了,假如說你說是桌面,就像現在這樣。

  是的,一個HelloWorld.java文件就保存在了桌面上,這個叫做Java源文件,不過說是保存在桌面上這個有點模糊,這個桌面又是個啥呢,我們應該想像它保存在了我們電腦的哪個部分呢?一台計算機包含如下基本五個部分:運算器;制器;存儲器;輸入設備;輸出設備。

  在計算機中啊,保存信息主要靠存儲器,而存儲器又分為內部存儲器和外部存儲器,內部存儲器就是內存了,而這個外部存儲器主要就是磁碟了,磁碟又分為硬碟和軟盤,而我們電腦中的大部分就都是硬碟了,這裡也分為固態硬碟和傳統機械硬碟。

  不管怎麼說吧,磁碟也好內存也罷,就是用來存放數據的,那麼我們就知道了我們寫的這個Java源文件應該就是存放在電腦中的磁碟了。

  那麼代碼保存到硬碟中之後呢?

  代碼被保存到硬碟之後,接下來就要CPU和內存登場了,提起精神了,超級乾貨來了。

  告訴你個秘密,理解CPU和內存是如何在一塊工作的,是每個學編程必備的基礎中的基礎,反正就是很重要!

  我們在上面提到了硬碟,這裡又說到了CPU和內存,那麼我們就來看看這三個傢伙

  我們之前不是說我們寫的代碼保存到了硬碟中了嗎,如果要執行這段代碼的話,需要把這段代碼從硬碟中讀取到內存中,此時的代碼已經變成了二進位文件存儲在內存中,為了更好的去理解,我們把上面的代碼再進一步改寫下:

  public class HelloWorld {

  public static void main(String[] args) {

  int a = 5;

  int b = 3;

  sum = a + b;

  System.out.println(sum);

  }

  }

  也就是加入了一個基礎的加法運算,此時這段代碼已經變成二進位文件放到了內存中,現在要繼續執行,也就是要執行代碼的加法操作,此時的數據a和b,也就是5和3已經是二進位的形式在內存中,現在需要把a和b做加法運算,CPU收到這個指令(將a和b相加),就會去內存中將a和b讀取,然後存放到自己的寄存器中,然後由CPU中的運算器去做加法運算,得到的結果依然放到寄存器中。

  是不是有點懵?啥是寄存器?運算器呢?別急,我們繼續往下看。

  內存是個啥?

  這個內存是啥呢?內存條知道吧,我們電腦中的內存條,它是屬於內部存儲器,主要就是用來存放數據的,也可以理解為我們這裡說的內存,這是實際存在的,我們可以看得見的內存條,但是關於數據存儲,怎麼存儲,是不是還有點模糊,那麼我們抽象點來說,這個內存其實就是一個個的小格子,就像這樣:

  這些小格子就是用來存放數據和指令的,而且每個格子都有自己的編號,這個編號大家也熟悉,就是我們經常說的內存地址。

  另外你需要知道的是,計算機是只認識0和1的,所以存放在內存中的數據其實都是二進位文件了。

  CPU是個重點

  其實關於內存,先了解上面那些就足夠了,內容比較多的就是CPU了,想必大家都聽說過CPU就相當於人的大腦一樣,對電腦來說,至關重要,所以啊,CPU的結構是真的複雜,怎麼辦?

  一般碰到這樣的,我們就需要有選擇的進行掌握和學習,因此對於CPU,你必須了解的兩個東西,一是寄存器,另外一個就是運算器,為啥,這又是啥?

  想要搞明白這個問題,咱們需要先來看看如下這些知識點。

  CPU的特點

  首先,這傢伙是真的複雜,除此之外嘞,你還需要知道對於CPU來說,必須要把數據讀取到寄存器中才能做相應的運算,另外CPU的數據讀寫的速度是真的快,內存和硬碟根本沒法比,可能你沒啥概念,舉個例子吧

  CPU這傢伙執行一條指令大約需要耗時1ns,但是對於內存呢?它去硬碟讀取數據至少8ms,在這段時間內,CPU可以執行大約800萬條指令,說這個,主要是為了讓你直觀的感受到CPU是真的快。

  就像《碼農翻身》一書中說的那樣:

  CPU的運算速度快的喪心病狂,但是它能做的事情簡單的令人髮指

  啥?為啥做的事情簡單的令人髮指呢?

  別看CPU那麼牛,那麼複雜,那麼快,它做的事情真的挺無聊的,總結起來,CPU主要就干如下四件事情:

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

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

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

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

  不知道你發現沒,我們似乎一直在提寄存器,這又是什麼玩意?這就要看看CPU的構造了。

  CPU的重點組成部分

  我們上面也說了,CPU的結構真的很複雜,但是我們需要重點關注如下幾個重要組成部分:寄存器;運算器。

  沒錯就是這倆貨,那他們是幹啥的嘞,首先你得知道他們是CPU中的東西,這個寄存器啊,說白了就是存放數據的,是個存儲部件,還記得之前說內存就是一個個的小格子嗎?這個寄存器你就可以簡單的想成也是小格子,放數據的。

  寄存器

  寄存器是存儲部件,容量非常有限,能存儲的數據的大小,現在來說一般有兩種,也就是我們常聽說的32位和64位,32位的寄存器就能存儲4個位元組的數據,64位的寄存器就能存儲8個位元組的數據,另外CPU也分為32位和64位其實就是由其中的寄存器的位數決定的,可想而知,即使是64位的寄存器也幹不了啥大事啊,所以啊,現在的CPU一般都內置了很多的寄存器,依此來完成比較複雜的操作

  運算器

  另外一個就是運算器了,這個是計算的核心,主要的作用就是用來做加減乘除這些運算的,不過嘞,這裡你需要知道的一點就是,運算器是沒法直接操作內存中的數據的,很容易想到,運算器操作的數據是寄存器中存放的數據。

  CPU和內存的交互

  簡單的了解了內存和CPU之後,我們就可以來看看程序代碼是如何進一步被執行的,上面提到了,程序代碼被讀取到內存中了,現在要執行這段代碼,那就需要CPU出馬了,首先嘞,CPU會去讀取需要進行操作的數據,對了,繼續看這代碼:

  public class HelloWorld {

  public static void main(String[] args) {

  int a = 5;

  int b = 3;

  sum = a + b;

  System.out.println(sum);

  }

  }

  也就是需要讀取數據a和b,那麼讀取到的數據a和b存放在哪了呢?根據我們上面對CPU簡單的了解可知,數據a和b是被放到了CPU中的寄存器中了。

  在CPU中有兩個比較重要的組件就是運算器和寄存器,寄存器有很多個,再看內存,是一個個的小格子,每個格子有編號,比如說現在數據a和b分別存放在#1和#2上,然後CPU將他們讀取放在寄存器R1和R2上。

  這個時候就要計算a和b的和了,然後就輪到運算器出馬了,它會拿到寄存器R1和R2,也就是拿到數據a和b,然後做加法運算。

  那麼計算之後的結果也就是sum,運算器會再次把它放到寄存器,比如R1中,這個時候之前的數據b就會被覆蓋,如此一來,CPU和內存就一起完成一次加法運算操作。

  這裡其實我們把關注點聚焦到了加法運算操作,實際上,程序代碼被裝載近內存的時候會產生數據和指令兩部分,數據我們都知道是啥,指令嘞?

  其實也好理解,指令就是說明程序該怎麼執行,對於CPU來說就是告訴CPU該做什麼,比如告訴CPU,讀取數據a和b,然後再將他們相加,說白了,CPU是根據指令幹活,指令讓怎麼干,咱就怎麼干。

  因此,你必須告訴CPU該幹啥,否則,CPU也很懵的呦。

  經過上面的簡單介紹,我們再來看看CPU主要做的四件事情:

  1、從內存中讀取數據,然後放到寄存器中。

  2、把寄存器中的數據寫入到內存。

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

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

  怎麼樣,是不是更加清晰明了!

  總結

  這麼一看,也沒啥難的嗎?總的來說啊,就是我們寫的程序是放在硬碟中的,在運行的時候才會被調入到內存中,也就是說內存中的數據是從硬碟來的,而CPU中寄存器的數據又是從內存中裝載進來的,然後CPU會根據相應的指令去操作寄存器中的數據,比如加減乘除什麼的,以此來完成一個程序在計算機中的運行。

  本身程序是在硬碟上,需要把程序載入進內存,然後由CPU去執行。

抱歉!評論已關閉.