歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Unix知識 >> Unix基礎知識 >> kernel學習之進程調度器簡介

kernel學習之進程調度器簡介

日期:2017/3/3 14:55:14   编辑:Unix基礎知識

多任務操作系統可分為非搶占式多任務和搶占式多任務。和大多數現代操作系統一樣,linux也采用了搶占式多任務模式。這也就是說任務占用cpu的時間由調度器來決定。

調度策略:

決定在什麼時候用怎樣的方式選擇一個新的進程在哪個cpu上運行多長時間的規則稱為調度策略。

通常情況下,使用什麼樣的調度策略與進程的類型有關。進程常分為cpu消耗型和IO消耗型。

另一種分類方式為:

1、交互式進程(interactiveprocess):此類進程需要大量的人機交互,這樣的進程會不斷的睡眠,等待鍵盤和鼠標操作將其喚醒。這樣的進程對系統響應時間要求高。典型的進程如文本編輯程序。

2、批處理進程(batch process):這樣的進程不需要人機交互,常在後台進程,能忍受響應的遲緩,如編譯器。

3、實時進程(real-time process):這樣的進程對系統響應時間要求很高。如視頻音頻播放軟件。

注:為了與實時進程對應,交互進程和批處理進程常稱為普通進程。

策略標志:

SCHED_NORMAL:默認的調度策略,在舊版本中名為SCHED_OTHER, 分時調度策略

SCHED_BATCH:針對批處理進程。

SCHED_IDLE:使用此調度器的進程的優先級最低。在實現CFS時引入。

SCHED_FIFO:針對實時進程的先進先出策略。一旦占用cpu就一直進行,直到有更高的優先級的進程或自己放棄cpu。適合時間要求高,每次運行時間短的進程。

SCHED_RR:針對實時進程的時間片輪轉策略。進程的時間片用完後,系統會重新為其分配時間片,並把它放到隊列的尾端。這樣就能讓每個進程都能運行一段時間。適用於每次執行時間較長的進程。

總結:SCHED_NORMAL,SCHED_BATCH,SCHED_IDLE:都是用與普通進程。區別:SCHED_NORMAL為默認的調度策略。SCHED_BATCH用於批處理進程。SCHED_IDLE用於優先級最低的後台程序。SCHED_NORMAL和SCHED_BATCH求別只是在喚醒時有區別。喚醒較頻繁的進程不適合SCHED_BATCH。進程采用的調度策略反應在policy中,它的值為上面的值。子進程會繼承父進程的policy。同時我們也可以通過sched_setscheduler來修改它。

所有任務都采用linux分時調度策略時。

1,創建任務指定采用分時調度策略,並指定優先級nice值(-20~19)。

2,將根據每個任務的nice值確定在cpu上的執行時間(counter)。

3,如果沒有等待資源,則將該任務加入到就緒隊列中。

查看本欄目更多精彩內容:http://www.bianceng.cn/OS/unix/

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。

系統中既有分時調度,又有時間片輪轉調度和先進先出調度

1,RR調度和FIFO調度的進程屬於實時進程,以分時調度的進程是非實時進程。

2,當實時進程准備就緒後,如果當前cpu正在運行非實時進程,則實時進程立即搶占非實時進程。

3,RR進程和FIFO進程都采用實時優先級做為調度的權值標准,RR是FIFO的一個延伸。FIFO時,如果兩個進程的優先級一樣,則這兩個優先級一樣的進程具體執行哪一個是由其在隊列中的位置決定的,這樣導致一些不公正性(優先級是一樣的,為什麼要讓你一直運行?),如果將兩個優先級一樣的任務的調度策略都設為RR,則保證了這兩個任務可以循環執行,保證了公平。

出處:http://blog.csdn.net/muge0913/article/details/7561323

Copyright © Linux教程網 All Rights Reserved