cpu個數、核數、線程數、Java多線程關係的理解

一 cpu個數、核數、線程數的關係java

cpu個數:是指物理上,也及硬件上的核心數;算法

核數:是邏輯上的,簡單理解爲邏輯上模擬出的核心數;多線程

線程數:是同一時刻設備能並行執行的程序個數,線程數=cpu個數 * 核數性能

二 cpu線程數和Java多線程spa

首先明白幾個概念:操作系統

 

(1) 單個cpu線程在同一時刻只能執行單一Java程序,也就是一個線程線程

(2) 單個線程同時只能在單個cpu線程中執行隊列

(3) 線程是操做系統最小的調度單位,進程是資源(好比:內存)分配的最小單位進程

(4)Java中的全部線程在JVM進程中,CPU調度的是進程中的線程內存

(5)Java多線程並非因爲cpu線程數爲多個才稱爲多線程,當Java線程數大於cpu線程數,操做系統使用時間片機制,採用線程調度算法,頻繁的進行線程切換。

a 那麼java多進程,每一個進程又多線程,cpu是如何調度的呢?

我的理解:操做系統並非單純均勻的分配cpu執行不一樣的進程,由於線程是調度的最小單位,因此會根據不一樣進程中的線程個數進行時間分片,均勻的執行每一個線程,也就是說A進程中有10個線程,而B進程中有2個進程,那麼cpu分給進程的執行時間理論上應該是5:1才合理。

b cpu線程數和java線程數有直接關係嗎?

我的理解:沒有直接關係,正如上面所說,cpu採用分片機制執行線程,給每一個線程劃分很小的時間顆粒去執行,可是真正的項目中,一個程序要作不少的的操做,讀寫磁盤、數據邏輯處理、出於業務需求必要的休眠等等操做,當程序在進行I/O操做的時候,線程是阻塞的,線程由運行狀態切換到等待狀態,此時cpu會作上下文切換,以便處理其餘的程序;當I/O操做完成後,cpu 會收到一個來自硬盤的中斷信號,並進入中斷處理例程,手頭正在執行的線程所以被打斷,回到 ready 隊列。而先前因 I/O 而waiting 的線程隨着 I/O 的完成也再次回到 就緒 隊列,這時 cpu 可能會選擇它來執行。

c 如何肯定程序線程數?

我的理解:若是全部的任務都是計算密集型的,則建立的多線程數 = 處理器核心數就能夠了

                  若是io操做比較耗時,則根據具體狀況調整線程數,此時 多線程數 = n*處理器核心數

        通常狀況程序線程數等於cpu線程數的兩到三倍就能很好的利用cpu了,過多的程序線程數不但不會提升性能,反而還會由於線程間的頻繁切換而受影響,具體須要根據線程處理的業務考略,不斷調整線程數個數,肯定當前系統最優的線程數。 ---------------------   

相關文章
相關標籤/搜索