Java多線程上下文切換

 

轉載請註明原文地址:http://www.javashuo.com/article/p-yjhkqjrk-dk.htmlhtml

 

一:什麼是上下文切換

   CPU處理任務時不是一直只處理一個,而是經過給每一個線程分配CPU時間片,時間片用完了就切換下一個線程。時間片很是短,通常只有幾十毫秒,因此CPU經過不停地切換線程執行時咱們幾乎感受不到任務的停滯,讓咱們感受是多個線程同時執行。算法

   CPU經過時間片分配算法來循環執行任務,當前任務執行一個時間片後會切換到下一個任務。可是,在切換前會保存上一個任務的狀態,以便下次切換回這個任務時,能夠再次加載這個任務的狀態,從任務保存到再加載的過程就是一次上下文切換編程

   這樣的切換是會影響多線程的執行效率的。多線程

 

二:如何減小上下文切換來提升多線程程序的運行效率

    線程的上下文切換分爲讓步式上下文切換搶佔式上下文切換併發

    前者是指執行線程主動釋放CPU,與鎖競爭嚴重程度成正比,可經過減小鎖競爭來避免性能

    後者是指線程因分配的時間片用盡而被迫放棄CPU或者被其餘優先級更高的線程所搶佔,通常因爲線程數大於CPU可用核心數引發,可經過調整線程數,適當減小線程數來避免。線程

 

    1)無鎖併發編程。鎖競爭時會引發上下文切換,因此多線程處理數據時,能夠用一些辦法來避免使用鎖,如將數據的ID按照Hash取模分段,不一樣的線程處理不一樣段的數據。協程

    2)減小鎖的使用,能用CAS代替鎖時儘可能用CAS代替。Java的Atomic包使用CAS算法來更新數據,而不須要加鎖。htm

         在多線程競爭下,加鎖、釋放鎖會致使比較多的上下文切換和調度延時,引發性能問題。blog

          多個線程使用CAS同時更新同一個變量時,只有其中一個線程能更新變量的值,而其它線程都失敗,失敗的線程並不會被掛起,而是被告知此次競爭中失敗,並能夠再次嘗試(只要cpu分配給線程的時間片沒有過,就能夠不斷的重試,可是時間片事後,若是仍是沒有成功,也會進行上下文切換,因此說只是減小了上下文切換)。

    3)使用最少線程。避免建立不須要的線程,好比任務不多,可是建立了不少線程來處理,這樣會形成大量線程都處於等待狀態。

    4)使用協程。在單線程裏實現多任務的調度,並在單線程裏維持多個任務間的切換。

相關文章
相關標籤/搜索