1. 程式人生 > >認識cpu、核與線程

認識cpu、核與線程

消息 可能 磁盤 處理 模擬 水平 上下文 通知 邏輯判斷

前言:作為一個後臺開發人員,我想有必要了解這些基礎知識。如果本文有不嚴謹或者疏忽的地方,請指正。

目錄

  • 認識cpu、核心與線程
  • java多線程系列(一)之java多線程技能
  • java多線程系列(二)之對象變量的並發訪問
  • java多線程系列(三)之等待通知機制
  • java多線程系列(四)之ReentrantLock的使用

cpu與核心

物理核

  • 物理核數量=cpu數(機子上裝的cpu的數量)*每個cpu的核心數

虛擬核

  • 所謂的4核8線程,4核指的是物理核心。通過超線程技術,用一個物理核模擬兩個虛擬核,每個核兩個線程,總數為8線程。
  • 在操作系統看來是8個核,但是實際上是4個物理核。
  • 通過超線程技術可以實現單個物理核實現線程級別的並行計算,但是比不上性能兩個物理核。

單核cpu和多核cpu

  • 都是一個cpu,不同的是每個cpu上的核心數
  • 多核cpu是多個單核cpu的替代方案,多核cpu減小了體積,同時也減少了功耗
  • 一個核心只能同時執行一個線程

進程和線程

理解

  • 我們打開的微信,瀏覽器都是一個進程
  • 進程可能有多個子任務,比如微信要接受消息,發送消息,這些子任務就是線程。
  • 資源分配給進程,線程共享進程資源。

線程切換

  • cpu給線程分配時間片(也就是分配給線程的時間),執行完時間片後會切換都另一個線程。
  • 切換之前會保存線程的狀態,下次時間片再給這個線程時才能知道當前狀態。
  • 從保存線程A的狀態再到切換到線程B時,重新加載線程B的狀態的這個過程就叫上下文切換。
  • 而上下切換時會消耗大量的cpu時間。

線程開銷

  • 上下文切換消耗
  • 線程創建和消亡的開銷
  • 線程需要保存維持線程本地棧,會消耗內存

串行,並發與並行

串行

  • 多個任務,執行時一個執行完再執行另一個。
  • 比喻:吃完飯再看球賽。

並發

  • 多個線程在單個核心運行,同一時間一個線程運行,系統不停切換線程,看起來像同時運行,實際上是線程不停切換。
  • 比喻: 一會跑去食廳吃飯,一會跑去客廳看球賽。

並行

  • 每個線程分配給獨立的核心,線程同時運行。
  • 比喻:一邊吃飯一邊看球賽。

多核下線程數量選擇

計算密集型

  • 程序主要為復雜的邏輯判斷和復雜的運算。
  • cpu的利用率高,不用開太多的線程,開太多線程反而會因為線程切換時切換上下文而浪費資源。

IO密集型

  • 程序主要為IO操作,比如磁盤IO(讀取文件)和網絡IO(網絡請求)。
  • 因為IO操作會阻塞線程,cpu利用率不高,可以開多點線程,阻塞時可以切換到其他就緒線程,提高cpu利用率。

總結

  • 提高性能的一種方式:提高硬件水平,處理速度或核心數。
  • 另一種方式:根據場景,合理設置線程數,軟件上提高cpu利用率。

我覺得分享是一種精神,分享是我的樂趣所在,不是說我覺得我講得一定是對的,我講得可能很多是不對的,但是我希望我講的東西是我人生的體驗和思考,是給很多人反思,也許給你一秒鐘、半秒鐘,哪怕說一句話有點道理,引發自己內心的感觸,這就是我最大的價值。(這是我喜歡的一句話,也是我寫博客的初衷)

認識cpu、核與線程