計算機組成原理-基本組成

計算機組成原理-基本組成

  本文根據徐文浩老師的計算機組成原理記錄:計算機組成原理

1 計算機組成原理知識地圖

計算機組成原理知識地圖

錯誤描述: 在硬件和軟件之間需要一座橋樑,而“計算機組成原理”就扮演了這樣一個角色,它既隔離了軟件和硬件,也提供了讓軟件無需關心硬件,就能直接操作硬件的接口。這裏的計算機組成原理改成操作系統是不是更好,而且感覺這句話說的就是操作系統呀

正確描述: 其實 操作系統 也是一個“軟件”,而開發操作系統,其實只需要關注到“組成原理”或者說“體系結構”就好了,而不需要真的瞭解硬件,比如電路層面的實現。操作系統,其實是在“組成原理”所講到的“指令集”上的一層封裝。

2 計算機的基本硬件組成

2.1 CPU: 中央處理器(Central Processing Unit)

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

2.2 內存: 內存(Memory)

  撰寫的程序、打開的瀏覽器、運行的遊戲,都要加載到內存裏才能運行; 程序讀取的數據、計算得到的結果,也都要放在內存裏

2.3 主板: 主板(Motherboard)

  存放在內存裏的程序和數據,需要被 CPU 讀取,CPU 計算完之後,還要把數據寫回到內存。然而 CPU 不能直接插到內存上,反之亦然。於是纔有了主板

  主板的芯片組(Chipset)和總線(Bus)解決了 CPU 和內存之間如何通信的問題。芯片組控制了數據傳輸的流轉,也就是數據從哪裏到哪裏的問題。總線則是實際數據傳輸的高速公路。因此,總線速度(Bus Speed)決定了數據能傳輸得多快。

2.4 I/O設備

  外部 I/O 設備,它們是通過主板上的南橋(SouthBridge)芯片組,來控制和 CPU 之間的通信的。“南橋”芯片的名字很直觀,一方面,它在主板上的位置,通常在主板的“南面”。另一方面,它的作用就是作爲“橋”,來連接鼠標、鍵盤以及硬盤這些外部設備和 CPU 之間的通信。

  以前的主板上通常也有“北橋”芯片,用來作爲“橋”,連接 CPU 和內存、顯卡之間的通信。不過,隨着時間的變遷,現在的主板上的“北橋”芯片的工作,已經被移到了 CPU 的內部,所以你在主板上,已經看不到北橋芯片了。

2.5 特殊的設備

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

3 馮·諾依曼體系結構

  馮·諾依曼(John von Neumann)提出的馮·諾依曼體系結構(Von Neumann architecture),也叫存儲程序計算機。存儲程序計算機其實暗含了兩個概念,一個是“可編程”計算機,一個是“存儲”計算機。

  計算機是由各種門電路組合而成的,然後通過組裝出一個固定的電路版,來完成一個特定的計算程序。一旦需要修改功能,就要重新組裝電路。這樣的話,計算機就是“不可編程”的,因爲程序在計算機硬件層面是“寫死”的。最常見的就是老式計算器,電路板設好了加減乘除,做不了任何計算邏輯固定之外的事情。

  “存儲”計算機。程序本身是存儲在計算機的內存裏,可以通過加載不同的程序來解決不同的問題。有“存儲程序計算機”,自然也有不能存儲程序的計算機。典型的就是早年的“Plugboard”這樣的插線板式的計算機。整個計算機就是一個巨大的插線板,通過在板子上不同的插頭或者接口的位置插入線路,來實現不同的功能。這樣的計算機自然是“可編程”的,但是編寫好的程序不能存儲下來供下一次加載使用,不得不每次要用到和當前不同的“程序”的時候,重新插板子,重新“編程”。

![馮·諾依曼體系結構示意圖][馮·諾依曼體系結構示意圖]

  任何一臺計算機的任何一個部件都可以歸到運算器、控制器、存儲器、輸入設備和輸出設備中,而所有的現代計算機也都是基於這個基礎架構來設計開發的。

  所有的計算機程序,都可以抽象爲從輸入設備讀取輸入信息,通過運算器和控制器來執行存儲在存儲器裏的程序,最終把結果輸出到輸出設備中。目前所有的無論高級還是低級語言的程序,也都是基於這樣一個抽象框架來進行運作的。

3.1 First Draft 計算機組成部分

  首先是一個包含算術邏輯單元(Arithmetic Logic Unit,ALU)和處理器寄存器(Processor Register)的處理器單元(Processing Unit),用來完成各種算術和邏輯運算。因爲它能夠完成各種數據的處理或者計算工作,因此也有人把這個叫作數據通路(Datapath)或者運算器。

  然後是一個包含指令寄存器(Instruction Register)和程序計數器(Program Counter)的控制器單元(Control Unit/CU),用來控制程序的流程,通常就是不同條件下的分支和跳轉。在現在的計算機裏,上面的算術邏輯單元和這裏的控制器單元,共同組成了我們說的 CPU。

  接着是用來存儲數據(Data)和指令(Instruction)的內存。以及更大容量的外部存儲,在過去,可能是磁帶、磁鼓這樣的設備,現在通常就是硬盤。

  最後就是各種輸入和輸出設備

