天天看點

重學計算機組成原理(一)- 馮·諾依曼體系結構1 計算機的基本硬體組成2 馮·諾依曼體系結構3 總結4 推薦閱讀5 思考參考

1 計算機的基本硬體組成

早期,DIY一台計算機,要先有三大件

  • CPU
  • 記憶體
  • 主機闆

1.1 CPU

計算機最重要的核心配件,中央處理器(Central Processing Unit)。

計算機的所有“計算”都是由CPU來進行的。

  • CPU是一個超級精細的印刷電路版

1.2 記憶體(Memory)

你撰寫的程式、打開的浏覽器、運作的遊戲,都要加載到記憶體裡才能運作。

程式讀取的資料、計算得到的結果,也都要放在記憶體裡。記憶體越大,能加載的東西自然也就越多。

記憶體通常直接可以插在主機闆上,存放在記憶體裡的程式和資料,需要被CPU讀取,CPU計算完之後,還要把資料寫回到記憶體。然而CPU不能直接插到記憶體上,反之亦然。于是,就帶來了最後一個大件——主機闆(Motherboard)。

  • 記憶體通常直接可以插在主機闆上

1.3 主機闆

主機闆是一個有着各種各樣,有時候多達數十乃至上百個插槽的配件。

我們的CPU要插在主機闆上,記憶體也要插在主機闆上。

主機闆的晶片組(Chipset)和總線(Bus)解決了CPU和記憶體之間如何通信的問題。

  • 晶片組控制了資料傳輸的流轉,也就是資料從哪裡到哪裡的問題
  • 總線則是實際資料傳輸的高速公路。總線速度(Bus Speed)決定了資料能傳輸得多快。
  • 計算機主機闆上通常有着各種各樣的插槽

有了三大件,隻要配上電源供電,計算機差不多就可以跑起來了。

但是現在還缺少各類輸入(Input)/輸出(Output)裝置,也就是我們常說的I/O裝置。

如果你用的是自己的個人電腦,那顯示器肯定必不可少,隻有有了顯示器我們才能看到計算機輸出的各種圖像、文字,這也就是所謂的輸出裝置。

同樣的,滑鼠和鍵盤也都是必不可少的配件。這樣我才能輸入文本,寫下這篇文章。它們也就是所謂的輸入裝置。

最後,你自己配的個人計算機,還要配上一個硬碟。這樣各種資料才能持久地儲存下來。

絕大部分人都會給自己的機器裝上一個機箱,配上風扇,解決灰塵和散熱的問題。

不過機箱和風扇,算不上是計算機的必備硬體,我們拿個紙闆或者外面放個電風扇,也一樣能用。

顯示器、滑鼠、鍵盤和硬碟這些東西并不是一台計算機必須的部分。

其實隻需要有I/O裝置,能讓我們從計算機裡輸入和輸出資訊就可以了。

很多網吧的計算機就沒有硬碟,而是直接通過區域網路,讀寫遠端網絡硬碟裡面的資料。

各類雲伺服器,隻要讓計算機能通過網絡,SSH遠端登陸通路就好了,是以也沒必要配顯示器、滑鼠、鍵盤這些東西。

這樣不僅能夠節約成本,還更友善維護。

還有一個很特殊的裝置,就是顯示卡(Graphics Card)。

現在,使用圖形界面作業系統的計算機,無論是Windows、Mac OS還是Linux,顯示卡都是必不可少的。

有人可能要說了,我裝機的時候沒有買顯示卡,計算機一樣可以正常跑起來啊!那是因為,現在的主機闆都帶了内置的顯示卡。

如果你用計算機玩遊戲,做圖形渲染或者跑深度學習應用,你多半就需要買一張單獨的顯示卡,插在主機闆上。

顯示卡之是以特殊,是因為顯示卡裡有除了CPU之外的另一個“處理器”,也就是GPU(Graphics Processing Unit,圖形處理器),GPU一樣可以做各種“計算”的工作。

滑鼠、鍵盤以及硬碟都是插在主機闆上的。作為外部I/O裝置,它們是通過主機闆上的南橋(SouthBridge)晶片組,來控制和CPU之間的通信的。

“南橋”晶片的名字很直覺

  • 它在主機闆上的位置,通常在主機闆的“南面”
  • 它的作用就是作為“橋”,來連接配接滑鼠、鍵盤以及硬碟這些外部裝置和CPU之間的通信。

有了南橋,自然對應着也有“北橋”。

是的,以前的主機闆上通常也有“北橋”晶片,用來作為“橋”,連接配接CPU和記憶體、顯示卡之間的通信。

不過,随着時間的變遷,現在的主機闆上的“北橋”晶片的工作,已經被移到了CPU的内部,是以你在主機闆上,已經看不到北橋晶片了。

2 馮·諾依曼體系結構

剛才我們講了一台計算機的硬體組成,這說的是我們平時用的個人電腦或者伺服器。那我們平時最常用的智能手機的組成,也是這樣嗎?

我們手機裡隻有SD卡(Secure Digital Memory Card)類似硬碟功能的存儲卡插槽,并沒有記憶體插槽、CPU插槽這些東西。

沒錯,因為手機尺寸的原因,手機制造商們選擇把

CPU、記憶體、網絡通信,乃至攝像頭晶片,都封裝到一個晶片,然後再嵌入到手機主機闆上。

這種方式叫SoC,也就是System on a Chip(系統晶片)。

看起來,個人電腦和智能手機的硬體組成方式不太一樣。

可是,我們寫智能手機上的App,和寫個人電腦的用戶端應用似乎沒有什麼差别,都是通過“進階語言”這樣的程式設計語言撰寫、編譯之後,一樣是把代碼和資料加載到記憶體裡來執行。

