淺談關於多線程在CPU上是怎樣分布的
關於Java多線程在CPU上分布的問題,首先要明白一點,它與CPU是多核還是雙核並沒有必然的聯繫。CPU有時只能執行一個線程,這是因為在多線程並行執行時,CPU可以根據一定的演算法來調度和切換線程。一般而言對於多線程的理解可以是CPU根據一定的線程調度演算法來切換線程,因此在相應時段,可看作是多個線程在並發執行。但在某一時間點上實際運行的只有一個線程。
在Java多線程中有並發編程和CPU時鐘震蕩兩個關鍵的問題。我們都知道,在很久以前的DOS系統里,只能執行單任務。而我們現在使用的Windows都可以實現多任務操作,可以一邊上網聊天、一邊聽歌、一邊再下載電影等等。那麼,操作系統是怎樣支持多任務的?每打開一個程序,就意味著啟動一個進程,並為其分配相應的內存空間,這樣就可以讓程序並發運行了。而CPU有時鐘頻率,即每秒可執行的CPU指令次數,在一個時鐘周期內,CPU實際上只能執行一條(或者多條指令)。
操作系統對進程線程進行管理,對每一個進程進行時間分配,然後在每個進程的內部,程序代碼自己處理該進程內部線程的時間分配,多個線程相互之間要在很短的時間內進行切換。因此,給人的感覺是多個任務、多個線程是在並發運行的,但實際上,程序的運行還是非同步的。
既然是非同步運行的,那麼則可以理解為CPU的運行方式是串列而非並行,那麼我們稱之為多線程有什麼意義?尚學堂?百戰程序員陳老師指出,原因還是CPU的運行速度太快了,但是我們I/O的讀取速度,網路的傳輸、資料庫的連接等等與CPU運算速度比起來,則是非常慢的。為了充分利用CPU,就可以減少CPU的空閑時間。
多線程的目的在於最大限度的利用CPU資源,在CPU中,主頻=外頻×倍頻,主頻越高,一個時鐘周期裡面完成的指令數也越多,當然cpu的速度也就越快了,以前提高CPU運算速度的方法,就是提高CPU主頻,可是隨著時間的推移,CPU的主頻已經達到了物理極限,很難再提高了。於是為了解決這一問題,多核的CPU才開始逐漸受人青睞。
關於Java多線程有兩個重要問題:
首先簡單談談關於內存方面的問題,在Java中所有變數都儲存在主存中,每條線程都有自己的工作內存(Working Memory),工作內存中存儲的內容通常是主存中變數的復件。線程對所有變數的操作均在工作內存中進行,線程之間無法相互直接訪問,變數傳遞也都需要在主存完成。線程之間的通信簡單而快速,進程之間是相互獨立的,如果不依賴網路,進程之間是無法通信的。
其次是關於線程調度的問題,CPU對於各個線程的調度是隨機的(分時調度),而在Java中,JVM負責線程的調度,可更好地分配CPU的使用權。對於線程的調度一般有兩種模式,分時調度和搶佔式調度。分時調度是按照順序平均分配;搶佔調度是按照優先順序來進行分配。
以上就是關於多線程在CPU上的分布問題的簡單論述,從而幫助大家加深對多線程的理解。
※淺談SpringMVC和MyBatis在應用方面的優勢
※淺談大數據Bigtable與MapReduce、GFS有何聯繫
TAG:科技大咖匯 |