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