Linux性能優化——CPU上下文切換

 Linux性能優化——CPU上下文切換

通過閱讀文本你將瞭解到以下內容:

  • CPU上下文切換的原理
  • CPU上下文切換的種類
  • CPU上下文切換對性能的影響

 1. 原理

Linux是一個支持多任務的操作系統,它能夠讓大於CPU核心數的任務同時運行。當然,這裏所說的同時有時候並不是真正意義上的同時,而是系統在很短時間內,將CPU時間片輪流分配給任務,讓他們看起來像是同時運行。

系統在調度每一個任務運行時,都要知道該任務從哪裏加載,從哪裏開始運行,這就涉及到系統爲這些任務設置CPU寄存器和程序計數器(Program Counter,PC)。這兩者是CPU在運行任何任務前,必須依賴的環境,因此被稱爲CPU上下文。系統在切換任務時需要先保存前一個任務的CPU上下文,然後加載(或恢復)下一個任務的CPU上下文,最後跳轉到PC所指位置運行任務。這一過程被稱爲CPU上下文切換。CPU上下文切換,是保證Linux系統正常工作的核心功能之一。

這裏提到的任務到底指的是什麼呢?其實任務具體分爲三種:進程、線程和中斷。根據任務的不同,CPU上下文切換也分爲三種,即進程上下文切換、線程上下文切換和中斷上下文切換。

2. 進程上下文切換

按照特權等級,進程的運行空間可分爲內核空間和用戶空間。進程運行在內核空間,被稱爲進程的內核態,此時具有最高權限,可以直接訪問所有資源;進程運行在用戶空間,被稱爲進程的用戶態,此時只能訪問受限資源,要想訪問特權資源必須陷入到內核中。從用戶態到內核態的轉變,需要通過系統調用來完成。系統調用就涉及到用戶態和內核態的上下文切換,這種切換一般稱爲特權模式切換。

進程間切換隻能發生在內核態,所以進程的上下文切換不僅包含進程的用戶空間資源(虛擬內存、棧、全局變量等),還包含內核空間狀態(內核堆棧、寄存器等)。

什麼會導致進程上下文切換呢?有以下幾種情況:

  • 某進程的CPU時間片耗盡,被系統掛起,切換到另一個進程。
  • 由於系統資源不足,某進程再等待資源時被掛起,由系統調度其他進程。
  • 進程調用sleep睡眠函數將自己掛起。
  • 高優先級進程搶佔低優先級進程,低優先級進程被掛起。
  • 發生中斷時,當前進程被掛起,轉而執行中斷服務程序

3. 線程上下文切換

線程與進程的最大區別在於,線程是系統調度的基本單位(執行進程的最小單元),進程是資源擁有的基本單位。內核中的任務調度實際上針對的是線程,而進程爲線程提高了虛擬內存、全局變量等資源。由於線程與進程之間的這種關係,線程上下文切換分爲兩種情況:

  • 同進程中的線程切換。有些資源是共享的,切換時保持不變,只需要切換線程的私有數據、寄存器等不共享的數據。
  • 多進程中的線程切換。資源不共享,切換過程同進程上下文切換一樣

4. 中斷上下文切換

中斷會打斷進程的正常調度和執行,但中斷上下文切換隻發生在內核態,不涉及進程的用戶態,所以中斷打斷一個進程時,不需要保存和恢復進程的虛擬內存、全局變量等用戶態資源,只涉及到進程的內核狀態和中斷服務程序執行所需要的狀態(CPU寄存器、內核堆棧、中斷參數等)。

5. 性能影響

CPU上下文切換本身是消耗CPU的,一次上下文切換需要幾十納秒到幾微秒。過多的切換會把CPU時間消耗在上下文保存與恢復上,從而會縮短任務的真正運行時間,導致系統的整體性能下降。

另外,Linux通過TLB(Translation Lookaside Buffer)來管理虛擬內存到物理內存的映射關係。當虛擬內存更新後,TLB也需要刷新,內存的訪問也會隨之變慢。特別是在多處理器系統上,緩存是被多個處理器共享的,刷新緩存不僅會影響當前處理器的進程,還會影響共享緩存的其他處理器的進程。

 

版權聲明:本文爲博主原創文章,轉載請註明鏈接 https://blog.csdn.net/luroujuan/article/details/88621968

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