【計組詳析】CPU的前世今生

CPU是幹什麼的

衆所周知,計算機只能識別1100,爲什麼呢?根本原因在於CPUCPU 或者說所有的電子元件,只能有兩種狀態:變(1)(1)、不變(0)(0)/ 開(1)(1)、關(0)(0) 。但是知道這個和CPUCPU有什麼關係呢,CPUCPU的根本任務就是執行指令預算,也就是101 0,10101010101010001010101010101010100101010101010101010011010101010101000101010101010101010010101010101010101001這個過程到底是怎樣實現的呢。這就要從CPUCPU的內部結構開始說起了:

流水線式

CPUCPU並不是等一條指令完成後,再開始第二條指令。而是採用流水線,把CPUCPU的工作分成個四個流程,當取指令完成後,不是等待而是取第二條指令。
採用流水線技術後,並沒有加速單條指令的執行,每條指令的操作步驟一個也不能少,只是多條指令的不同操作步驟同時執行,因而從總體上看加快了指令流速度,縮短了程序執行時間
兩種方式比較:

  • 流水線方式:在t4t4時間內,完成了第11個指令,第二個指令完成34\frac{3}{4},第三個指令完成12\frac{1}{2},第四個指令完成14\frac{1}{4}
  • 串行方式 :在t4t4時間內,完成11條指令
    在同一個時間內,流水線方式可以完成更多的指令,CPUCPU的執行效率大大提高。

物理結構

cpucpu內部主要是由一大堆的運算器、控制器、寄存器組成。
在這裏插入圖片描述

  • 運算器負責算術運算(+/+ - * / 基本運算和附加運算)和邏輯運算(包括移位、邏輯測試或比較兩個值等)

  • 控制器則高級一點,負責應對所有的信息情況,調度運算器把計算做好。正如工廠的物流分配部門,控制單元是整個CPU的指揮控制中心,由指令寄存器、指令譯碼器、和操作控制器三個部件組成,對協調整個電腦有序工作極爲重要,它根據用戶預先編好的程序,以此從存儲器中取出各條指令,放在指令存儲器中通過指令譯碼器分析確定應該進行什麼操作,最後通過操作控制器按時序,向相應的部件發出微操作控制信號,操作控制器,主要包括 節拍脈衝發生器 控制矩陣 時鐘脈衝發生器,復位電路和啓停電路等控制邏輯。

  • 寄存器 就稍微複雜一點,既要對接控制器的命令,傳達命令給運算器;還要幫運算器記錄處理完或者將要處理的數據。CPU中暫時存放數據的地方,裏面保存着那些等待處理的數據,或已經處理過的數據,CPU訪問寄存器所用的時間要比訪問內存的時間短,採用寄存器可以減少CPU的訪問內存次數,從而提高了CPU的工作速度,但是因爲受到芯片面積和集成度所限制,寄存器組的容量不可能很大,寄存器組可分爲專用寄存器和通過寄存器,專用寄存器的作用是固定的,分別寄存相應的數據,而通過寄存器通途廣泛並可以由程序員規定其用途,通用寄存器的數目因微處理器而異。

  • 在這三種元件外,還有緩存(cachecache)(見新的問題小板車);
    總線就像工廠中各個部位之間的聯繫渠道,總線實際上是一組導線,是各種公共信號線的集合,用於作爲電腦中所有各組成部分傳輸信息公共使用的公路,直接和CPU相連的總線,其中包括 數據總線 地址總線 控制總線 其中書庫總線用來傳輸數據信息 地址總線用於傳送CPU發出的地址信息,控制總線用來傳送控制信號,時序信號和狀態信息等;
    核心顯卡等

操作流程(影響CPU性能的主要因素)

CPUCPU的工作原理就像一個工廠對產品的加工過程:進入工廠的原料(程序指令),經過物資分配部門(控制單元)的調度分配,被送往生產線(邏輯運算單元),生產出成品(處理後的數據)後,再存儲在倉庫(存儲單元)中,最後等着拿到市場上去賣(交由應用程序使用)。在這個過程中,我們注意到從控制單元開始,CPUCPU就開始了正式的工作,中間的過程是通過邏輯運算單元來進行運算處理,交到存儲單元代表工作的結束。

主頻

首先,指令指針(Instruction  PointerInstruction\,\, Pointer)會通知CPUCPU,將要執行的指令放置在內存中的存儲位置。因爲內存中的每個存儲單元都有編號(稱爲地址),可以根據這些地址把數據取出,通過地址總線送到控制單元中,指令譯碼器從指令寄存器IRIR中拿來指令,翻譯成CPUCPU可以執行的形式,然後決定完成該指令需要哪些必要的操作,它將告訴算術邏輯單元(ALUALU)什麼時候計算,告訴指令讀取器什麼時候獲取數值,告訴指令譯碼器什麼時候翻譯指令等等。
假如數據被送往算術邏輯單元,數據將會執行指令中規定的算術運算和其他各種運算。當數據處理完畢後,將回到寄存器中,通過不同的指令將數據繼續運行或者通過DBDB總線送到數據緩存器中。
基本上,CPUCPU就是這樣去執行讀出數據、處理數據和往內存寫數據3項基本工作。但在通常情況下,一條指令可以包含按明確順序執行的許多操作,CPUCPU的工作就是執行這些指令,完成一條指令後,CPUCPU的控制單元又將告訴指令讀取器從內存中讀取下一條指令來執行。這個過程不斷快速地重複,快速地執行一條又一條指令,產生你在顯示器上所看到的結果。我們很容易想到,在處理這麼多指令和數據的同時,由於數據轉移時差和CPUCPU處理時差,肯定會出現混亂處理的情況。爲了保證每個操作準時發生CPUCPU需要一個時鐘,時鐘控制着CPUCPU所執行的每一個動作。時鐘就像一個節拍器,它不停地發出脈衝,決定CPU的步調和處理時間,這就是我們所熟悉的CPU的標稱速度,也稱爲主頻。主頻數值越高,表明CPUCPU的工作速度越快。

