调度器51—进程优先级 prio、static_prio、normal_prio、rt_priority

发布时间 2023-04-27 20:28:18作者: Hello-World3

一、概述

struct task_struct {
    int                prio;
    int                static_prio;
    int                normal_prio;
    unsigned int    rt_priority;
    ...
}

 

二、动态优先级——prio

prio 表示进程的当前优先级,是一个动态值,会在进程运行时不断变化。进程的实际运行顺序是以优先级为基础的,优先级高的进程在竞争CPU时间时,会比优先级低的进程更有可能被内核调度。prio的取值范围一般是0~139。

在某些情况下,内核需要暂时提高进程的优先级(内核同步的实时互斥量可能会提高动态优先级从而使得优先级较低的进程先运行),因此需要新增一个优先级,也就是动态优先级来表示。由于此改变不是永久的,因此静态优先级和普通优先级不受影响。

 

三、静态优先级——static_prio

static_prio 表示进程的静态(初始)优先级,是一个固定的值,在进程创建时被赋予,不会随进程的运行而变化。进程的 static_prio 值也是和进程的调度有关的,但它主要用于计算进程的 nice 值。

进程启动时分配的优先级,可以使用nice和sched_setscheduler系统调用修改,否则在进程运行时保持不变。


四、普通优先级——normal_prio

normal_prio 表示进程的普通优先级,是根据 static_prio 和 nice 值计算得出来的一个值。进程的 normal_prio 值会随着 nice 值的变化而变化,但不会超出 prio 的取值范围。

基于进程静态优先级和调度策略计算出的优先级。因此如果普通进程和实时进程具有相同的静态优先级,它们的调度策略不同,所以计算而来的普通优先级也不同


五、实时优先级——rt_priority

rt_priority 表示进程的实时优先级,只有实时进程才有这个值。如果进程是实时进程,则 rt_priority 表示了进程的实时优先级,其取值范围是0~99,其中0为最高优先级。


六、小结

总之,进程的优先级值从 static_prio、nice 值的计算到 normal_prio、再到实时优先级的计算,构成了一个完整的优先级体系。prio 值是在进程运行过程中动态变化的,实时反映了进程的运行情况,而 static_prio 和 normal_prio
则用于计算进程在调度队列中的位置,以及在内核的调度过程中选择合适的进程。同时,rt_priority 主要用于实时进程的调度,由于实时进程需要更高效的调度,因此它们有自己的优先级体系。