进程的实时优先级是如何默认设置的?

Ell*_*tus 4 linux scheduling priority

我知道,出于调度目的,Linux 进程具有“nice”值和实时优先级值,并且可以使用nicechrt命令显式更改这些值。如果用户没有明确设置一个进程的实时优先级,它是如何设置的?

Ram*_*esh 5

引用罗伯特·洛夫的话:

调度程序不会神奇地知道一个进程是否是交互式的。它需要一些能够准确反映任务是受 I/O 限制还是受处理器限制的启发式方法。最具指示性的指标是任务休眠的时间。如果任务大部分时间都处于休眠状态,则它是I/O 绑定的。如果一个任务在 runnable 上花费的时间比在 sleep 上花费的时间多,则它不是交互式的。这延伸到了极端;几乎所有时间都在休眠的任务 完全受 I/O 限制,而几乎所有时间都处于可运行状态的任务完全受处理器限制

为了实现这种启发式方法,Linux 会保留一个运行选项卡,显示进程睡眠所花费的时间与进程处于可运行状态所花费的时间。此值存储在sleep_avg membertask_struct。它的范围从 0 到MAX_SLEEP_AVG,默认为 10 毫秒。当一个任务在睡眠后变为可运行时,sleep_avg它会增加它睡眠的时间,直到该值达到MAX_SLEEP_AVG。对于任务运行的每个计时器滴答, sleep_avg递减直到它达到零。

所以,我相信内核会根据上述启发式来决定调度策略。据我所知,对于实时进程,调度策略可以是SCHED_FIFOSCHED_RR。这两种策略是相似的,只是SCHED_RR有一个时间片而SCHED_FIFO没有任何时间片。

但是,我们甚至可以更改实时进程调度。您可以参考问题了解如何更改实时进程调度。

参考

http://www.informit.com/articles/article.aspx?p=101760&seqNum=2