linux内核杂记(11)-进程调度(6)
LINUX實時調(diào)度策略
調(diào)度策略分類
1、SCHED_FIFO
(1)簡單的先入先出調(diào)度方法
(2)不使用時間片,一旦SCHED_FIFO的進(jìn)程處于可執(zhí)行狀態(tài),就會繼續(xù)執(zhí)行,直到它自己執(zhí)行完畢或顯式釋放。
(3)處于可運行狀態(tài)的SCHED_FIFO的進(jìn)程比任何SCHED_NORMAL的進(jìn)程得到優(yōu)先調(diào)度。
(4)只能在一種情況下被搶占:具有更高優(yōu)先級的SCHED_FIFO或SCHED_PR任務(wù)才可以搶占它,如果存在多個相同優(yōu)先級的SCHED_FIFO,則輪流執(zhí)行,前提條件是,它們愿意主動讓出處理器
2、SCHED_PR
SCHED_PR與SCHED_FIFO類似 ,但是在消耗完事先分配給它的時間后就不再執(zhí)行。
帶有時間片的 SCHED_FIFO算法 ,實時輪流調(diào)度算法,在消耗完時間片后,其它同優(yōu)先級的實時進(jìn)程繼續(xù)執(zhí)行,但低優(yōu)先級進(jìn)程不能搶占高優(yōu)先級的SCHED_PR進(jìn)程,即使它已經(jīng)用盡時間片
給定優(yōu)先級的實時進(jìn)程總能搶占比它優(yōu)先級低的進(jìn)程
注意:1-2都屬于實時進(jìn)程,為靜態(tài)優(yōu)先級,也就是說內(nèi)核不會為它們計算動態(tài)優(yōu)先級,CFS對它們不起作用。
實時優(yōu)先級從0到MAX_PT_PRIO(默認(rèn)為100)減1
3、普通非實時調(diào)度策略SCHED_NORMAL
4、實時策略不受完全公平調(diào)度器管理,受另外一個單獨的調(diào)度器管理
其具體實現(xiàn)在kernel/sched_rt.c中。完全公平調(diào)度器(英語:Completely Fair Scheduler,縮寫為CFS),Linux內(nèi)核的一部分,負(fù)責(zé)進(jìn)程調(diào)度。參考了康恩·科里瓦斯(Con Kolivas)提出的調(diào)度器源代碼后,由匈牙利程式員英格·蒙內(nèi)(Ingo Molnar)所提出。在Linux kernel 2.6.23之后采用,取代先前的O(1)調(diào)度器,成為系統(tǒng)預(yù)設(shè)的調(diào)度器。它負(fù)責(zé)將CPU資源,分配給正在執(zhí)行中的進(jìn)程,目標(biāo)在于最大化程式互動效能與整體CPU的使用率。使用紅黑樹來實作,算法效率為O(log(n))。
CFS調(diào)度器參考了康恩·科里瓦斯(Con Kolivas)所開發(fā)的樓梯調(diào)度算法(staircase scheduler)與RSDL(The Rotating Staircase Deadline Schedule)的經(jīng)驗[2] ,選取花費CPU執(zhí)行時間最少的進(jìn)程來進(jìn)行調(diào)度。CFS主要由sched_entity 內(nèi)含的 vruntime所決定,不再跟蹤process的sleep time,并揚棄active/expire的概念, runqueue里面所有的進(jìn)程都平等對待,CFS使用“虛擬運行時”(virtual running time)來表示某個任務(wù)的時間量。
CFS改使用紅黑樹算法,將執(zhí)行時間越少的工作(即 sched_entity)排列在紅黑樹的左邊[3],時間復(fù)雜度是O(log N),節(jié)點(即rb_node)的安插工作則由dequeue_entity()和enqueue_entity()來完成。當(dāng)前執(zhí)行的task通過呼叫 put_prev_task 返回紅黑樹,下一個待執(zhí)行的task則由pick_next_task來呼叫。蒙內(nèi)表示, CFS在百分之八十時間都在確實模擬處理器的處理時間。
總結(jié)
以上是生活随笔為你收集整理的linux内核杂记(11)-进程调度(6)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 操作系统设计与实现第3版笔记与minix
- 下一篇: linux内核杂记(12)-进程调度(7