当前位置: 首页 > news >正文

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


http://www.mrgr.cn/news/27977.html

相关文章:

  • 多态(下)【C++】
  • Python酷库之旅-第三方库Pandas(117)
  • Python--常见的数据格式转换
  • 数据中台过时了?是否需要升级到数据飞轮?
  • 【字幕】恋上数据结构与算法之013动态数组01线性表
  • JavaScript 函数式编程之函子相关代码分享
  • pip install、yum install和conda install三者技术区分
  • jwt报错,位置:找不到符号 parseClaimsJws(java.lang.String)
  • 并发容器(Map、List、Set)实战及其原理分析
  • 在javascript中对象的键为什么只能是字符串或Symbol?
  • C++速通LeetCode简单第17题-爬楼梯
  • 【JS逆向分析】某药品网站价格(Price)解密
  • NFS在docker环境下无法写入文件的问题解决、NFS文件共享查看挂载客户端列表、mount监控及使用script命令保存屏幕终端输出内容
  • TS.38-2
  • 基于yolov8的无人机检测系统python源码+onnx模型+评估指标曲线+精美GUI界面
  • THREE.js:网页上的3D世界构建者
  • AIGC文本生成
  • Luogu P1874 快速求和 (线性DP)
  • 【MySQL学习】基础指令全解:构建你的数据库技能
  • MySQL之约束