【亞嵌】Linux進程調度算法分析(一)

Linux進程調度算法分析

摘要 基於X86平臺Linux2.6.26內核進程調度部分代碼,刨析Linux進程調度算法,對算法的原理,實現和複雜度進行了分析並提出了算法改進措施。

關鍵字:Linux內核 進程調度 算法

 

1. Linux進程調度概述

Linux系統支持用戶態進程和內核線程,需要說明的是,Linux沒有提供用戶態線程支持,實現用戶態線程需要引入第三方線程庫。

操作系統進程調度是整個操作系統理論的核心,在設計進程調動機制需要考慮的具體問題主要有:

1)調度的時機:在什麼情況下,什麼時候進行調度。

2)調度的“政策”(policy):根據什麼準則挑選下一個進入運行的進程。

3)調度的方式:是“可剝奪”(preemptive)還是“不可剝奪”(nonpreemptive)。

1.2.1給出了Linux進程狀態轉換關係:

1 Linux進程狀態轉換圖

Linux進程調度分爲自願調度和強制調度兩種。1)在內核空間,一個進程可以通過schedule()啓動一次調度,也可以在調用schedule()之前,將本進程狀態設置爲TASK_INTERRUPTIBLETASK_UNINTERRUPTIBLE,暫時放棄運行而進入睡眠。這通常發生在來自用戶空間的系統調用被阻塞。在用戶空間,用戶進程可以通過系統調用nanosleep()達到目的。2)調度還可以是非自願的。在一定條件下,內核會強制性剝奪當前進程運行而調度其他進程進入運行。

Linux調度政策基礎是時間片輪轉+優先級搶佔的結合,爲了滿足不同應用的需要,內核提供了三種調度方法: 1SCHED_FIFO實時調度策略,先到先服務2SCHED_RR實時調度策略,時間片輪轉3SCHED_NORMAL 分時調度策略(在2.6內核以前爲SCHED_OTHER)。用戶進程可以通過系統調用sched_setscheduler()設定自己的調度策略。SCHED_FIFOSCHED_RR的區別是,前者只有在就緒隊列中有優先級更高的進程,或進程被阻塞,或自願調用阻塞原語(如sleep_on_interruptible)的情況下,纔會放棄CPU,而如果調度策略是後者,當前進程與就緒隊列裏其他進程按Round Robin方式共享CPU

 

2. Linux進程調度原理

基本的操作系統進程調度算法包括先來先服務(first come first serve),時間片輪轉(round robin),多級反饋輪轉法(round robin with multiple feedback),優先級法(靜態優先級法/動態優先級法),短作業優先法(shortest job first),最高響應比優先法(highest response_ratio next)。不同調度算法應用場合不同,某些調度算法可能僅具有研究價值,實際中鮮有應用;而某些調度算法需要互補以完成設計需求。但是,無論哪種進程調度算法,都要面對以下實際問題:

1)調度器對實時進程的響應;

2)調度器的調度開銷,以及系統進程負載對調度的影響;

3)在SMP環境下,當前CPU調度對其他CPU的影響;

Linux2.6.x內核進程調度算法爲解決上述問題,設計了全新的數據結構和調度算法,但其基本策路仍是以優先級爲基礎的搶佔式調度,與2.6以前內核版本不同,內核搶佔可能發生在內核態(因此,2.6版本的內核代碼必須考慮到重入問題)。

2.6版本的內核調度也是幾度變遷,其基本思想是1)提高實時進程調度相應比2)普通進程調度體現“完全公平這個思想”。從2.6早期版本SDStaircase Schedule)調度器,到2.6.23版本的RSDLThe Rotating Staircase Deadline Schedule)調度器,再至2.6.26版本CFSComplete Fair Schedule)調度器,調度機制不斷完善。2.6.26內核進程調度吸收了前期版本的精華,通過全新設計數據結構和算法,爲實時進程(SCHED_FIFO/SCHED_RR)提供O1)時間複雜度的調度算法,同時,爲了兼顧“完全公平”這一設計思路,設計了CFS調度器,爲普通進程提供滿足公平性爲原則的Olgn)時間複雜度的調度算法。因此,準確地說,2.6.23以後的版本進程調度是基於O1+ Olgn)時間複雜度的調度。基於這兩部分的設計和Linux內核代碼實現將在本文給與介紹。

發佈了61 篇原創文章 · 獲贊 3 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章