前言:做爲一個後臺開發人員,我想有必要了解這些基礎知識。若是本文有不嚴謹或者疏忽的地方,請指正。html
目錄
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/
本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然保留追究法律責任的權利。若是以爲還有幫助的話,能夠點一下右下角的【推薦】,但願可以持續的爲你們帶來好的技術文章!想跟我一塊兒進步麼?那就【關注】我吧。java