![进程的实时优先级默认是如何设置的?](https://linux22.com/image/56138/%E8%BF%9B%E7%A8%8B%E7%9A%84%E5%AE%9E%E6%97%B6%E4%BC%98%E5%85%88%E7%BA%A7%E9%BB%98%E8%AE%A4%E6%98%AF%E5%A6%82%E4%BD%95%E8%AE%BE%E7%BD%AE%E7%9A%84%EF%BC%9F.png)
据我了解,出于调度目的,Linux 进程具有“nice”值和实时优先级值,并且可以使用nice
和chrt
命令显式更改这些值。如果用户没有明确设置进程的实时优先级,那么它是如何设置的呢?
答案1
引用罗伯特·洛夫的话:
调度程序不会神奇地知道进程是否是交互式的。它需要一些能够准确反映任务是 I/O 密集型还是处理器密集型的启发式方法。最有指示性的指标是任务的持续时间睡觉。如果一项任务大部分时间都在睡觉,那么它就是I/O 限制。如果某个任务的运行时间多于睡眠时间,则该任务不是交互的。这延伸到了极致;几乎所有时间都在睡觉的任务是 完全受 I/O 限制,而几乎所有时间都可以运行的任务是完全受处理器限制。
为了实现这种启发式方法,Linux 保留了一个运行选项卡,记录进程花费在睡眠状态的时间与进程花费在可运行状态的时间。该值存储在
sleep_avg member
的中task_struct
。它的范围从 0 到MAX_SLEEP_AVG
,默认为 10 毫秒。当任务在睡眠后变为可运行时,sleep_avg
会根据其睡眠时长递增,直到该值达到MAX_SLEEP_AVG
。对于任务运行的每个计时器滴答声,该任务sleep_avg
都会递减,直到达到零。
因此,我相信内核根据上述启发式决定调度策略。据我所知,对于实时进程,调度策略可以是SCHED_FIFO
或SCHED_RR
。两种策略类似,只是SCHED_RR
有时间片而SCHED_FIFO
没有时间片。
但是,我们甚至也可以更改实时进程调度。你可以参考这关于如何改变实时进程调度的问题。
参考
http://www.informit.com/articles/article.aspx?p=101760&seqNum=2
答案2
作为内核的一个组件,进程调度程序使用基于优先级的调度算法来决定在给定系统上的进程之间分配处理器时间。从初始基本优先级或默认优先级为零(我相信)开始,调度程序可以根据进程是 I/O 还是 CPU 密集型来动态增加或降低优先级,以实现调度目标。花费时间等待 I/O 操作优先级的 I/O 进程将动态增加,而持续消耗其时间片(任务在被抢占之前可以运行多长时间)的 CPU 密集型进程将动态降低。
根据应用程序的类型(交互式,例如浏览器/IDE 等),调度程序使用策略来设置优先级,并进行相应的设置。交互式获得更高的优先级,因为最终用户期望从这些等中得到响应。