天天看點

深入淺出計算機組成原理 通過CPU主頻看性能(自我提升第8天)

希望大家關注菜鳥,不然後期的文章,各位可能無法及時看到

文章目錄

      • 深入淺出計算機組成原理
        • 1、計算機性能的兩個名額
        • 2、計算機的計時機關: CPU時鐘
        • 大家了解了上面的知識點,那接下來就是兩者結合的高光時刻了

深入淺出計算機組成原理

入門四知識點:

1、計算機性能的兩個名額

① 響應時間(Response time)或者叫執行時間(Execution time),表示執行一個程式一共所花的時間。

② 吞吐率(Throughput)或者叫帶寬(Bandwidth),表示一定時間内,計算機可以執行的的指令的多少。

2、計算機的計時機關: CPU時鐘

時間是一個很自然的用來衡量性能的名額,但是用時間來衡量時,有兩個問題。

① 第一個就是時間不“準”。

為什麼不準呢?

  1. 計算機可能同時運作着好多個程式,CPU 實際上不停地在各個程式之間進行切換。在這些走掉的時間裡面,很可能 CPU 切換去運作别的程式了。
  2. 有些程式在運作的時候,可能要從網絡、硬碟去讀取資料,要等網絡和硬碟把資料讀出來,給到記憶體和 CPU。

是以說,要想準确統計某個程式運作時間,進而去比較兩個程式的實際性能,我們得把這些時間給刨除掉。

而Linux裡面有一個叫 time 的指令,可以幫我們統計出來,同樣的 Wall Clock Time (統計時間是用類似于“掐秒表”一樣,記錄程式運作結束的時間減去程式開始運作的時間。這個時間也叫 Wall Clock Time 或者Elapsed Time,就是在運作程式期間花費的時間)下,程式實際在 CPU 上到底花了多少時間。運作下面代碼:

time seq 1000000 | wc -l  //代碼表示,輸出從 1 到1000000的清單,然後通過通道傳入到wc中,并隻列印出列數
           

這裡不清楚通道的可以看我的部落格 趣談Linux作業系統 熟悉常用指令(自我提升第5天) 不清楚seq的看 這篇部落格 不清楚wc的看菜鳥教程wc

可以得到該結果(當然這是測試CPU運作時間的,是以每個電腦不一樣,同一個電腦也可能不一樣)

1000000

real    0m0.013s
user    0m0.017s
sys     0m0.008s
           

time 指令。它會傳回三個值:

第一個是real time,也就是我們說的Wall Clock Time,也就是運作程式整個過程中流逝掉的時間;

第二個是user time,也就是 CPU 在運作你的程式,在使用者态運作指令的時間(這是執行此程序所消耗的實際CPU時間,其他程序和此程序阻塞的時間并不包括在内);

第三個是sys time,是 CPU 在運作你的程式,在作業系統核心裡運作指令的時間(即在核心執行系統調用所使用的CPU時間)。

而程式實際花費的 CPU 執行時間(CPU Time),就是 user time 加上 sys time。(程式實際占用的 CPU 時間一般比 Elapsed Time 要少不少)

但是我這裡卻出現了real<user+sys,這是為什麼?

在多處理器的系統上,一個程序如果有多個線程或者有多個子程序可能導緻real time比CPU time(user + sys time)要小,這是因為不同的線程或程序可以并行執行。換句話說,這裡的并行是指真正的并行,不是在單CPU上的多線程并發,如果系統隻有一個CPU(單核),那麼即使多線程,也不會使得real < user + sys。

舉個例子,一個純計算任務,沒有系統調用(即沒有耗費sys time,隻有user time),采用單線程需要執行的時間為8s。那麼在一個四核的機器上,采用并行算法,用4個核一起算,理想上如果完全并行,加速比為4,2s内就能完成,那麼從開始到結束,real time是2s。user time呢?應該是2s * 4 = 8s. 是以此時會出現real < sys + user的情況。

同樣,對于多CPU的機器上的多線程程式,也會有這樣的結果。

參考該篇部落格

這裡不明白可以不用深究!!!!

②其次,即使我們已經拿到了 CPU 時間,我們也不一定可以直接“比較”出兩個程式的性能差異。