無論是個人電腦/伺服器/智能手機,還是Raspberry Pi這樣的微型卡片機,都遵循着同一個“計算機”的抽象概念。

這是怎麼樣一個“計算機”呢?這其實就是,計算機鼻祖馮·諾依曼提出的馮·諾依曼體系結構(Von Neumann architecture),也叫存儲程式計算機。

什麼是存儲程式計算機呢?這裡面其實暗含了兩個概念

  • “可程式設計”計算機
  • “存儲”計算機

什麼是“不可程式設計”???

計算機是由各種門電路組合而成的,然後通過組裝出一個固定的電路版,完成一個特定的計算程式。

一旦需要修改功能,就要重新組裝電路。這樣的話,計算機就是“不可程式設計”的,因為程式在計算機硬體層面是“寫死”的。

最常見的就是老式電腦,電路闆設好了加減乘除,做不了任何計算邏輯固定之外的事情。

  • 電腦的本質是一個不可程式設計的計算機

我們再來看“存儲”計算機。

程式本身是存儲在計算機的記憶體裡,可以通過加載不同的程式來解決不同的問題。

有“存儲程式計算機”,自然也有不能存儲程式的計算機。

典型的就是早年的“Plugboard”這樣的插線闆式的計算機。整個計算機就是一個巨大的插線闆,通過在闆子上不同的插頭或者接口的位置插入線路,來實作不同的功能。這樣的計算機自然是“可程式設計”的,但是編寫好的程式不能存儲下來供下一次加載使用,不得不每次要用到和目前不同的“程式”的時候,重新插闆子,重新“程式設計”。

  • 著名的Engima Machine就用到了Plugboard來進行“程式設計”

可以看到,無論是“不可程式設計”還是“不可存儲”,都會讓使用計算機的效率大大下降。

而這個對于效率的追求,也就是“存儲程式計算機”的由來。

馮,基于當時在秘密開發的EDVAC寫了一篇報告First Draft of a Report on the EDVAC,描述了他心目中的一台計算機應該長什麼樣。這篇報告在曆史上有個很特殊的簡稱,叫First Draft。這樣,現代計算機的發展就從祖師爺寫的一份草案開始了。

First Draft裡面說了一台計算機應該有哪些部分組成

首先是一個包含

  • 算術邏輯單元(Arithmetic Logic Unit,ALU)
  • 處理器寄存器(Processor Register)

的處理器單元(Processing Unit),用來完成各種算術和邏輯運算。

因為它能夠完成各種資料的處理或者計算工作,是以也有人把這個叫作資料通路(Datapath)或者運算器。

然後是一個包含

  • 指令寄存器(Instruction Reigster)
  • 程式計數器(Program Counter)

的控制器單元(Control Unit/CU),用來控制程式的流程,通常就是不同條件下的分支和跳轉。

在現在的計算機裡,上面的算術邏輯單元和這裡的控制器單元,共同組成了我們說的CPU。

接着是用來存儲資料(Data)和指令(Instruction)的記憶體。以及更大容量的外部存儲,在過去,可能是錄音帶、磁鼓這樣的裝置,現在通常就是硬碟。

最後就是各種輸入和輸出裝置,以及對應的輸入和輸出機制。

我們現在無論是使用什麼樣的計算機,其實都是和輸入輸出裝置在打交道。

  • 個人電腦的滑鼠鍵盤是輸入裝置,顯示器是輸出裝置
  • 我們用的智能手機,觸摸屏既是輸入裝置,又是輸出裝置
  • 跑在各種雲上的伺服器,則是通過網絡來進行輸入和輸出。這個時候,網卡既是輸入裝置又是輸出裝置
任何一台計算機的任何一個部件都可以歸到運算器、控制器、存儲器、輸入裝置和輸出裝置中,而所有的現代計算機也都是基于這個基礎架構來設計開發的

而所有的計算機程式,也都可以抽象為從輸入裝置讀取輸入資訊,通過運算器和控制器來執行存儲在存儲器裡的程式,最終把結果輸出到輸出裝置中。而我們所有撰寫的無論進階還是低級語言的程式,也都是基于這樣一個抽象架構來進行運作的。

  • 馮·諾依曼體系結構示意圖

3 總結

馮·諾依曼體系結構确立了我們現在每天使用的計算機硬體的基礎架構。

是以,學習計算機組成原理,其實就是學習和拆解馮·諾依曼體系結構。

具體來說,其實就是

  • 學習控制器、運算器的工作原理,也就是CPU是怎麼工作的,以及為何這樣設計
  • 學習記憶體的工作原理,從最基本的電路,到上層抽象給到CPU乃至應用程式的接口是怎樣的
  • 學習CPU是怎麼和輸入裝置、輸出裝置打交道的。=

學習組成原理,就是在了解從控制器、運算器、存儲器、輸入裝置以及輸出裝置,從電路這樣的硬體,到最終開放給軟體的接口,是怎麼運作的,為什麼要設計成這樣,以及在軟體開發層面怎麼盡可能用好它。

4 推薦閱讀

  • First Draft of a Report on the EDVAC

    對于工程師來說,直接讀取英文論文的原文,既可以搞清楚、弄明白對應的設計及其背後的思路來源,還可以幫你破除對于論文或者核心技術的恐懼心理。

5 思考

計算機行業的兩大祖師爺之一,除了馮·諾依曼機之外,還有一位就是著名的圖靈(Alan Mathison Turing)。對應的,我們現在的計算機也叫圖靈機(Turing Machine)。那麼圖靈機和馮·諾依曼機是兩種不同的計算機麼?圖靈機是一種什麼樣的計算機抽象呢?

歡迎留言分享你的思考和疑惑,也可以把本文分享給你的朋友,一起學習和進步!

參考

深入淺出計算機組成原理