作者:小牛呼嚕嚕 | https://xiaoniuhululu.com 電腦內功、JAVA底層、面試、職業成長相關資料等更多精彩文章在公眾號「小牛呼嚕嚕」 大家好,我是呼嚕嚕,在電腦的早期,Intel奔騰處理器時代,他們的主板上的單個處理器CPU是相當大的。為了提升電腦的整體運算處理能力,一 ...
作者:小牛呼嚕嚕 | 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的架構圖:
- 多個物理CPU,CPU通過
系統匯流排
進行通信,效率比較低。 - 多核CPU,不同的核通過
L3 cache和片內匯流排
進行通信,主存和外設通過匯流排與CPU通信
為了彌補 CPU 與記憶體兩者之間的性能差異,就在 CPU 內部引入了 CPU Cache
,也稱高速緩存
。
CPU Cache
用的是 SRAM(Static Random-Access Memory)的晶元,也叫靜態隨機存儲器。其只要有電,數據就可以保持存在,而一旦斷電,數據就會丟失。
CPU Cache
通常分為大小不等的三級緩存,分別是 L1 Cache、L2 Cache 和 L3 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的性能。
我們需要先瞭解一下,線程和進程的概念
- 進程:
進程可以看作是程式的一次執行過程。一個程式的運行需要CPU時間、記憶體空間、文件以及I/O等資源。操作系統就是以進程為單位來分配這些資源的,所以說
進程是操作系統中資源分配的基本單位
。進程之間的資源是獨立隔離的,能很好的進行資源管理和保護。
進程也是一個動態的過程:有它自身的產生,存在和消亡的過程
- 線程:
線程是進程中的一個執行任務(控制單元),負責當前進程中程式的執行。一個進程可以包含多個線程,至少包含一個線程,與進程不同的是多個線程之間資源數據是共用的。所以系統在產生一個線程,或是在各個線程之間作切換工作時,負擔要比進程小得多,也正因為如此,線程也被稱為輕量級進程。為了提高系統的執行效率,減少處理器的空轉時間和調度切換的時間,線程取代了進程調度資源的基本功能,所以
線程是資源調度的基本單位
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核。
- 在linux的cpuinfo中邏輯CPU數就是
processor
的數量。我們可以使用指令
cat /proc/cpuinfo | grep "processor" | wc -l
來查看邏輯CPU數。
- 在windows任務管理器中 邏輯處理器的數量,就是邏輯CPU數。
呼嚕嚕的2臺電腦比較垃圾,沒法把開超線程的圖貼給大家看看,大家可以自己去試試
小結
- 一個物理CPU可以有1個或者多個物理內核
- 一個物理內核可以有1個或者2個邏輯CPU
參考:
《深入理解電腦系統》
https://www.expreview.com/56674.html
本篇文章到這裡就結束啦,很感謝你能看到最後,如果覺得文章對你有幫助,別忘記關註我!更多精彩的文章
電腦內功、JAVA源碼、職業成長、項目實戰、面試相關資料等更多精彩文章在公眾號「小牛呼嚕嚕」