這裡又為什麼呢?

  1. 即使在同一台計算機上,CPU 可能滿載運作也可能降頻運作,降頻運作的時候自然花的時間會多一些。
  2. 除了 CPU 之外,時間這個性能名額還會受到主機闆、記憶體這些其他相關硬體的影響。

是以,我們需要對“時間”這個我們可以感覺的名額進行拆解,把程式的 CPU 執行時間變成 CPU時鐘周期數(CPU Cycles)和 時鐘周期時間(Clock Cycle)的乘積。

程式的 CPU 執行時間 =CPU 時鐘周期數×時鐘周期時間

我們先來了解一下什麼是時鐘周期時間?

這個時鐘周期,在你買電腦的一刻就已經确定了,即是你電腦CPU 的一個“鐘表”能夠識别出來的最小的時間間隔(當然,這個你可以自己去調整)。在 CPU 内部,和我們平時戴的電子石英表類似,有一個叫晶體振蕩器(Oscillator Crystal)的東西,簡稱為晶振。我們把晶振當成 CPU 内部的電子表來使用。晶振帶來的每一次“滴答”,就是時鐘周期時間。而CPU主頻越高,意味着這個表(晶振)走得越快,我們的CPU 也就“被逼”着走得越快。

接下來回到公式,那麼我們想減少程式的CPU執行時間,那我們應該減少時鐘周期時間,即提高主頻,但是這似乎并不是主要的,畢竟這個晶振是固定的,如果不人為改變那麼是不會變短的,要麼就買個更好的,但這不現實,是以我們的目标應該放在:CPU 時鐘周期數

對于 CPU 時鐘周期數,我們可以再做一個分解,把它變成 “ 指令數×每條指令的平均時鐘周期數(Cycles Per Instruction,簡稱 CPI)” 。不同的指令需要的 Cycles 是不同的,加法和乘法都對應着一條 CPU 指令,但是乘法需要的 Cycles 就比加法要多,自然也就慢。是以:

程式的 CPU 執行時間 = 指令數×CPI×時鐘周期時間

是以,如果我們想要解決性能問題,其實就是要優化這三者。

  1. 時鐘周期時間,就是計算機主頻,這個取決于計算機硬體。我們所熟知的摩爾定律就一直在不停地提高我們計算機的主頻。比如說,我最早使用的 80386 主頻隻有 33MHz,現在手頭的筆記本電腦就有 2.8GHz,在主頻層面,就提升了将近 100 倍[ 但現在這個方法就不太好實作,因為繼續提高主頻,功耗和散熱都會是問題,而且其它部件跟不上節奏也是白忙活的,這也是為什麼現很多廠家主頻不進反退 ]。
  2. 每條指令的平均時鐘周期數 CPI,就是一條指令到底需要多少 CPU Cycle [ 計算機執行一條指令所需的時鐘周期數 ]。在後面講解CPU 結構的時候,我們會看到,現代的 CPU 通過流水線技術(Pipeline),讓一條指令需要的 CPU Cycle 盡可能地少。是以,對于 CPI 的優化,也是計算機組成和體系結構中的重要一環。
  3. 指令數,代表執行我們的程式到底需要多少條指令、用哪些指令。這個很多時候就把挑戰交給了編譯器。同樣的代碼,編譯成計算機指令時候,就有各種不同的表示方式。

(這裡大家先了解如何減少CPU執行時間就行)

大家了解了上面的知識點,那接下來就是兩者結合的高光時刻了

1、和搬東西做對比,如果我們的響應時間快(速度快),那自然也可以在相同時間内搬更多的東西,吞吐率自然也就高了。

2、除了提高響應時間,我們還可以多來一些人,例如:現在的多核計算機,就是增加了更多的處理器(增加勞工),那速度自然就上去了(這裡細心的讀者就會發現上面我說了的,即:real<user+sys)。

3、提升吞吐率的辦法有很多。大部分時候,我們隻要多加一些機器,多堆一些硬體就好了。(但是這個也是定性的,是以考慮範圍不大,同:晶振)

4、性能的定義定義成響應時間的倒數,也就是:性能 = 1/ 響應時間(上面了解了時鐘周期,這裡的響應時間[程式運作結束的時間減去程式開始運作的時間],想必大家也就了解了吧)

繼續閱讀