0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何解决Linux进程调度优先级数字混乱的问题?详细实例分析

Linux阅码场 来源:未知 作者:易水寒 2018-10-03 10:24 次阅读

Linux进程的调度优先级数字会在好几个地方出现:内核,用户,top命令。他们各自都有自己的表示法。我们用一个实际的例子来说明,下面在Linux写一个最简单的程序:

编译它运行,把调度策略设置为SCHED_FIFO,优先级设置为50:$ sudo chrt -f50./a.out这个时候我们在top命令里面观察a.out:

我们看到a.out的PR(优先级是)-51,CPU利用率100%。但是从内核的视角上面来看,又会用99减去用户在chrt里面设置的优先级:

上面的MAX_RT_PRIO的值为:

所以上述进程的优先级,在三个不同视角的值分别为:

用户 内核 Top
50 49 -51

咋回事

Linux的RT调度策略和普通进程在调度算法上面有差异,RT的SCHED_FIFO和SCHED_RR采用的是一个bitmap:

每次从第0bit开始往后面搜索第一个有进程ready的bit,然后调度这个优先级上面的进程执行,所以在内核里面,prio数值越小,优先级越高。但是从用户态的API里面,则是数值越大,优先级越高。下面的代码,一个线程通过调用API把自己设置为SCHED_FIFO,优先级50

这个上面的50,对应内核的49。如果我们把优先级设置为51:

这个51,对应内核bitmap上面的48。所以,你会发现,从用户的视角来看,数值变大,优先级变高。上面这2个视角,都不是top命令的视角。对于RT的进程而言,TOP的视角里面的PR= -1 -用户视角譬如,下面用户视角的88,

$ sudo chrt -f 88 ./a.out

对应内核视角的11,对应top视角的-89:

这实在让人有一点晕!!这里还有一个特例,就是用户视角的99(内核bitmap视角的0),显示为top命令的RT:

这说明一点,只有最高优先级的RT进程,才在top里面显示为rt。

普通的呢?

普通的讲nice的人相对来说比较简单,我们更关注它的nice值,-20~19之间,nice越低,优先级越高,权重越大,在CFS的红黑树左边的机会大。

你发现.nice为5的进程,在top命令显示PR是25。下面我们看nice是-5的:

它显示的是PR=15。由此大家可以发现规律,对于普通的采用CFS策略的NORMAL进程,top里面的PR=20+NICE

在一起

总结一下,4个例子

用户 内核 Top
RT 50 49 (99-50) -51 (-1-50)
RT 99 0 rt
NICE 5 25
NICE -5 15

由此发现,在top里面,RT策略的PR都显示为负数;最高优先级的RT,显示为rt。top命令里面也是,数字越小,优先级越高。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 内核
    +关注

    关注

    3

    文章

    1309

    浏览量

    39837
  • Linux
    +关注

    关注

    87

    文章

    10986

    浏览量

    206710
  • 编译
    +关注

    关注

    0

    文章

    613

    浏览量

    32370

原文标题:宋宝华: 关于Linux进程优先级数字混乱的彻底澄清

文章出处:【微信号:LinuxDev,微信公众号:Linux阅码场】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    嵌入式技术中如何定义进程优先级

    静态优先级是所有相关优先级的计算的起点,要么继承自父进程,要么用户空间自行设定。一旦修改了静态优先级,那么normal priority和动态优先级
    发表于 09-18 16:08 1384次阅读
    嵌入式技术中如何定义<b class='flag-5'>进程</b><b class='flag-5'>优先级</b>

    基于优先级抢占系统的QNX调度算法

    调度算法,是基于优先级的。QNX的线程优先级,是一个0-255的数字数字越大优先级越高。所以,
    发表于 10-31 09:17 559次阅读

    Linux内核进程管理与调度:策略优化与实践分析

    今天给大家上点硬货,关于Linux进程管理和调度是学习和理解Linux的必学知识。为协调多个进程 "同时" 运行,现代操作系统通常使用
    发表于 05-08 09:42 592次阅读
    <b class='flag-5'>Linux</b>内核<b class='flag-5'>进程</b>管理与<b class='flag-5'>调度</b>:策略优化与实践<b class='flag-5'>分析</b>

    Linux系统调度是实现特性的关键部分

    每个调度类都有自身的优先级Linux调度管理基础代码会遍历在内核中注册了的调度类,选择高优先级
    发表于 07-05 07:05

    干货分享:基于嵌入式Linux进程调度实现方法

    可运行队列中。Linux进程调度采用了动态优先级 和权值调控的方法,既可实现上述三种调度策略,又能保证实时
    发表于 12-10 14:17

    鸿蒙内核源码分析(调度队列篇):进程和Task的就绪队列对调度的作用

    OsTaskPriQueueTop查最高优先级任务OsDequeEmptySchedMap进程出列[td]OsGetTopTask获取被调度选择的task鸿蒙内核进程和线程各有32个就
    发表于 11-23 11:09

    Linux 2.6进程调度

    分析了与Linux 2.6 进程调度密切相关的一些重要数据结构,详细描述了进程
    发表于 06-13 10:13 11次下载

    嵌入式系统优先级反转问题的分析

    摘要: 本文介绍了嵌入式系统任务调度优先级反转的一个实例。通过实例的讨论对嵌入式系统优先级反转有一个更深入的了解,有助于在编程
    发表于 03-11 12:18 852次阅读
    嵌入式系统<b class='flag-5'>优先级</b>反转问题的<b class='flag-5'>分析</b>

    如何更改 Linux 的 I/O 调度

    Linux 的 I/O 调度器是一个以块式 I/O 访问存储卷的进程,有时也叫磁盘调度器。Linux I/O
    发表于 05-15 15:54 722次阅读
    如何更改 <b class='flag-5'>Linux</b> 的 I/O <b class='flag-5'>调度</b>器

    Linux 进程调度浅析

    优先级,如果有多个进程同时处于可执行状态,那么谁优先级高谁就去执行,没有什么好纠结的了。那么,进程优先级该如何确定呢?有两种方式:由用户
    发表于 04-02 14:40 253次阅读

    嵌入式Linux实时进程调度算法改进

    系统调度算法应综合考虑进程的价值和截止两个概念,以保证实时进程在截止期内尽可能多地完成,在这里提出新的调度算法,改进Linux的实时性。即:
    发表于 04-02 14:43 316次阅读

    linux进程调度浅析

    。(下面会说到)linux内核将进程分成两个级别:普通进程和实时进程。实时进程优先级都高于普通
    发表于 04-02 14:45 266次阅读

    Linux阅码场原创精华文章分享,你值得拥有

    技术的前世今生之前世 郭健:Linux进程调度技术的前世今生之今生 宋宝华:是谁关闭了Linux抢占,而抢占又关闭了谁? 论打通Linux
    的头像 发表于 10-10 16:28 2523次阅读

    鸿蒙内核源码:32级优先级进程和线程调度

    先看四个宏定义,进程和线程(线程就是任务)最高和最低优先级定义,[0,31]区间,即32级,优先级用于调度,CPU根据这个来决定先运行哪个进程
    的头像 发表于 04-24 11:18 1558次阅读

    uC/OS-II学习笔记——优先级反转与优先级继承机制

    优先级反转,是指某同步资源被较低优先级进程/线程所拥有,较高优先级进程/线程竞争该同步资源未获得该资源,而使得较高
    发表于 02-09 10:33 2次下载
    uC/OS-II学习笔记——<b class='flag-5'>优先级</b>反转与<b class='flag-5'>优先级</b>继承机制