linux
程序排程演算法分析
摘要
:基於
x86平台
linux
2.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_interruptible
或task_uninterruptible
,暫時放棄執行而進入睡眠。這通常發生在來自使用者空間的系統呼叫被阻塞。在使用者空間,使用者程序可以通過系統呼叫
nanosleep()
達到目的。
2)排程還可以是非自願的。在一定條件下,核心會強制性剝奪當前程序執行而排程其他程序進入執行。
linux
排程政策基礎是時間片輪轉
+優先順序搶占的結合,為了滿足不同應用的需要,核心提供了三種排程方法:1)
sched_fifo
實時排程策略,先到先服務2)
sched_rr
實時排程策略,時間片輪轉3)
sched_normal
分時排程策略(在
2.6核心以前為
sched_other
)。使用者程序可以通過系統呼叫
sched_setscheduler
()設定自己的排程策略。
sched_fifo
和sched_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早期版本sd(
staircase schedule
)排程器,到
2.6.23
版本的rsdl
(the rotating staircase deadline schedule
)排程器,再至
2.6.26
版本cfs
(complete fair schedule
)排程器,排程機制不斷完善。
2.6.26
核心程序排程吸收了前期版本的精華,通過全新設計資料結構和演算法,為實時程序(
sched_fifo/sched_rr
)提供o(1
)時間複雜度的排程演算法,同時,為了兼顧「完全公平」這一設計思路,設計了
cfs排程器,為普通程序提供滿足公平性為原則的o(
lgn)時間複雜度的排程演算法。因此,準確地說,
2.6.23
以後的版本程序排程是基於o(
1)+ o(
lgn)時間複雜度的排程。基於這兩部分的設計和
linux
核心**實現將在本文給與介紹。
Linux 程序排程演算法
程序排程 無論是在批處理系統還是分時系統中,使用者程序數一般都多於處理機數 這將導致它們互相爭奪處理機。另外,系統程序也同樣需要使用處理機。這就要求程序排程程式按一定的策略,動態地把處理機分配給處於就緒佇列中的某乙個程序,以使之執行。程序排程具有四條基本屬性和三個基本狀態 基本屬性 1 多型性 從誕...
Linux 程序排程演算法
linux中的程序排程演算法分類如下 一 先來先服務和短作業 程序 優先排程演算法 1 先來先服務排程演算法 fcfs 先來先服務 first come first service fcfs 排程演算法是一種最簡單的 不可搶占式的 排程演算法,既可用於作業排程,也可用於程序排程。該演算法按照程序進入...
linux程序排程演算法
一 什麼是程序排程 都知道linux是一種多使用者多工的作業系統,而當多個程序同時執行去,搶占有限資源的時候,這時作業系統就會按照一定的原則將資源合理分配給請求資源的程序,這就是程序排程。二 在linux作業系統中都有哪些程序排程演算法 1.先進先出演算法 fifo 按照程序進入就緒佇列的先後次序來...