physical CPU vs logical CPU vs Core vs Thread vs Socket

轉載自:https://www.cnblogs.com/zh1164/p/9883852.html
翻譯自: http://www.daniloaz.com/en/differences-between-physical-cpu-vs-logical-cpu-vs-core-vs-thread-vs-socket/

😊😁😉😜
當我們使用像 nproc或者 lscpu等命令 來在CPU級別上獲取計算機的架構和性能的時候,我們常常會發現我們不能夠正確的解釋這些命令的結果,原因在於我們搞不清楚一些術語的含義,例如: 物理CPU (physical CPU)、 邏輯CPU(logical CPU)、虛擬CPU(virtual CPU)、核數(core)、線程數(thread)、顆數(socket)等。如果再加上 超線程(不要與多線程搞混了)的概念,我們就完全搞不清楚我們的機器是多少核(Core)的了,比如說,我們明明購買的是一個配置爲 4核處理器的機器,使用htop命令的結果卻顯示我們有8個cpu。總而言之,真是一團亂麻 o(╯□╰)o。

爲了闡述清楚這些問題,我將使用一組簡單的圖表,希望能夠讓你容易地明白上面這些概念,從此不再困惑。

起步:單核CPU ( single core CPUs )和超線程(HyperThreading)

讓我們回到奔騰(Pentium)處理器的年代,那時候諸如 多核(multi-core)、虛擬CPU(virtual CPU)、邏輯CPU(virtual CPU)的概念還不存在,絕大多數的計算機在它們的主板上僅僅安裝 單獨的一塊大容量芯片,我們稱之爲 微處理器、處理器或者 簡單的CPU(microprocessor, processor or simply CPU)。只有少數的一些企業級計算機或者是大型的服務器因爲對更大處理性能的需要纔會在同一塊主板上存在兩塊或更多的CPU芯片:我們把這樣的機器稱作是多處理器系統(multiprocessor systems)。這些芯片與主板上的其他組件通過一個連接器(connector)或者 插槽(socket)通信。 這樣的話計算cpu的個數就很簡單了: 主板上存在多少個這樣的連接器(connector)或 插槽(socket),那麼這臺計算機就有多少個cpu。如果希望獲得更強大的處理性能,一是在主板上安裝更多的cpu,二是提高每一個cpu自身的處理能力。

但是後來Intel意識到 在一臺多處理器的機器上不同處理器之間的通信非常的低效,因爲這樣的通信必須經過系統總線(the system bus),而系統總線通常速度都很慢。這樣就常常會造成性能瓶頸,無法充分利用每一個CPU提供的計算能力。

爲了應對上面提到的問題,發明了超線程技術(HyperThreading), 超線程的原理是在同一個cpu芯片內部有些內部組件會存在多份,比如 寄存器或者一級緩存,這樣同一個cpu就可以用來執行多個線程或者進程,並且它們之間的通信是在cpu內部,不會造成因爲要經由系統總線通信而造成的性能瓶頸。如果一個進程因爲等待一箇中斷而阻塞,那另一個進程就可以繼續使用這個cpu來計算(注: 所以實際上超線程並不能真正意義上實現並行)。

這種方式的確可能加速多個計算進程,並提供比傳統的處理器更爲強大的整體性能。某種程度上來說,此時的操作系統是被欺騙了的,因爲超線程實際上僅僅提供了兩個虛擬或者邏輯CPU(LCPU)就讓操作系統可以"同時"執行兩個進程了(注:注意 同時 加了引號)。需要重點指出的是: 使用超線程技術的處理器 是無法提供一個傳統處理器兩倍的計算能力的,也不能夠實現真正意義上的並行計算。(注: 這就是前面 同時 加了引號的原因)

因此,從Linux或者其他操作系統的角度來看:一個單核處理器卻展現出擁有兩個處理器的能力。 只不過這兩個邏輯cpu運行在同一個物理cpu內部而已。

下面這張圖說明了 超線程的實現原理:
在這裏插入圖片描述

注: 說一些對這張圖的理解,在一個物理cpu內部,存在兩組 寄存器,分別屬於一個 邏輯CPU,但是隻存在一組ALU(算數邏輯單元),如果每一個邏輯cpu上運行一個進程,那麼這兩個進程間的通信就完全在CPU內部,無需通過系統總線,但是從唯一的ALU上我們也能看出來,實際上是無法真正意義上同時執行兩個進程的。

進一步改進:多核架構的出現(multi-core architectures)

就像前面說的那樣,儘管超線程技術提供了更強的處理性能,但是終究無法像兩個獨立的物理處理器那樣。所以進一步的改進是 將所有處理器組件做的更小,實現在同一個芯片上可以同時存在多個處理器。在同一個芯片上的每一個處理器我們稱之爲 核(Core),同一個芯片上的多個核也無需通過慢速的系統總線通信,因爲在這個芯片內部存在內部總線。

注: 我們常說的幾顆幾核的含義: Core(核) 代表一個獨立的Cpu, Socket(顆) 本意是插槽,代表一個主板上的芯片,多核架構就是在一個芯片上放多個處理器,就像上面說的那樣, 所以如果我們說 2顆4核,代表主板上有2個芯片插槽,每個芯片上存在4個cpu,所以我們有8個物理cpu,如果存在超線程,我們還可能多出8個邏輯cpu,總共16個邏輯cpu。

下面這張圖展示了一個 四核CPU,並且使用了超線程技術,我們可以看到這四個核都存在於同一個芯片上(CPU chip),它們通過內部的BUS INTERFACE通信。
在這裏插入圖片描述

與超線程技術不同,現在我們完全擁有了成倍的處理能力。而且從性能上來說, 一個一顆四核的處理器要更優於四個一顆一核(也就是傳統的單核CPU)的處理器。

在操作系統層面上來看,一個物理的四核處理器將被看做四個獨立的處理器。如果提供了超線程,那麼可能會再多出4個邏輯處理器(LCPU),這樣的話我們通過命令行查看的話就會顯示出有8個cpu,但是就像我們前面已經指出的那樣,因爲超線程才擁有的這8個cpu肯定比不上 一個沒有超線程的物理的8核處理器。

1 LCPU = 1 thread

有時候我們會發現處理器標稱每核有4線程,2線程或類似的說法,簡單來說這就是指每核cpu上能夠“同時”運行的線程或進程數(注意同時依舊加了引號),基本上就是一個邏輯cpu(LCPU)能運行一個進程或線程。如果每核能執行2個或更多的線程,那麼一定使用了超線程技術,否則每一核就只能運行一個線程或進程。

Logical CPU vs Virtual CPU

虛擬CPU基本等同於邏輯CPU,但是存在一點不同:虛擬CPU更多的是限定在 計算虛機化的語境內。虛擬CPU映射到 虛擬化底層的宿主機硬件資源,通常來說,一個宿主機上的邏輯cpu就映射爲一個虛擬機內部的虛擬CPU,所以他們基本上是同一個術語。

最後附上我的一臺環境的cpu信息,這是一個運行虛擬機的宿主機,我們看到它有40個邏輯cpu, 我在虛擬化管理臺上給一個虛擬機分配40個cpu的時候會報錯,39個就能成功創建,某種程度上證明了上面關於虛擬cpu的說法:
在這裏插入圖片描述

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