cpu、核與執行緒
cpu與核心
物理核
- 物理核數量=cpu數(機子上裝的cpu的數量)*每個cpu的核心數
虛擬核
- 所謂的4核8執行緒,4核指的是物理核心。通過超執行緒技術,用一個物理核模擬兩個虛擬核,每個核兩個執行緒,總數為8執行緒。
- 在作業系統看來是8個核,但是實際上是4個物理核。
- 通過超執行緒技術可以實現單個物理核實現執行緒級別的平行計算,但是比不上效能兩個物理核。
單核cpu和多核cpu
- 都是一個cpu,不同的是每個cpu上的核心數
- 多核cpu是多個單核cpu的替代方案,多核cpu減小了體積,同時也減少了功耗
- 一個核心只能同時執行一個執行緒
程式和執行緒
理解
- 程式是作業系統進行資源(包括cpu、記憶體、磁碟IO等)分配的最小單位
- 執行緒是cpu排程和分配的基本單位
- 我們開啟的微信,瀏覽器都是一個程式
- 程式可能有多個子任務,比如微信要接受訊息,傳送訊息,這些子任務就是執行緒。
- 資源分配給程式,執行緒共享程式資源。
對比
對比 | 程式 | 執行緒 |
---|---|---|
定義 | 程式是程式執行的一個實體的執行過程,是系統進行資源分配和調配的一個獨立單位 | 執行緒是程式執行和執行的最小排程單位 |
系統開銷 | 建立撤銷切換開銷大,資源要重新分配和收回 | 僅儲存少量暫存器的內容,開銷小,在程式的地址空間執行程式碼 |
擁有資產 | 資源擁有的基本單位 | 基本上不佔資源,僅有不可少的資源(程式計數器,一組暫存器和棧) |
排程 | 資源分配的基本單位 | 獨立排程分配的單位 |
安全性 | 程式間相互獨立,互不影響 | 執行緒共享一個程式下面的資源,可以互相通訊和影響 |
地址空間 | 系統賦予的獨立的記憶體地址空間 | 由相關堆疊暫存器和和執行緒控制表TCB組成,暫存器可被用來儲存執行緒內的區域性變數 |
執行緒切換
- cpu給執行緒分配時間片(也就是分配給執行緒的時間),執行完時間片後會切換都另一個執行緒。
- 切換之前會儲存執行緒的狀態,下次時間片再給這個執行緒時才能知道當前狀態。
- 從儲存執行緒A的狀態再到切換到執行緒B時,重新載入執行緒B的狀態的這個過程就叫上下文切換。
- 而上下切換時會消耗大量的cpu時間。
執行緒開銷
- 上下文切換消耗
- 執行緒建立和消亡的開銷
- 執行緒需要儲存維持執行緒本地棧,會消耗記憶體
序列,併發與並行
序列
- 多個任務,執行時一個執行完再執行另一個。
- 比喻:吃完飯再看球賽。
併發
- 多個執行緒在單個核心執行,同一時間一個執行緒執行,系統不停切換執行緒,看起來像同時執行,實際上是執行緒不停切換。
- 比喻: 一會跑去食廳吃飯,一會跑去客廳看球賽。
並行
- 每個執行緒分配給獨立的核心,執行緒同時執行。
- 比喻:一邊吃飯一邊看球賽。
多核下執行緒數量選擇
計算密集型
- 程式主要為複雜的邏輯判斷和複雜的運算。
- cpu的利用率高,不用開太多的執行緒,開太多執行緒反而會因為執行緒切換時切換上下文而浪費資源。
IO密集型
- 程式主要為IO操作,比如磁碟IO(讀取檔案)和網路IO(網路請求)。
- 因為IO操作會阻塞執行緒,cpu利用率不高,可以開多點執行緒,阻塞時可以切換到其他就緒執行緒,提高cpu利用率。
總結
- 提高效能的一種方式:提高硬體水平,處理速度或核心數。
- 另一種方式:根據場景,合理設定執行緒數,軟體上提高cpu利用率。
我覺得分享是一種精神,分享是我的樂趣所在,不是說我覺得我講得一定是對的,我講得可能很多是不對的,但是我希望我講的東西是我人生的體驗和思考,是給很多人反思,也許給你一秒鐘、半秒鐘,哪怕說一句話有點道理,引發自己內心的感觸,這就是我最大的價值。(這是我喜歡的一句話,也是我寫部落格的初衷)
作者:jiajun 出處: http://www.cnblogs.com/-new/
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。如果覺得還有幫助的話,可以點一下右下角的【推薦】,希望能夠持續的為大家帶來好的技術文章!想跟我一起進步麼?那就【關注】我吧。
相關文章
- 4核8執行緒和6核6執行緒的CPU哪個好?電腦CPU核數多和執行緒多的區別執行緒
- 1、多執行緒同步——CPU、core核、執行緒、記憶體執行緒記憶體
- 對多執行緒程式,單核cpu與多核cpu如何工作相關的探討執行緒單核
- 根據CPU核數合理設定執行緒池大小執行緒
- 如何檢視CPU核數和執行緒數?CPU的核心數、執行緒數的關係和區別執行緒
- 聊聊CPU的發展歷程之單核、多核、超執行緒單核執行緒
- 檢視伺服器CPU的個數、CPU的核數、多核超執行緒數伺服器執行緒
- JAVA CPU100%與執行緒死鎖定位Java執行緒
- 執行緒與多執行緒執行緒
- 多執行緒------執行緒與程式/執行緒排程/建立執行緒執行緒
- 執行緒、執行緒與程式、ULT與KLT執行緒
- 什麼?一個核同時執行兩個執行緒?執行緒
- Java執行緒的CPU時間片Java執行緒
- 【多執行緒總結(二)-執行緒安全與執行緒同步】執行緒
- Android程式框架:執行緒與執行緒池Android框架執行緒
- linux下把程式繫結到特定cpu核上執行Linux
- 一步步瞭解執行緒池之單核執行緒池-SingleThreadPool執行緒單核thread
- JVM找出佔用CPU最高的執行緒JVM執行緒
- Java多執行緒學習(3)執行緒同步與執行緒通訊Java執行緒
- Java與執行緒Java執行緒
- 程序與執行緒執行緒
- 執行緒與程序執行緒
- 執行緒與程式執行緒
- 程式與執行緒執行緒
- Python 多執行緒無用?深入總結 二(深入瞭解GIL 執行緒守護 執行緒程式CPU關係)Python執行緒
- 圖解併發與並行-分別從CPU和執行緒的角度理解圖解並行執行緒
- Java執行緒(一):執行緒安全與不安全Java執行緒
- 併發與多執行緒之執行緒安全篇執行緒
- 深入理解JVM(③)執行緒與Java的執行緒JVM執行緒Java
- 多執行緒與高併發(二)執行緒安全執行緒
- 為什麼說執行緒太多,cpu切換執行緒會浪費很多時間?執行緒
- 執行緒繫結cpu核心的程式碼研究執行緒
- Java多執行緒學習(1)建立執行緒與執行緒的生命週期Java執行緒
- 【多執行緒與高併發】- 執行緒基礎與狀態執行緒
- Systrace 執行緒 CPU 執行狀態分析技巧 - Sleep 和 Uninterruptible Sleep 篇執行緒
- GIL與多執行緒執行緒
- 執行緒與執行緒池的那些事之執行緒池篇(萬字長文)執行緒
- Java併發實戰一:執行緒與執行緒安全Java執行緒