3.2 圖靈與馮·諾依曼體系結構

  兩者有交叉但是不同,根據瞭解整理如下:

  • 圖靈機是一種思想模型(計算機的基本理論基礎),是一種有窮的、構造性的問題的問題求解思路,圖靈認爲凡是能用算法解決的問題也一定能用圖靈機解決;
  • 馮諾依曼提出了“存儲程序”的計算機設計思想,並“參照”圖靈模型設計了歷史上第一臺電子計算機,即馮諾依曼機

  ps:有看到一種有爭議說法:馮諾依曼機是圖靈機的實現,感覺這有點過於片面,所以上述姑且改爲參照

4 計算機性能

4.1 響應時間

  響應時間(Response time)或者叫執行時間(Execution time)。想要提升響應時間這個性能指標,你可以理解爲讓計算機“跑得更快”。

4.2 吞吐率

  吞吐率(Throughput)或者帶寬(Bandwidth),想要提升這個指標,你可以理解爲讓計算機“搬得更多”。

4.3 CPU 主頻

  CPU 主頻即 CPU 的時鐘頻率, 2.8GHz: 可以粗淺地認爲,CPU 在 1 秒時間內,可以執行的簡單指令的數量是 2.8G 條

  在 CPU 內部,和我們平時戴的電子石英錶類似,有一個叫晶體振盪器(Oscillator Crystal)的東西,簡稱爲晶振。我們把晶振當成 CPU 內部的電子錶來使用。晶振帶來的每一次“滴答”,就是時鐘週期時間

  性能 = 1/ 響應時間

  運行一下 time 命令。它會返回三個值,第一個是real time,也就是我們說的 Wall Clock Time,也就是運行程序整個過程中流逝掉的時間;第二個是user time,也就是 CPU 在運行你的程序,在用戶態運行指令的時間;第三個是sys time,是 CPU 在運行你的程序,在操作系統內核裏運行指令的時間。而程序實際花費的 CPU 執行時間(CPU Time),就是 user time 加上 sys time

$ time seq 1000000 | wc -l

1000000
real  0m0.101s
user  0m0.031s
sys  0m0.016s

  實際上程序用了 0.101s,但是 CPU time 只有 0.031+0.016 = 0.047s。運行程序的時間裏,只有不到一半是實際花在這個程序上的

“並行原因”的運行的。雖然 seq 和 wc 這兩個命令都是單線程運行的,但是這兩個命令在多核 cpu 運行的情況下,會分別分配到兩個不同的 cpu,於是 user 和 sys 的時間都是兩個 cpu 上運行的時間之和,就可能超過 real 的時間。可以這樣來快速驗證

運行 time seq 100000000 | wc -l & 讓這個命令多跑一會兒,並且在後臺運行。然後利用 top 命令看不同進程的 cpu 佔用情況,你會在 top 的前幾行裏看到 seq 和 wc 的 cpu 佔用都接近 100,實際是各被分配到了一個不同的 cpu 執行

  即使拿到了 CPU 時間,我們也不一定可以直接“比較”出兩個程序的性能差異。即使在同一臺計算機上,CPU 可能滿載運行也可能降頻運行,降頻運行的時候自然花的時間會多一些

  除了 CPU 之外,時間這個性能指標還會受到主板、內存這些其他相關硬件的影響。所以,我們需要對“時間”這個我們可以感知的指標進行拆解,把程序的 CPU 執行時間變成 CPU 時鐘週期數(CPU Cycles)和 時鐘週期時間(Clock Cycle)的乘積

  程序的 CPU 執行時間 =CPU 時鐘週期數×時鐘週期時間

  簡單的提升性能方案,自然縮短時鐘週期時間,也就是提升主頻。換句話說,就是換一塊好一點的 CPU。不過,這個是軟件工程師控制不了的事情,所以我們就把目光挪到了乘法的另一個因子——CPU 時鐘週期數上。如果能夠減少程序需要的 CPU 時鐘週期數量,一樣能夠提升程序性能

  對於 CPU 時鐘週期數,我們可以再做一個分解,把它變成“指令數×每條指令的平均時鐘週期數(Cycles Per Instruction,簡稱 CPI)”。不同的指令需要的 Cycles 是不同的,加法和乘法都對應着一條 CPU 指令,但是乘法需要的 Cycles 就比加法要多,自然也就慢。在這樣拆分了之後,程序的 CPU 執行時間就可以變成這樣三個部分的乘積

  程序的 CPU 執行時間 = 指令數×CPI×Clock Cycle Time

  • 時鐘週期時間,就是計算機主頻,這個取決於計算機硬件。我們所熟知的摩爾定律就一直在不停地提高我們計算機的主頻。比如說,我最早使用的 80386 主頻只有 33MHz,現在手頭的筆記本電腦就有 2.8GHz,在主頻層面,就提升了將近 100 倍

  • 每條指令的平均時鐘週期數 CPI,就是一條指令到底需要多少 CPU Cycle。在後面講解 CPU 結構的時候,我們會看到,現代的 CPU 通過流水線技術(Pipeline),讓一條指令需要的 CPU Cycle 儘可能地少。因此,對於 CPI 的優化,也是計算機組成和體系結構中的重要一環

  • 指令數,代表執行我們的程序到底需要多少條指令、用哪些指令。這個很多時候就把挑戰交給了編譯器。同樣的代碼,編譯成計算機指令時候,就有各種不同的表示方式

