原文地址: 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)
但是后來Intel意識到 在一台多處理器的機器上不同處理器之間的通信非常的低效,因為這樣的通信必須經過系統總線(the system bus),而系統總線通常速度都很慢。這樣就常常會造成性能瓶頸,無法充分利用每一個CPU提供的計算能力。
為了應對上面提到的問題,發明了超線程技術(HyperThreading), 超線程的原理是在同一個cpu芯片內部有些內部組件會存在多份,比如 寄存器或者一級緩存,這樣同一個cpu就可以用來執行多個線程或者進程,並且它們之間的通信是在cpu內部,不會造成因為要經由系統總線通信而造成的性能瓶頸。如果一個進程因為等待一個中斷而阻塞,那另一個進程就可以繼續使用這個cpu來計算(注: 所以實際上超線程並不能真正意義上實現並行)。
這種方式的確可能加速多個計算進程,並提供比傳統的處理器更為強大的整體性能。某種程度上來說,此時的操作系統是被欺騙了的,因為超線程實際上僅僅提供了兩個虛擬或者邏輯CPU(LCPU)就讓操作系統可以"同時"執行兩個進程了(注:注意 同時 加了引號)。需要重點指出的是: 使用超線程技術的處理器 是無法提供一個傳統處理器兩倍的計算能力的,也不能夠實現真正意義上的並行計算。(注: 這就是前面 同時 加了引號的原因)
因此,從Linux或者其他操作系統的角度來看:一個單核處理器卻展現出擁有兩個處理器的能力。 只不過這兩個邏輯cpu運行在同一個物理cpu內部而已。
下面這張圖說明了 超線程的實現原理:
進一步改進:多核架構的出現(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的說法: