聊聊CPU的發展歷程之單核、多核、超執行緒

小牛呼嚕嚕發表於2022-12-15

作者:小牛呼嚕嚕 | https://xiaoniuhululu.com
計算機內功、JAVA底層、面試、職業成長相關資料等更多精彩文章在公眾號「小牛呼嚕嚕

大家好,我是呼嚕嚕,在計算機的早期,Intel奔騰處理器時代,他們的主機板上的單個處理器CPU是相當大的。為了提升計算機的整體運算處理能力,一般是在主機板上安裝更多這樣的處理器,這樣就可以輕鬆突破電晶體限制。

物理CPU

物理CPU,是硬體上的CPU, 也是主機板上CPU的插槽個數,是計算機上實際配置的CPU個數

我們在linux下可以透過指令 cat /proc/cpuinfo | grep 'physical id'| sort| uniq |wc -l 來檢視我們計算機的物理CPU個數

在windows下,我們可以在cmd命令中輸入systeminfo,檢視CPU個數

物理CPU透過聯結器或插槽與其他主機板元件通訊,透過系統匯流排完成與系統的不同處理器之間的通訊,但是系統匯流排的傳輸速度比起CPU的速度來說,是非常慢的通常導致出現瓶頸,使得無法充分利用每個CPU提供的計算能力。
所以工程師想 能不能讓處理器中的核心元件小型化,並將它們封裝在單個晶片中,這些就是物理核心,可以看作是計算單元

CPU核數

CPU核數,物理上真實的cpu核,有獨立的電路元件以及L1,L2快取,可以獨立地執行指令。 通常每個CPU下的核數都是固定的,如果我們的計算機有兩個物理CPU,每個CPU是雙核的,那麼計算機總共就是四核的

在linux下,我們可以透過指令cat /proc/cpuinfo | grep "cpu cores" | wc -l來統計CPU核數。

在windows下,可以透過工作管理員檢視:

我們分別看下,單核CPU和多核CPU的架構圖:

  1. 多個物理CPU,CPU透過系統匯流排進行通訊,效率比較低。
  2. 多核CPU,不同的核透過L3 cache和片內匯流排進行通訊,主存和外設透過匯流排與CPU通訊

為了彌補 CPU 與記憶體兩者之間的效能差異,就在 CPU 內部引入了 CPU Cache,也稱快取記憶體
CPU Cache用的是 SRAM(Static Random-Access Memory)的晶片,也叫靜態隨機儲存器。其只要有電,資料就可以保持存在,而一旦斷電,資料就會丟失。

CPU Cache 通常分為大小不等的三級快取,分別是 L1 CacheL2 CacheL3 Cache

部件 CPU訪問所需時間 備註
L1 快取記憶體 2~4 個時鐘週期 每個 CPU 核心都有一塊屬於自己的 L1 快取記憶體,L1 快取記憶體通常分成指令快取資料快取
L2 快取記憶體 10~20 個時鐘週期 L2 快取記憶體同樣是每個 CPU 核心都有的
L3 快取記憶體 20~60個時鐘週期 L3 快取記憶體是多個 CPU 核心共用

我們可以發現越靠近 CPU 核心的快取其訪問速度越快,容量也越來越小快取讀取資料過程。就像資料庫快取一樣,首先在最快的快取中找資料,如果快取沒有命中(Cache miss) 則往下一級找, 直到三級快取都找不到時,最後會去記憶體找資料。

邏輯CPU

在歷史上,為了提升CPU的效能,引入超標量、亂序執行、大量的暫存器及暫存器重新命名、多指令解碼器、預測執行、快取記憶體等特性,這些特性從而讓CPU擁有大量資源,並且CPU還能智慧的預測執行指令。這就導致實際上CPU在大多數時間上,其資源是被閒置的,浪費是可恥的,為了進一步壓榨CPU的效能,工程師發現,完全可以透過複製一些CPU內部元件,例如暫存器或一級快取,來執行第二個執行緒,讓這些閒置資源執行在另一個執行緒上。雖然只有一個物理CPU,但作業系統被提供了兩個"邏輯CPU" ,而不是單個CPU,這樣就成功使得作業系統被"欺騙"了。

邏輯CPU是什麼?

作業系統可以使用邏輯CPU來模擬出真實CPU的效果。在從前沒有多核處理器的時候,一個物理CPU只有一個物理核心,而現在有了多核技術,讓物理核透過高速運算,讓應用程式以為有兩個CPU在運算,這樣就可以把一個物理CPU當作多個"CPU"使用,即邏輯CPU

一般情況下,邏輯CPU=物理CPU個數*每顆核數,如果我們的電腦CPU支援超執行緒技術且開啟的話,邏輯CPU的個數是核數的2倍邏輯CPU=物理CPU個數*每顆核數*2,超執行緒技術可以使得 處理器中的1 顆核心在作業系統中,如同2 顆核心那樣發揮作用。

CPU的執行緒數?

還有一個我們需要知道:邏輯處理器個數 = CPU的執行緒數,也就是說有多少個邏輯處理器,就可以開多少個執行緒。對於一個CPU,執行緒數總是大於或等於核心數的。一個核心最少對應一個執行緒,但透過超執行緒技術,一個核心可以對應兩個執行緒,也就是說它可以同時執行兩個執行緒。

一般來說,物理CPU個數×每顆核數應該等於邏輯CPU的個數,如果不相等的話,則表示windows電腦的CPU支援超執行緒技術

超執行緒技術

