Linux線程的調度機制

Linux線程的調度機制


  在Linux中,線程是由進程來實現,線程就是輕量級進程( lightweight process ),因此在Linux中,線程的調度是按照進程的調度方式來進行調度的。Linux這樣實現的線程的好處的之一是:線程調度直接使用進程調度就可以了,沒必要再搞一個進程內的線程調度器。
  
  在Linux中,調度器是基於線程的調度策略(scheduling policy)和靜態調度優先級(static scheduling priority)來決定那個線程來運行。
  
  Linux系統的三種調度策略:
  一、SCHED_OTHER:分時調度策略(Linux線程默認的調度策略)。
  二、SCHED_FIFO:實時調度策略,先到先服務。該策略簡單的說就是一旦線程佔用CPU則一直運行,一直運行直到有更高優先級任務到達或自己放棄。
  三、SCHED_RR:實時調度策略,時間片輪轉。給每個線程增加了一個時間片限制,當時間片用完後,系統將把該線程置於隊列末尾。放在隊列尾保證了所有具有相同優先級的RR任務的調度公平。
  
  調度優先級策略:
  實時調度策略大於分時調度策略;
  當實時進程/線程準備就緒後,如果當前CPU正在運行分時進程/線程,則實時進程/線程立即搶佔分時進程/線程。
  同樣都是實時調度策略,優先級高的先執行。
  
  所有任務都採用Linux分時調度策略時:
  1. 創建任務指定採用分時調度策略,並指定優先級nice值(-20~19)。
  2. 將根據每個任務的nice值確定在CPU上的執行時間(counter)。
  3. 如果沒有等待資源,則將該任務加入到就緒隊列中。
  4. 調度程序遍歷就緒隊列中的任務,通過對每個任務動態優先級的計算(counter+20-nice)結果,選擇計算結果最大的一個去運行,當這個時間片用完後(counter減至0)或者主動放棄CPU時,該任務將被放在就緒隊列末尾(時間片用完)或等待隊列(因等待資源而放棄CPU)中。
  5. 此時調度程序重複上面計算過程,轉到第4步。
  6. 當調度程序發現所有就緒任務計算所得的權值都爲不大於0時,重複第2步。
  
  所有任務都採用FIFO時:
  1. 創建進程時指定採用FIFO,並設置實時優先級rt_priority(1-99)。
  2. 如果沒有等待資源,則將該任務加入到就緒隊列中。
  3. 調度程序遍歷就緒隊列,根據實時優先級計算調度權值(1000+rt_priority),選擇權值最高的任務使用cpu,該FIFO任務將一直佔有CPU直到有優先級更高的任務就緒(即使優先級相同也不行)或者主動放棄(等待資源)。
  4. 調度程序發現有優先級更高的任務到達(高優先級任務可能被中斷或定時器任務喚醒,再或被當前運行的任務喚醒,等等),則調度程序立即在當前任務堆棧中保存當前CPU寄存器的所有數據,重新從高優先級任務的堆棧中加載寄存器數據到CPU,此時高優先級的任務開始運行。重複第3步。
  5. 如果當前任務因等待資源而主動放棄CPU使用權,則該任務將從就緒隊列中刪除,加入等待隊列,此時重複第3步。
  
  所有任務都採用RR調度策略時:
  1. 創建任務時指定調度參數爲RR,並設置任務的實時優先級和nice值(nice值將會轉換爲該任務的時間片的長度)。
  2. 如果沒有等待資源,則將該任務加入到就緒隊列中。
  3. 調度程序遍歷就緒隊列,根據實時優先級計算調度權值(1000+rt_priority),選擇權值最高的任務使用CPU。
  4. 如果就緒隊列中的RR任務時間片爲0,則會根據nice值設置該任務的時間片,同時將該任務放入就緒隊列的末尾。重複步驟3。
  5. 當前任務由於等待資源而主動退出CPU,則其加入等待隊列中。重複步驟3。

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