關於線程與CPU的關係理清

最近在啃《深入理解JVM》 看到垃圾收集器那一節關於CMS的併發清理線程時,下定決心要把線程和CPU的關係理清楚。

首先,先解釋併發和並行的區別。如果不對請麻煩評論糾正一下。
1.我理解的併發是指執行多個任務。並且這些任務可能是同時進行的,也可能不是同時進行的。比如說單核CPU上的多線程通過搶佔CPU資源獲得時間片(CPU分配給線程的執行時間),執行自己線程的任務。因爲時間片時間非常短,可能只有十幾毫秒。使得用戶覺得CPU可以同時執行多個任務。比如說在一個遊戲軟件中,線程A負責計算子彈的彈道並且改變子彈的位移矢量,而線程B負責控制玩家的行走,線程A在控制子彈運動,此時線程B來搶佔CPU資源,將線程A踢出CPU,並且控制玩家移動了一下,最終玩家躲開了子彈爆頭的致命一擊,只是掉了點血。這個過程看起來像是子彈打出去,玩家也在運動,最終躲掉了子彈一樣,其實是玩家走一點點,子彈再移動一點點,如此反覆,最終子彈和玩家碰撞盒相遇造成傷害。這種可以執行多個任務的行爲稱爲併發。

另外一種併發的情況是並行,下面來解釋並行。
2.並行強調"同時"的概念,相像一下,許多線程平“行”,一“並”執行各自的任務。他們之間是平行關係,當然是同一時間進行的。在多核CPU上,如果每條線程都可以得到一個CPU資源來執行自己的任務,那這些線程都是同時間點執行自己的任務。如果線程比較多,而無法爲每條線程都分配一個CPU核,那麼可能發生兩個或以上的線程搶佔一個CPU核的情況。

當程序屬於IO密集型或者其他非CPU使用密集型時,線程會頻繁訪問IO等非CPU資源。如果不支持併發,那麼當許多線程都在訪問IO或者其他非CPU資源,那CPU就會處於空閒狀態,這時就無法讓CPU的利用率達到最大。如果支持併發,那麼當一個線程在訪問CPU轉而訪問IO等資源時,其他線程就可以繼續利用CPU進行運算,使得CPU利用率達到最大。

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