女神鎮樓
1、計算機的基本硬件組成===CPU、內存和主板
(1)CPU
計算機最重要的核心配件,叫做中央處理器。計算機的所有“計算”都是由 CPU 來進行的。CPU 也是整台計算機中造價最昂貴的部分之一。CPU,一般都被叫作超大規模集成電路(Very-Large-Scale Integration,VLSI)。這些電路,實際上都是一個個晶體管組合而成的。CPU 在計算,其實就是讓晶體管里面的“開關”不斷地去“打開”和“關閉”,來組合完成各種運算和功能。
(2)內存
程序、打開的瀏覽器、運行的游戲,都要加載到內存里才能運行。程序讀取的數據、計算得到的結果,也都要放在內存里。內存越大,能加載的東西自然也就越多。存放在內存里的程序和數據,需要被 CPU 讀取,CPU 計算完之后,還要把數據寫回到內存。然而 CPU 不能直接插到內存上,反之亦然。
(3)主板
主板是一個有着各種各樣,有時候多達數十乃至上百個插槽的配件。CPU 要插在主板上,內存也要插在主板上。主板的芯片組(Chipset)和總線(Bus)解決了 CPU 和內存之間如何通信的問題。芯片組控制了數據傳輸的流轉,也就是數據從哪里到哪里的問題。總線則是實際數據傳輸的高速公路。因此,總線速度(Bus Speed)決定了數據能傳輸得多快。
(4)其他非必要組件
電源、輸入(Input)/ 輸出(Output)設備,也就是 I/O 設備、機箱、風扇、硬盤、顯卡(GPU)等
2、馮·諾依曼體系結構
(1)包含算術邏輯單元(Arithmetic Logic Unit,ALU)和處理器寄存器(Processor Register)的處理器單元(Processing Unit),用來完成各種算術和邏輯運算
(2)包含指令寄存器(Instruction Register)和程序計數器(Program Counter)的控制器單元(Control Unit/CU),用來控制程序的流程,通常就是不同條件下的分支和跳轉。
(3)用來存儲數據(Data)和指令(Instruction)的內存。以及更大容量的外部存儲(通常指硬盤);
(4)輸入輸出設備。個人電腦的鼠標鍵盤是輸入設備,顯示器是輸出設備。智能手機,觸摸屏既是輸入設備,又是輸出設備。而跑在各種雲上的服務器,則是通過網絡來進行輸入和輸出。
任何一台計算機的任何一個部件都可以歸到運算器、控制器、存儲器、輸入設備和輸出設備中,而所有的現代計算機也都是基於這個基礎架構來設計開發的。
而所有的計算機程序,也都可以抽象為從輸入設備讀取輸入信息,通過運算器和控制器來執行存儲在存儲器里的程序,最終把結果輸出到輸出設備中。而我們所有撰寫的無論高級還是低級語言的程序,也都是基於這樣一個抽象框架來進行運作的。
學習計算機組成原理,其實就是學習和拆解馮·諾依曼體系結構。
學習控制器、運算器的工作原理,也就是 CPU 是怎么工作的,以及為何這樣設計;學習內存的工作原理,從最基本的電路,到上層抽象給到 CPU 乃至應用程序的接口是怎樣的;學習 CPU 是怎么和輸入設備、輸出設備打交道的。
理解從控制器、運算器、存儲器、輸入設備以及輸出設備,從電路這樣的硬件,到最終開放給軟件的接口,是怎么運作的,為什么要設計成這樣,以及在軟件開發層面怎么盡可能用好它。
3、計算機組成原理知識地圖
4、“性能”介紹:性能可以看做時間的倒數
計算機性能中,有兩個重要的指標:、吞吐率
(1)響應時間指的就是,我們執行一個程序,到底需要花多少時間。花的時間越少,自然性能就越好。
(2)吞吐率是指在一定的時間范圍內,到底能處理多少事情。這里的“事情”,在計算機里就是處理的數據或者執行的程序指令。
5、CPU指針:計算機的計時單位
雖然時間是一個很自然的用來衡量性能的指標,但是用時間來衡量時,有兩個問題。
(1)時間不准:計算機可能同時運行着好多個程序,CPU 實際上不停地在各個程序之間進行切換。在這些走掉的時間里面,很可能 CPU 切換去運行別的程序了。而且,有些程序在運行的時候,可能要從網絡、硬盤去讀取數據,要等網絡和硬盤把數據讀出來,給到內存和 CPU。所以說,要想准確統計某個程序運行時間,進而去比較兩個程序的實際性能,我們得把這些時間給刨除掉。
(2)即使已經拿到了 CPU 時間,也不一定可以直接“比較”出兩個程序的性能差異。即使在同一台計算機上,CPU 可能滿載運行也可能降頻運行,降頻運行的時候自然花的時間會多一些。
除了 CPU 之外,時間這個性能指標還會受到主板、內存這些其他相關硬件的影響。所以,需要對“時間”這個可以感知的指標進行拆解,把程序的 CPU 執行時間變成 CPU 時鍾周期數(CPU Cycles)和 時鍾周期時間(Clock Cycle)的乘積。
程序的 CPU 執行時間 =CPU 時鍾周期數×時鍾周期時間
時鍾周期時間:CPU內部有一個叫做晶體振盪器(Oscillator Crystal)的東西,簡稱為晶振。我們把晶振當成 CPU 內部的電子表來使用。晶振帶來的每一次“滴答”,就是時鍾周期時間。
最簡單的提升性能方案,自然縮短時鍾周期時間,也就是提升主頻。換句話說,就是換一塊好一點的 CPU。如果能夠減少程序需要的 CPU 時鍾周期數量,一樣能夠提升程序性能。
對於 CPU 時鍾周期數,可以再做一個分解,把它變成“指令數×每條指令的平均時鍾周期數(Cycles Per Instruction,簡稱 CPI)”。不同的指令需要的 Cycles 是不同的,加法和乘法都對應着一條 CPU 指令,但是乘法需要的 Cycles 就比加法要多,自然也就慢。在這樣拆分了之后,我們的程序的 CPU 執行時間就可以變成這樣三個部分的乘積。
程序的 CPU 執行時間 = 指令數×CPI×Clock Cycle Time
提升性能需要優化的3個方面:
(1)時鍾周期時間,就是計算機主頻,這個取決於計算機硬件。
(2)每條指令的平均時鍾周期數 CPI,就是一條指令到底需要多少 CPU Cycle。
(3)指令數,代表執行我們的程序到底需要多少條指令、用哪些指令。這個很多時候就把挑戰交給了編譯器。同樣的代碼,編譯成計算機指令時候,就有各種不同的表示方式。
6、從哪些方面提升“性能”
CPU性能里面有一個公式:
程序的 CPU 執行時間 = 指令數×CPI×Clock Cycle Time
提升計算機的性能,我們可以從指令數、CPI 以及 CPU 主頻這三個地方入手。
(1)在 CPU 上多放一點晶體管,不斷提升 CPU 的時鍾頻率,這樣就能讓 CPU 變得更快,程序的執行時間就會縮短。但是這樣會有一個極限,導致功耗增加太多,就會導致 CPU 散熱跟不上。
(2)並行提高性能,提升吞吐率,現在用的 2 核、4 核,乃至 8 核的 CPU就是這種方式。
並不是所有問題,都可以通過並行提高性能來解決。如果想要使用這種思想,需要滿足這樣幾個條件。
第一,需要進行的計算,本身可以分解成幾個可以並行的任務。好比上面的乘法和加法計算,幾個人可以同時進行,不會影響最后的結果。
第二,需要能夠分解好問題,並確保幾個人的結果能夠匯總到一起。
第三,在“匯總”這個階段,是沒有辦法並行進行的,還是得順序執行,一步一步來。
這就引出了我們在進行性能優化中,常常用到的一個經驗定律,阿姆達爾定律(Amdahl’s Law)。這個定律說的就是,對於一個程序進行優化之后,處理器並行運算之后效率提升的情況。具體可以用這樣一個公式來表示:
優化后的執行時間 = 受優化影響的執行時間 / 加速倍數 + 不受影響的執行時間
現在無論是簡單地通過提升主頻,還是增加更多的 CPU 核心數量,通過並行來提升性能,都會遇到相應的瓶頸。僅僅簡單地通過“堆硬件”的方式,在今天已經不能很好地滿足我們對於程序性能的期望了。