1. 程式人生 > >多線程上下文切換

多線程上下文切換

放下 處理 單詞 即使 switch 如何 狀態 操作 不同的

什麽是上下文切換

上下文切換(context-switching)是存儲和恢復CPU狀態的過程,它使得線程執行能夠從中斷點恢復執行。

上下文切換時多任務操作系統和多線程環境的基本特征。

即使是單核CPU也支持多線程執行代碼,CPU通過給每個線程分配CPU時間片來實現這個機制。時間片是CPU分配給各個線程的時間,因為時間片非常短,所以CPU通過不停地切換線程執行,讓我們感覺多個線程時同時執行的,時間片一般是幾十毫秒(ms)。

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

這就像我們同時讀兩本書,當我們在讀一本英文的技術書籍時,發現某個單詞不認識, 於是便打開中英文詞典,但是在放下英文書籍之前,大腦必須先記住這本書讀到了多少頁的第多少行,等查完單詞之後,能夠繼續讀這本書。這樣的切換是會影響讀 書效率的,同樣上下文切換也會影響多線程的執行速度。

如何減少上下文切換

既然上下文切換會導致額外的開銷,因此減少上下文切換次數便可以提高多線程程序的運行效率。減少上下文切換的方法有無鎖並發編程、CAS算法、使用最少線程和使用協程。

  • 無鎖並發編程。多線程競爭時,會引起上下文切換,所以多線程處理數據時,可以用一些辦法來避免使用鎖,如將數據的ID按照Hash取模分段,不同的線程處理不同段的數據
  • CAS算法。Java的Atomic包使用CAS算法來更新數據,而不需要加鎖
  • 使用最少線程。避免創建不需要的線程,比如任務很少,但是創建了很多線程來處理,這樣會造成大量線程都處於等待狀態
  • 協程。在單線程裏實現多任務的調度,並在單線程裏維持多個任務間的切換

多線程上下文切換