cpu和多線程設計

cpu即中央處理器,但僅僅知道這個是遠遠不夠的,瞭解cpu的原理才能夠更加有助於多線程的設計。

什麼是cpu

cpu內部由很多寄存器組成,大致可以分爲運算器控制器
運算器顧名思義,就是對寄存器中的數據做基本的算術和邏輯運算,先將數據從內存加載到相應寄存器中,如數據緩衝寄存器(DR),再經過算術邏輯單元(ALU) 的運算,再存入相應的寄存器中,如累計寄存器(AC),之後可能會再次寫入內存當中。
控制器就是控制cpu正常運行的,cpu從內存(RAM)中加載指令(是CPU進行操作的基本單元,大致包含操作對象、操作對象的地址、對操作對象進行何種操作,比如執行a+b這種操作的指令)到數據緩衝寄存器(DR)中,再寫入到指令寄存器(IR),指令譯碼器(ID)對指令進行解析,程序計數器(PC)中保存着下一條需要執行的指令,告訴cpu下一步如何操作。
在這裏插入圖片描述

CPU其實主要就是幹如下的四件事情:
從內存中讀取數據,然後放到寄存器中
把寄存器中的數據寫入到內存
進行數學運算和邏輯運算(加減乘除,AND,OR)
依據相應的條件進行跳轉,執行其他指令(一條指令跳轉到另外一條指令)

代碼又是如何在cpu中運行的

其工作都可以分爲5個步驟:取指令、指令譯碼、執行指令、訪問取數、結果寫回。
正常我們代碼都是寫在硬盤當中,如編譯器中寫的java代碼,運行時加載至jvm即內存當中, 比如現在需要把a和b做加法運算,CPU收到這個指令(將a和b相加),就會去內存中將a和b讀取,然後存放到自己的寄存器中,然後由CPU中的運算器去做加法運算,得到的結果依然放到寄存器中。

io密集型和cpu(計算)密集型以及線程數的設計

CPU密集型:會消耗掉大量的CPU資源,例如需要大量的計算,視頻渲染啊,仿真啊之類的。這個時候CPU就卯足了勁在運行,這個時候切換線程,反而浪費了切換的時間,效率不高。
IO密集型:涉及到網絡、磁盤IO的都是IO密集型,這個時候CPU利用率並不高,這個時候適合使用多線程。

典型的javaWeb應用就是io密集型,包含了大量的網絡,數據庫,緩存讀取等,所以一個web應用可以同時支持很多web請求,或者異步多線程。一旦發生IO,線程就會處於等待狀態,當IO結束,數據準備好後,線程纔會繼續執行。因此從這裏可以發現,對於IO密集型的應用,我們可以多設置一些線程池中線程的數量,這樣就能讓在等待的這段時間內,線程可以去做其它事,提高併發處理效率。並且cpu的執行速度非常快,執行一條指令大約需要耗時1ns,但是對於內存呢?它去硬盤讀取數據至少8ms,在這段時間內,CPU可以執行大約800萬條指令,所以CPU能在線程進行IO時完成很多運算操作。
不過線程數也有相依的瓶頸,一個cpu在一個時間段只會執行一個線程,並且上下文切換也有代價
CPU密集型:線程數=CPU數,對於計算密集型的應用,完全是靠CPU的核數來工作。
IO密集型:線程數 = CPU核心數/(1-阻塞係數)
這個阻塞係數一般爲0.8~0.9之間,也可以取0.8或者0.9。套用公式,對於雙核CPU來說,它比較理想的線程數就是20,當然這都不是絕對的,需要根據實際情況以及實際業務來調整。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章