一個程序在計算機中是如何運行的?超級乾貨!!!

一個程序在計算機中是如何運行的?超級乾貨!!!

強烈聲明:本文很乾,請自備茶水!😎java

開門見山,咱不說廢話!web

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

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World!"); 
    }
}
複製代碼

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

Hello World保存在哪?

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

是的,一個HelloWorld.java文件就保存在了桌面上,這個叫作Java源文件,不過說是保存在桌面上這個有點模糊,這個桌面又是個啥呢,咱們應該想象它保存在了咱們電腦的哪一個部分呢?一臺計算機包含以下基本五個部分:併發

  1. 運算器
  2. 控制器
  3. 存儲器
  4. 輸入設備
  5. 輸出設備

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

無論怎麼說吧,磁盤也好內存也罷,就是用來存放數據的,那麼咱們就知道了咱們寫的這個Java源文件應該就是存放在電腦中的磁盤了。工具

那麼代碼保存到硬盤中以後呢?學習

今天的主角,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,也就是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主要就幹以下四件事情:

一、從內存中讀取數據,而後放到寄存器中

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

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

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

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

CPU的重點組成部分

咱們上面也說了,CPU的結構真的很複雜,可是咱們須要重點關注以下幾個重要組成部分:

  1. 寄存器
  2. 運算器

沒錯就是這倆貨,那他們是幹啥的嘞,首先你得知道他們是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主要作的四件事情:

一、從內存中讀取數據,而後放到寄存器中

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

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

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

怎麼樣,是否是更加清晰明瞭!

總結一哈

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

一句話總結:

自己程序是在硬盤上,須要把程序加載進內存,而後由CPU去執行

另外對於內存啊,CPU什麼呢還有不少有趣有用的知識,咱們下次再講!

感謝閱讀

你們好,我是ithuangqing,一路走來積累了很多的學習經驗和方法,並且收集了大量的精品學習資源,如今維護了一個公衆號【編碼以外】,寓意就是在編碼以外也要不停的學習,主要分享java技術相關的原創文章,如今主要在寫數據結構與算法,計算機基礎,線程和併發以及虛擬機這塊的原創,另外針對小白還在連載一套《小白的java自學課》,力求通俗易懂,由淺入深。同時我也是個工具控,常常分享一些高效率的黑科技工具及網站

對了,公衆號還分享了不少個人學習心得,能夠一塊兒探討探討!

關注公衆號,後臺回覆「慶哥」,2019最新java自學資源立馬送上!更多原創精彩盡在【編碼以外】

在這裏插入圖片描述
在這裏插入圖片描述
相關文章
相關標籤/搜索