預設情況下如何設置程序的實時優先級?
我知道,出於調度目的,Linux 程序具有“不錯”的值和實時優先級值,並且可以使用
nice
andchrt
命令顯式更改這些值。如果使用者沒有明確設置一個程序的實時優先級,它是如何設置的?
引用羅伯特·洛夫的話:
調度器並不神奇地知道一個程序是否是互動式的。它需要一些能夠準確反映任務是受 I/O 限制還是受處理器限制的啟發式方法。最具指示性的指標是任務休眠的時間。如果一個任務大部分時間都在休眠,那麼它就是I/O-bound。如果一個任務的可執行時間比睡眠時間多,則它不是互動式的。這延伸到了極端;幾乎所有時間都在休眠的任務 完全受 I/O 限制,而幾乎所有時間都可執行的任務完全受處理器限制。
為了實現這種啟發式方法,Linux 會保留一個執行選項卡,以記錄程序睡眠時間與程序處於可執行狀態的時間。此值儲存
sleep_avg member
在task_struct
. 它的範圍從零到MAX_SLEEP_AVG
,預設為 10 毫秒。當一個任務在睡眠後變得可執行時,sleep_avg
它會增加它的睡眠時間,直到該值達到MAX_SLEEP_AVG
。對於任務執行的每個計時器滴答,sleep_avg
都會遞減,直到達到零。所以,我相信核心根據上述啟發式決定調度策略。據我所知,對於實時程序,調度策略可以是
SCHED_FIFO
或SCHED_RR
. 這兩種策略都是相似的,只是SCHED_RR
有一個時間片,而SCHED_FIFO
沒有任何時間片。但是,我們甚至可以更改實時程序調度。您可以參考this question on how to change the real time process scheduling。
參考
http://www.informit.com/articles/article.aspx?p=101760&seqNum=2