CPU的執行緒數概念僅僅只針對Intel的CPU , 對於AMD的CPU來說,只有核心數的概念,沒有執行緒數的概念。因為其是透過Intel超執行緒技術來實現的,Intel早在2002年推出的Northwood奔騰4 HT處理器就把這一技術帶入到消費級市場。

超執行緒技術(SMT),就是可以把一個物理執行緒模擬出兩個執行緒來使用,使得單個核心用起來像兩個核一樣,以充分發揮CPU的效能。

我們需要先了解一下,執行緒和程式的概念

  1. 程式:

程式可以看作是程式的一次執行過程。一個程式的執行需要CPU時間、記憶體空間、檔案以及I/O等資源。作業系統就是以程式為單位來分配這些資源的,所以說程式是作業系統中資源分配的基本單位程式之間的資源是獨立隔離的,能很好的進行資源管理和保護。
程式也是一個動態的過程:有它自身的產生,存在和消亡的過程

  1. 執行緒:

執行緒是程式中的一個執行任務(控制單元),負責當前程式中程式的執行。一個程式可以包含多個執行緒,至少包含一個執行緒,與程式不同的是多個執行緒之間資源資料是共享的。所以系統在產生一個執行緒,或是在各個執行緒之間作切換工作時,負擔要比程式小得多,也正因為如此,執行緒也被稱為輕量級程式。為了提高系統的執行效率,減少處理器的空轉時間和排程切換的時間,執行緒取代了程式排程資源的基本功能,所以執行緒是資源排程的基本單位

CPU之所以要增加執行緒數,是源於多工處理的需要。執行緒數越多,越有利於同時執行多個程式,因為執行緒數等同於在某個瞬間CPU能同時並行處理的任務數。

超執行緒的原理其實是:由於CPU和暫存器,快取,主存、硬碟的讀取速度的差異不是一個數量級的,CPU非常快

比如主頻為3.0GHZ的CPU,一個時鐘週期大約是0.3納秒,記憶體訪問大約需要120納秒,固態硬碟訪問大約需要50-150微秒,機械硬碟訪問大約需要1-10毫秒,最後網路訪問最慢,得幾十毫秒左右。
如果我們把一個時鐘週期如果按1秒算的話,記憶體訪問大約就是6分鐘 ,固態硬碟大約是2-6天 ,傳統硬碟大約是1-12個月,網路訪問就得幾年了

這就給了我們超執行緒技術,將CPU內部暫時閒置處理資源充分“調動”起來,使得CPU中看起來同時有2個邏輯核,在同時工作的可能性。

我們知道CPU是採用指令流水線的方式來執行任務,在一個邏輯核等待指令執行的間隔(等待從cache或記憶體中獲取下一條指令),把時間片分配到另一個邏輯核。物理CPU高速地在這兩個邏輯核之間切換,讓作業系統感知不到這個間隔,實現了“同時執行多個任務”

像奔騰4 HT處理器多加入了一個邏輯處理單元,這讓CPU可以同時執行多個程式而共享一顆CPU內的資源,如:ALU、FPU、 快取等,當兩個執行緒都同時需要某一個資源時,其中一個要暫時停止,並讓出資源,直到這些資源閒置後才能繼續,所以單個物理CPU開啟超執行緒的效能並不能等於兩顆CPU的處理能力

超執行緒技術只增加了5%的晶片面積,就可換來15%~30%的效能提升,而後來的Nehalem架構帶來了全新的超執行緒技術,得益於指令集分制預測技術與較短的流水線,它擁有比奔騰4好得多的效能,再加上整合了記憶體控制器讓其擁有更大的記憶體頻寬,還有更大的快取,這樣就更能夠有效的發揮超執行緒的作用,Nehalem的超執行緒可以在增加很少能耗的情況下,讓效能提升20-30%,後續每一代雖然都有一些小修改,不過基本上都是Nehalem架構的延續。

雖然超執行緒能讓計算機核數增加,但實際上計算機的核數翻倍並不能簡單地認為著計算機的效能也翻倍了,計算機的效能還受CPU主頻、機器字長、指令字長、儲存字長、主存、I/O速度、硬碟速度等因素影響,也不意味著核數越多計算機效能會越來越好,因為超執行緒只是充分利用了CPU的空閒資源,提升了CPU利用率

如何檢視邏輯CPU數

我們再舉個例子來理解一下邏輯CPU的概念:假設計算機有一個物理CPU,是2核的,支援超執行緒。那麼這臺計算機就是2核4執行緒的(4執行緒中執行緒數量也對應著邏輯CPU的數量)。 所以兩路(兩路指的是有兩個物理CPU)四核超執行緒就有2*4*2=16個邏輯CPU。有人也把它稱之為16核,實際上在linux的/proc/cpuinfo中檢視只有8核。

  1. 在linux的cpuinfo中邏輯CPU數就是processor的數量。我們可以使用指令

cat /proc/cpuinfo | grep "processor" | wc -l來檢視邏輯CPU數。

  1. 在windows工作管理員中 邏輯處理器的數量,就是邏輯CPU數。

呼嚕嚕的2臺電腦比較垃圾,沒法把開超執行緒的圖貼給大家看看,大家可以自己去試試

小結

  1. 一個物理CPU可以有1個或者多個物理核心
  2. 一個物理核心可以有1個或者2個邏輯CPU

參考:

《深入理解計算機系統》

https://www.expreview.com/56674.html


本篇文章到這裡就結束啦,很感謝你能看到最後,如果覺得文章對你有幫助,別忘記關注我!更多精彩的文章

計算機內功、JAVA原始碼、職業成長、專案實戰、面試相關資料等更多精彩文章在公眾號「小牛呼嚕嚕

相關文章