您的位置:首页 > 教育 > 锐评 > linux进程优先级

linux进程优先级

2025/1/15 12:53:44 来源:https://blog.csdn.net/wwwlyj123321/article/details/142299403  浏览:    关键词:linux进程优先级

一、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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com