Linux相關面試題 進程調度的問題

之前面試騰訊的時候,被問過這個問題,回答的不是太準確。整理了如下內容,如果有不正確的地方,還請指出來。

Linux 內核實現瞭如下四種調度類,按優先級從高到低排列:

  1. 停止類(主要用於多個CPU之間的負載均衡和CPU的熱拔插)
  2. 實時類
  3. 完全公平調度類
  4. 空閒類(負責將CPU置於停機狀態,直到中斷將其喚醒,只有在沒有其它任務的時候才能被執行)

和應用層關係密切的兩種調度類是實時類和完全公平調度類(CFS),另兩種知道其存在就行,一般的後臺開發只能接觸到這兩類。

Linux對實時進程提供了兩種調度策略:

  1. 先進先出(SCHED_FIFO)

FIFO策略是一種簡單的策略,即先進先出,它沒有時間片的概念,只要沒有更高優先級的進程就緒,使用該調度策略的進程就會一直進行。直到發生如下情況:

  • 自動放棄CPU,如執行阻塞調用。
  • 進程退出。
  • 被更高優先級進程搶佔。

    2.        時間片輪轉(SCHED_RR)

在時間片輪轉的策略中,具有相同優先級的進程輪流進行,進程每次使用CPU的時間爲一個固定長度的時間片。使用該策略的進程一旦被調度器選中,就會一直佔用CPU資源,直到發生下面某種情況:

  • 時間片耗盡
  • 進程自動放棄CPU,如執行阻塞調用。
  • 進程退出。
  • 被更高優先級進程搶佔。

完全公平調度類的調度策略包括(SCHED_OTHER或者SCHED_NORMAL),我們平常開發過程中,使用到的進程就是這種分時進程,CFS底層實現是基於紅黑樹的,實時進程是基於優先級隊列實現。

普通的CFS分時進程,可以通過如下兩個系統調用變爲實時進程。

sched_getscheduler()和sched_setscheduler(),這兩個函數主要調整進程 的優先級以及調度策略。

關於優先級,Linux中爲實時進程提供了99個優先級,從內核層面來看,從0到99範圍內的優先級屬於實時進程的調度範圍。從100~139共40個等級屬於CFS調度。

此外關於CPU的親和力。

在對稱多處理器(SMP)環境中,一個進程被重新調度時,不一定是在上次執行的CPU上運行。

同一個進程在不同 的CPU之間遷移會帶來性能的損失,損失的主要原因在於緩存。在進程遷移到新的處理器上後寫入新數據到內存時,原有處理器的緩存就過期了。當進程在不同處理器之間遷移時,會帶來兩方面的性能損失:

  • 進程不能訪問老的緩存數據
  • 原處理器中緩存中的數據必須標記爲無效。

由於遷移會帶來性能損失,因此進程調度趨於把進程固定在一個處理器上執行。

有時候需要把進程綁定到某個或某幾個CPU上運行,這就需要設置進程的CPU硬親和力了。Linux提供了非標準的系統調用來獲取和修改進程的硬親和力:即sched_setaffinity()函數和sched_getaffinity()

 

參考資料:

1. 《Linux環境編程 從應用到內核》高峯。

2. 《深入理解Linux內核》

=============================================================================================

Linux應用程序、內核、驅動、後臺開發交流討論羣(745510310),感興趣的同學可以加羣討論、交流、資料查找等,前進的道路上,你不是一個人奧^_^。

 

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