天天看點

96KB存儲器的怎麼算位址範圍_每天都在敲代碼,但是一個程式在計算機中是怎麼運作的?...

強烈聲明:本文很幹,請自備茶水!

開門見山,咱不說廢話!

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

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

Hello World儲存在哪?

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

96KB存儲器的怎麼算位址範圍_每天都在敲代碼,但是一個程式在計算機中是怎麼運作的?...

是的,一個HelloWorld.java檔案就儲存在了桌面上,這個叫做Java源檔案,不過說是儲存在桌面上這個有點模糊,這個桌面又是個啥呢,我們應該想象它儲存在了我們電腦的哪個部分呢?一台計算機包含如下基本五個部分:

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

在計算機中啊,儲存資訊主要靠存儲器,而存儲器又分為内部存儲器和外部存儲器,内部存儲器就是記憶體了,而這個外部存儲器主要就是磁盤了,磁盤又分為硬碟和軟碟,而我們電腦中的大部分就都是硬碟了,這裡也分為固态硬碟和傳統機械硬碟。

不管怎麼說吧,磁盤也好記憶體也罷,就是用來存放資料的,那麼我們就知道了我們寫的這個Java源檔案應該就是存放在電腦中的磁盤了。

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

今天的主角,CPU和記憶體

代碼被儲存到硬碟之後,接下來就要CPU和記憶體登場了,提起精神了,超級幹貨來了。

告訴你個秘密,了解CPU和記憶體是如何在一塊工作的,是每個學程式設計必備的基礎中的基礎,反正就是很重要!

我們在上面提到了硬碟,這裡又說到了CPU和記憶體,那麼我們就來看看這三個家夥

硬碟,記憶體和CPU

先看一張圖

96KB存儲器的怎麼算位址範圍_每天都在敲代碼,但是一個程式在計算機中是怎麼運作的?...

這張圖大緻描述了三者的一個關系,什麼關系嘞,資料讀取的關系,我們之前不是說我們寫的代碼儲存到了硬碟中了嗎,如果要執行這段代碼的話,需要把這段代碼從硬碟中讀取到記憶體中,此時的代碼已經變成了二進制檔案存儲在記憶體中,為了更好的去了解,我們把上面的代碼再進一步改寫下:

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中的運算器去做加法運算,得到的結果依然放到寄存器中。

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

記憶體是個啥?

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

96KB存儲器的怎麼算位址範圍_每天都在敲代碼,但是一個程式在計算機中是怎麼運作的?...

這些小格子就是用來存放資料和指令的,而且每個格子都有自己的編号,這個編号大家也熟悉,就是我們經常說的記憶體位址。

另外你需要知道的是,計算機是隻認識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中的寄存器中了,看這個圖

96KB存儲器的怎麼算位址範圍_每天都在敲代碼,但是一個程式在計算機中是怎麼運作的?...

在CPU中有兩個比較重要的元件就是運算器和寄存器,寄存器有很多個,再看記憶體,是一個個的小格子,每個格子有編号,比如說現在資料a和b分别存放在#1和#2上,然後CPU将他們讀取放在寄存器R1和R2上

96KB存儲器的怎麼算位址範圍_每天都在敲代碼,但是一個程式在計算機中是怎麼運作的?...

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

96KB存儲器的怎麼算位址範圍_每天都在敲代碼,但是一個程式在計算機中是怎麼運作的?...

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

這裡其實我們把關注點聚焦到了加法運算操作,實際上,程式代碼被裝載近記憶體的時候會産生資料和指令兩部分,資料我們都知道是啥,指令嘞?

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

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

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

  • 從記憶體中讀取資料,然後放到寄存器中
  • 把寄存器中的資料寫入到記憶體
  • 進行數學運算和邏輯運算(加減乘除,AND,OR)
  • 依據相應的條件進行跳轉,執行其他指令(一條指令跳轉到另外一條指令)

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

總結一哈

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

一句話總結:

本身程式是在硬碟上,需要把程式加載進記憶體,然後由CPU去執行

原創丨ithuangqing

優課達:程式員小白入門Java,JDK怎麼安裝與配置環境變量?

優課達:程式員面試Java程式設計知識大全:最新版Java基礎知識面試題(一)

優課達:程式員面試Java程式設計知識大全:最新版Java集合容器面試題(一)

優課達:程式員面試Java程式設計知識大全:最新版Java虛拟機(JVM)面試題(一)

聽說給好内容點贊,知乎就會繼續給你推薦相關的優質回答,再也不怕沒學習素材了~~