物理 CPU vs 邏輯 CPU vs 核心 vs 線程 vs Socket

當我們試著通過 Linux 命令 nproc 和 lscpu 瞭解一臺計算機 CPU 級的架構和性能時,我們總會發現無法正確地理解相應的結果,因為我們會被好幾個術語搞混淆:物理 CPU、邏輯 CPU、虛擬 CPU、核心、線程和 Socket 等等。如果我們又增加了超線程(不同於多線程),我們就會開始不知道計算機裡面到底有多少核心,我們搞不明白為什麼像 htop 這樣的命令會在我們認為買的是一臺單核計算機上返回擁有 8 個 CPU 的結果。這樣的情況一片混亂。


物理 CPU vs 邏輯 CPU vs 核心 vs 線程 vs Socket


起源:單核CPU和超線程

在諸如多核、虛擬 CPU 和邏輯 CPU 這樣的概念誕生前,在奔騰系列處理器的年代,大部分計算機在它們的主板上裝備了一塊不大不小的芯片,我們把它叫做微處理器、處理器或直接叫 CPU。只有很少數需要更強處理能力的企業能夠負擔得起同一塊主板上安裝 2 塊以上的處理器的費用:這些就是多處理器系統。這些處理器與主板上其它元件的通信通過一個連接器或 Socket 來完成。那我們很容易能計算得到一塊主板上有多少連接器或 Socket,那麼這塊主板上最多就能有相同數量的 CPU。如果你需要更多的計算能力,你只需要尋找一塊能夠支持更多處理器的主板即可。

但是後來 Intel 意識到多處理器系統裡,處理器之間通過系統總線進行通信是非常低效的,因為總線傳輸速度較慢。這樣就會經常發生的性能瓶頸,無法最大化利用 CPU 的計算能力。


物理 CPU vs 邏輯 CPU vs 核心 vs 線程 vs Socket


為了改善這個處境於是誕生了超線程技術。超線程的大意是複製一些 CPU 單元到同一塊芯片上,比如寄存器或者一級緩存,這樣可以在兩個執行線程裡共享這些數據,而無需經由系統總線和避免因為訪問速度導致的性能下降問題。超線程還帶來另外一個好處是可以當一個進程在等待中斷的時候,另一進程仍然可以使用同一個 CPU 進行執行而且無需停止。

這種方式可以加速多個被處理的進程,比傳統的單個核心(未開啟超線程)提供更高的整體性能。操作系統有點像被欺騙的意思,因為它被提供了兩個虛擬 CPU或者邏輯 CPU 並且可以“同時”執行兩個進程。但是要非常注意的是,它並不能帶來兩倍的處理能力,也不提供完全並行計算能力。

這樣, 從 Linux 或者其他操作系統的視角來看,一個單核 CPU 計算機通過超線程技術呈現出雙核 CPU 的效果,但兩個邏輯 CPU 實際上在同一個物理 CPU 中執行。

又一點複雜:多核架構的出現

正如我在前面部分所說的,儘管開啟了超線程的 CPU 能夠提供更強的計算能力,但並不能提供 2 倍的處理能力和 2 個獨立的 CPU,所以我打算進一步縮小 CPU 元件的視角,並且把它們都安裝到統一塊芯片上。如此一來每個被壓縮的處理器都叫做核心,並且允許使用同一塊硅晶的內部共享總線進行更快的通信。從那一刻開始再也不需要較慢的系統總線了。


物理 CPU vs 邏輯 CPU vs 核心 vs 線程 vs Socket


不同於超線程技術,我們現在擁有多個完全獨立的 CPU 服務於任何任務,每個任務可以分配一個核心。確實,從性能的角度來看,擁有單個多核芯片要比同一個主板上擁有多個單核芯片提供更好的性能。當然,擁有一個雙數核心要比單數核心更好。

在操作系統層,一個物理的四核處理器可以看做是四個 CPU。但這些可能是四個邏輯 CPU 或者非物理的 LCPU。如果處理器還提供了超線程支持,那麼像htop 和 nproc 的命令會看到系統裡有八個 CPU,但是可能在一個八核 CPU上看到少於八核的結果。

1LCPU = 1線程

最後我們通常發現支持四線程的處理器,每個核心兩個線程這樣,這僅僅表示同時可以執行任務的線程,並且與一個 LCPU 能夠提供的處理能力等價。如果一個處理器每個核心能夠支持兩個線程說明它啟用了超線程,否則正常來說線程數與核心數一致。


物理 CPU vs 邏輯 CPU vs 核心 vs 線程 vs Socket


邏輯CPU vs 虛擬CPU

虛擬 CPU 這個術語通常會被與邏輯 CPU 進行比較,但是有一點細微的差別:虛擬CPU 更加被侷限在計算虛擬化的領域裡,它表示那些與從底層硬件(可以是物理CPU 也可以是邏輯 CPU、開啟超線程與否)映射到虛擬機的處理器。一般情況下,宿主機上一個邏輯 CPU 映射到虛擬機裡的一個虛擬 CPU,所以它們可以看做是相同含義的術語。


分享到:


相關文章: