一、linux进程优先级表示方法
struct task_struct {...int prio, static_prio, normal_prio;unsigned int rt_priority;...
}
字段 | 描述 |
---|---|
static_prio | 用于保存静态优先级, 是进程启动时分配的优先级, 可以通过nice系统调用来进行修改, 取值范围为 100-139;static_prio 的值越小,表明进程的静态优先级越高 |
rt_priority | 用于保存实时优先级,取值范围为0-99。实时优先级(rt_priority)的值越大,意味着进程优先级越高 |
normal_prio | 他的值取决于静态优先级和调度策略 |
prio | 保存进程的动态优先级,内核决定。有些进程超时,内核会自动调高它的动态优先级。调度器最终使用的优先级数值。prio 值的范围是 0 ~ 139,prio 值越小,表明进程的优先级越高 |
1、prio 动态优先级
prio 的值是调度器最终使用的优先级数值,即调度器选择一个进程时实际选择的值。prio 值越小,表明进程的优先级越高。prio 值的取值范围是 0 ~ MAX_PRIO,即 0 ~ 139(包括 0 和 139),根据调度策略的不同,又可以分为两个区间,其中区间 0 ~ 99 的属于实时进程,区间 100 ~139 的为非实时进程,即:
- 当进程为实时进程时, prio 的值由实时优先级值(rt_priority)计算得来:prio = MAX_RT_PRIO - 1 - rt_priority
- 当进程为非实时进程时,prio 的值由静态优先级值(static_prio)得来:prio = static_prio
2、static_prio 静态优先级
静态优先级不会随时间改变,内核不会主动修改它,可以通过nice系统调用来进行修改
/** Convert user-nice values [ -20 ... 0 ... 19 ]* to static priority [ MAX_RT_PRIO..MAX_PRIO-1 ],* and back.*/
#define NICE_TO_PRIO(nice) (MAX_RT_PRIO + (nice) + 20)
#define PRIO_TO_NICE(prio) ((prio) - MAX_RT_PRIO - 20)
#define TASK_NICE(p) PRIO_TO_NICE((p)->static_prio)/** 'User priority' is the nice value converted to something we* can work with better when scaling various scheduler parameters,* it's a [ 0 ... 39 ] range.*/
#define USER_PRIO(p) ((p)-MAX_RT_PRIO)
#define TASK_USER_PRIO(p) USER_PRIO((p)->static_prio)
#define MAX_USER_PRIO (USER_PRIO(MAX_PRIO))/********************* 函数 set_user_nice *****************************/
p->static_prio = NICE_TO_PRIO(nice); // 当有需要时,系统会通过调用 NICE_TO_PRIO() 来修改 static_prio 的值
由上面代码知道,我们可以通过调用 NICE_TO_PRIO(nice) 来修改 static_prio 的值, static_prio 值的计算方法如下:
static_prio = MAX_RT_PRIO + nice +20
MAX_RT_PRIO 的值为100,nice 的范围是 -20 ~ +19,故 static_prio 值的范围是 100 ~ 139。 static_prio 的值越小,表明进程的静态优先级越高。
3、normal_prio 归一化优先级
normal_prio 的值取决于静态优先级和调度策略,可以通过 _setscheduler 函数来设置 normal_prio 的值 。对于非实时进程,normal_prio 的值就等于静态优先级值 static_prio;对于实时进程,normal_prio = MAX_RT_PRIO-1 - p->rt_priority。代码如下:
static inline int normal_prio(struct task_struct *p) // normal_prio 函数
{int prio;if (task_has_rt_policy(p)) // task_has_rt_policy 函数,判断进程是否为实时进程,若为实时进程,则返回1,否则返回0prio = MAX_RT_PRIO-1 - p->rt_priority; // 进程为实时进程,prio 值为实时优先级值做相关运算得到: prio = MAX_RT_PRIO -1 - p->rt_priorityelseprio = __normal_prio(p); // 进程为非实时进程,则 prio 值为静态优先级值,即 prio = p->static_prioreturn prio;
}
4、rt_priority 实时优先级
rt_priority 值的范围是 0 ~ 99,只对实时进程有效。由式子:
prio = MAX_RT_PRIO-1 - p->rt_priority;
知道,rt_priority 值越大,则 prio 值越小,故 实时优先级(rt_priority)的值越大,意味着进程优先级越高。
rt_priority 的值也是取决于调度策略的,可以在 _setscheduler 函数中对 rt_priority 值进行设置。
nice值:
优先级的值越高,优先级越低
nice值是用户可以设置的,最终会影响静态优先级
nice命令:新起一个进程的同时,设置进程优先级
renice命令:修改进程优先级
ref:
https://www.cnblogs.com/linhaostudy/p/9930245.html#autoid-0-0-0
https://www.cnblogs.com/tongye/p/9615625.html