聊聊CPU的發展歷程之單核、多核、超線程

来源:https://www.cnblogs.com/xiaoniuhululu/archive/2022/12/15/16984795.html
-Advertisement-
Play Games

作者:小牛呼嚕嚕 | 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的架構圖:

  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源碼、職業成長、項目實戰、面試相關資料等更多精彩文章在公眾號「小牛呼嚕嚕


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 底層數據結構:動態開闢的數組,每次以原始空間2倍擴容 vector vec; 增加 vec.push_back(100);容器末尾加元素 時間負責度O(1) 可能導致容器擴容 容器中的,對象的構造析構,記憶體的開闢釋放,通過什麼來實現? 容器的空間配置器allocator allocate deall ...
  • 1、什麼是進程、線程、併發、並行 一、進程線程 1、進程 程式由指令和數據組成,但這些指令要運行,數據要讀寫,就必須將指令載入至CPU,數據載入至記憶體。在指令運行過程中還需要用到磁碟、網路等設備。進程就是用來載入指令、管理記憶體、管理IO的當一個程式被運行,從磁碟載入這個程式的代碼至記憶體,這時就開啟了 ...
  • 前言 本文給大家分享的是如何通過利用Python製作藝術簽名生成器,廢話不多直接開整~ 開發工具 Python版本: 3.6 相關模塊: requests模塊 PIL模塊 PyQt5模塊 環境搭建 安裝Python並添加到環境變數,pip安裝需要的相關模塊即可。 文中實戰教程,評論留言獲取。 思路分 ...
  • unique_lock condition_variable 1:lock_guard 和 unique_lock 2:condition_variable wait 和 notify_all 方式1 std::mutex mtx; mtx.lock(); .. ... mtx.unlock();/ ...
  • 2022.12.12 記錄問題方便以後查看。 一、準備工作 1、本次使用jar包啟動後端,故而準備打包後的jar文件。註意修改配置文件中的路徑,根據需要部署的操作系統進行更改。 2、提前寫bat文件用來啟動jar包。 @echo off start "cmd標題名" java -Dfile.enco ...
  • "I don’t care if it works on your machine! We are not shipping your machine!" - Vidiu Platon “我才不管它能不能在你的機器上運行捏!我們又不會給你提供機器!” —— 韋都·柏拉圖 0x00 大綱 0x01 前 ...
  • 概述 為什麼要用到深拷貝呢?比如我們建了某個類Person,並且實例化出一個對象,然後,突然需要把這個對象複製一遍,並且複製出來的對象要跟之前的一模一樣,來看下我們一般會怎麼做。 方法一(利用反射實現) public static T DeepCopy<T>(T obj) { //如果是字元串或值類 ...
  • 個人名片: 對人間的熱愛與歌頌,可抵歲月冗長:sun_with_face: Github👨🏻‍💻:念舒_C.ying CSDN主頁✏️:念舒_C.ying 個人博客:earth_asia: :念舒_C.ying 1 配置環境 掛載系統ISO,並配置好本地dnf源。(前面的文章講過,這裡就略過. ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...