5 功耗

   CPU,一般都被叫作超大規模集成電路(Very-Large-Scale Integration,VLSI)。這些電路,實際上都是一個個晶體管組合而成的。CPU 在計算,其實就是讓晶體管裏面的“開關”不斷地去“打開”和“關閉”,來組合完成各種運算和功能

  想要計算得快,一方面,我們要在 CPU 裏,同樣的面積裏面,多放一些晶體管,也就是增加密度;另一方面,要讓晶體管“打開”和“關閉”得更快一點,也就是提升主頻。而這兩者,都會增加功耗,帶來耗電和散熱的問題

  可以把一個計算機 CPU 想象成一個巨大的工廠,裏面有很多工人,相當於 CPU 上面的晶體管,互相之間協同工作

  爲了工作得快一點,我們要在工廠裏多塞一點人。你可能會問,爲什麼不把工廠造得大一點呢?這是因爲,人和人之間如果離得遠了,互相之間走過去需要花的時間就會變長,這也會導致性能下降。這就好像如果 CPU 的面積大,晶體管之間的距離變大,電信號傳輸的時間就會變長,運算速度自然就慢了

  除了多塞一點人,還希望每個人的動作都快一點,這樣同樣的時間裏就可以多幹一點活兒了。這就相當於提升 CPU 主頻,但是動作快,每個人就要出汗散熱。要是太熱了,對工廠裏面的人來說會中暑生病,對 CPU 來說就會崩潰出錯

  爲了要提升性能,我們需要不斷地增加晶體管數量。同樣的面積下,要多放一點晶體管,就要把晶體管造得小一點。這個就是平時所說的提升“製程”。從 28nm 到 7nm,相當於晶體管本身變成了原來的 1/4 大小。這個就相當於在工廠裏,同樣的活兒,要找瘦小一點的工人,這樣一個工廠裏面就可以多一些人。我們還要提升主頻,讓開關的頻率變快,也就是要找手腳更快的工人

  在 CPU 裏面,能夠放下的晶體管數量和晶體管的“開關”頻率也都是有限的。一個 CPU 的功率,可以用這樣一個公式來表示:功耗 ~= 1/2 ×負載電容×電壓的平方×開關頻率×晶體管數量

5.1 阿姆達爾定律(Amdahl’s Law)

  這個定律說的就是,對於一個程序進行優化之後,處理器並行運算之後效率提升的情況。具體可以用這樣一個公式來表示:優化後的執行時間 = 受優化影響的執行時間 / 加速倍數 + 不受影響的執行時間

  1. 需要進行的計算,本身可以分解成幾個可以並行的任務。好比乘法和加法計算,幾個人可以同時進行,不會影響最後的結果
  2. 需要能夠分解好問題,並確保幾個人的結果能夠彙總到一起
  3. 在“彙總”這個階段,是沒有辦法並行進行的,還是得順序執行,一步一步來

5.2 原則性的性能提升方法

  1. 加速大概率事件。最典型的就是,過去幾年流行的深度學習,整個計算過程中,99% 都是向量和矩陣計算,於是,工程師們通過用 GPU 替代 CPU,大幅度提升了深度學習的模型訓練過程。本來一個 CPU 需要跑幾小時甚至幾天的程序,GPU 只需要幾分鐘就好了。Google 更是不滿足於 GPU 的性能,進一步地推出了 TPU

  2. 通過流水線提高性能。現代的工廠裏的生產線叫“流水線”。可以把裝配 iPhone 這樣的任務拆分成一個個細分的任務,讓每個人都只需要處理一道工序,最大化整個工廠的生產效率。類似的,CPU 其實就是一個“運算工廠”。把 CPU 指令執行的過程進行拆分,細化運行,也是現代 CPU 在主頻沒有辦法提升那麼多的情況下,性能仍然可以得到提升的重要原因之一

  3. 通過預測提高性能。通過預先猜測下一步該幹什麼,而不是等上一步運行的結果,提前進行運算,也是讓程序跑得更快一點的辦法

附錄1: 系統芯片

  我們手機裏只有 SD 卡(Secure Digital Memory Card)這樣類似硬盤功能的存儲卡插槽,並沒有內存插槽、CPU 插槽這些東西。沒錯,因爲手機尺寸的原因,手機制造商們選擇把 CPU、內存、網絡通信,乃至攝像頭芯片,都封裝到一個芯片,然後再嵌入到手機主板上。這種方式叫SoC,也就是 System on a Chip(系統芯片)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章