架構

在這裏插入圖片描述
44CPUCPU就是擁有四個獨立的中央機構,都具備相同的工作能力和權限,但是每個核心都會負責不同的事務。4488線程就是四個獨立的中央機構,每一箇中央機構都擁有兩套完整的工作班子,每套工作班子權限也一樣。
這時候問題又出現了,例如某個中央機構負責的事特別多,忙不過來,而其他的中央機構負責的事很少,閒的發慌,那怎麼辦?這時候,我們的架構又出現了,好辦!今天你這個核心負責的事多,就你來主導,讓其他事少的核心輔助你工作。明天另外一個核心負責的事多,就由它來主導,其他核心輔助它工作。

工廠比喻

如果這麼說你理解不了,沒有關係,我們用一個例子來說明一下:假設
CPU 是一個工廠,一個核心就是工廠的一個車間

  • 運算器 就是工廠裏的普工,只負責生產(運算)
  • 寄存器 就是一個工具人,有時需要傳遞信息(數據),有時需要搬運物資(數據)。
  • 控制器則是車間主管,管理調劑所有普工和工具人,壓榨他們的勞動價值。

新的問題

但是,漸漸的,又有新問題出現,工具人雖然效率高,但是數量不多,而隨着越來越多的原材料(數據)湧入,工具人搬不過來。這時工廠就整了一個小板車(cachecache),專門用來運輸、寄存工具人搬不過來的數據,而且各工廠可以共享其中一部分(intelintelL3  cacheL3\,\,cache)。
直到有一天,工廠發現一個==車間(核心)==效率不夠,就只能增加車間(核心)來提高整個工廠效率,這就是核心。
隨着車間數量(核心數目)增加到八,工廠發現有些時候出貨量挺高的(全車間都開工),但有些時候只有一兩個個車間開工,其它車間都在圍觀(調度問題)。而且整個工廠一起開工,用電量和發熱量也急劇上升,但是各車間的效率(頻率)就是上不去,此外,還要擔心電力供給、散熱、物資(數據)運輸等各類問題。終於,在投入了大研發後,工廠的廠房佈局設計(架構)有了大改進,各部門之間的交通更便利了;並且,工廠也重新招聘短小精悍的工人(提升製程工藝),將以前那種牛高馬大,光喫不幹的大塊頭全部淘汰了。至此,同樣大的車間,能融入更多的工人幹活了,而且短小精悍的工人,喫的飯還少(功耗低)
CPUCPU處理數據的一個大單位,理論上來說,核心數越多,幹活的效率越高,或者說可以同時乾的事情越多,就像一個工廠,這個車間可以生產這個零部件,那個車間可以生產另外一個零部件。

其他概念

進程和線程

進程是操作系統進行資源(包括cpu、內存、磁盤IO等)分配的最小單位。
線程是CPUCPU調度和分配的基本單位。我們打開的聊天工具,瀏覽器都是一個進程。進程可能有多個子任務,比如聊天工具要接受消息,發送消息,這些子任務就是線程。資源分配給進程,線程共享進程資源。

線程切換

CPUCPU給線程分配時間片(也就是分配給線程的時間),執行完時間片後會切換都另一個線程。切換之前會保存線程的狀態,下次時間片再給這個線程時才能知道當前狀態。從保存線程AA的狀態再到切換到線程BB時,重新加載線程B的狀態的這個過程就叫上下文切換。而上下切換時會消耗大量的CPU時間。

線程開銷

上下文切換消耗線程創建和消亡的開銷線程需要保存維持線程本地棧,會消耗內存

串行,併發與並行

  • 串行:多個任務,執行時一個執行完再執行另一個。比喻:喫完飯再看視頻。
  • 併發:多個線程在單個核心運行,同一時間一個線程運行,系統不停切換線程,看起來像同時運行,實際上是線程不停切換。比喻:一會跑去廚房喫飯,一會跑去客廳看視頻。
  • 並行:每個線程分配給獨立的核心,線程同時運行。比喻:一邊喫飯一邊看視頻。

多核下線程數量選擇

  • 計算密集型程序:主要爲複雜的邏輯判斷和複雜的運算CPUCPU的利用率高,不用開太多的線程,開太多線程反而會因爲線程切換時切換上下文而浪費資源。
  • IOIO密集型程序:主要爲IOIO操作,比如磁盤IOIO(讀取文件)和網絡IOIO(網絡請求)。因爲IOIO操作會阻塞線程,CPUCPU利用率不高,可以開多點線程,阻塞時可以切換到其他就緒線程,提高CPUCPU利用率。

總結

提高性能的一種方式:提高硬件水平,處理速度(主頻)或核心數。另一種方式:根據實際場景,合理設置線程數(架構),軟件上提高cpu利用率。

參考資料

認識CPU的工作原理
CPU科普文:5分鐘讓你看懂CPU的結構和工作原理

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