Linux的优先级说明

一、背景

在工作中,不少同学对nice,priority,schedue策略,实时优先级,普通进程优先级的概念混淆,导致最后的代码可能引入bug,本文将统一进行说明,部分内容参考网络大佬的文章 ,文末标记引用来源。

二、优先级的设定 API及关键结构体

设置调度策略,在linux上,FIFO和RR都是RT 调度策略

#include <pthread.h>int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);
int pthread_attr_getschedpolicy(const pthread_attr_t *attr, int *policy);//policy: SCHED_FIFO, SCHED_RR, and SCHED_OTHER

设置线程优先级相关API

#include <pthread.h>int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param *param);
int pthread_attr_getschedparam(const pthread_attr_t *attr, struct sched_param *param);struct sched_param {int sched_priority;     /* Scheduling priority */
};

一个进程结构体中,优先级相关字段

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

这些优先级值的关系可以参考后面说明

三、Linux 优先级调度策略及优先级值的含义

不同调度策略的说明:

  1. SCHED_OTHER 分时调度策略 (normal thread
  2. SCHED_FIFO 实时调度策略:先到先得,一旦占用cpu则一直运行,直到有更高优先级任务到达或自己放弃 (RT thread
  3. SCHED_RR 实时调度策略:时间片轮转。当进程的时间片用完,系统将重新分配时间片,并置于就绪队列尾。放在队列尾保证了所有具有相同优先级的RR任务的调度公平(RT thread

不同优先级关系的说明

动图封面

详细描述可以参考文末《Linux调度器:进程优先级》

简单的说,先要区分RT 优先级和normal 优先级:

用户空间下

RT 优先级:1~99 (值越大,优先级越高)

normal 优先级: nice 值从 -20(优先级最高) ~ 19(优先级最低) ,nice值是越小优先级越高,默认为0

内核空间中(会对normal和rt 线程优先级 nice值做归一化,对内核来讲都是一个个的task_struct,归一化有利于后面调度策略的计算和选择)

从用户空间的rt优先级值和normal线程的nice值看到,它们的定义似乎是相反的,一个越大代表优先级越高,一个越小优先级越高,怎么归一化呢,实际上内核中是用99 - rt 值进行了反转

normal_priority RT线程优先级:0~99 (注意这里的0~99 和用户空间真实设定的值是相反的关系,用户空间设置rt优先级99,这里就是0)

normal_priority normal线程优先级:100~139 (nice值为 -20,代表这里的100)

nice值priority内核空间归一化的优先级
普通线程-20~190100~139
RT线程/1~9998~0 (图实际有点小错误,99 不可到达)

四、工具显示的优先级差异

常见的查看优先级方法:

top

ps -el

atop -s

实验一、一个普通进程下不同工具的显示结果

利用工具chrt来设置调度策略及优先级,如:sudo chrt -r 50 ./hello ---- 设置 SCHED_RR,优先级为50

top

ps -el

F S   UID     PID    PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 R     0    5352    5351 95   9   - -   660 -      pts/2    00:18:38 hello

atop -s

实验二、一个RT进程不同工具的显示结果

利用nice来调整,如:sudo nice -n 5 ./hello ---设置普通进程 nice值为5

top

ps -el

F S   UID     PID    PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 R     0    6917    6916 99  85   5 -   660 -      pts/2    00:00:07 hello

atop -s

这些工具显示同一个进程的优先级数值却大不相同,这些值怎么和API 设置的值对应起来?这些值只是工具计算的方式不同导致的,其中和当前内核/userspace设置比较匹配的是atop;

top 在普通进程default PR值是20, 根据nice值做调整,PR取值范围在0~39, 但是在表示rt thread时,全部都是负值, 为-1-rt, 从 -2 ~ -99(这里你会有疑问,rt的值是1~99,还有一个-100怎么没有?实际当rt=99时,这里的PR会显示rt)

ps -el 它的PRI 值取值范围是 -40 ~99 (和内核归一化的值0~139 有-40的差值), 它的值实际和内核归一化的含义一致,只是有-40 的差值;

atop -s 的取值 PRI就是内核归一化的值, RTPR 在线程为rt线程时,显示为用户api设置的值,当为normal线程时为0;

五、总结

linux 下不同工具显示的优先级数值,不同的展示方式给开发者带来了困扰,再叠加用户空间设置优先级值,调度策略,以及内核侧又重新进行了归一化操作,部分工具显示的内核归一化的值,导致这些概念数值困扰了开发者,这里将工具的差异做了一个总结:

工具PRNIPRINICERTPRPOLI
RT线程top-1 - rt0无意义////
normaltop20 + nice值nice值////
RT线程ps -el/无意义99 - rt - 40///
normalps -el/nice值120 + nice -40///
RT线程atop -s//99-rtrtrr/fifo
normalatop -s//120+nicenice值0normal

上面表中的rt值和nice值均为用户空间设置的值

参考资源:

Linux调度器:进程优先级

articles/20230802-linux-sched-api.md · aosp-riscv/working-group - Gitee.com

https://mp.weixin.qq.com/s/44Gamu17Vkl77OGV2KkRmQ

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/438034.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot不同的@Mapping使用

文章目录 一、介绍二、使用 一、介绍 一般Mapping类注解在Spring框架中用于将HTTP请求映射到对应的处理器方法。它们各自对应于不同类型的HTTP方法&#xff0c;主要用于RESTful Web服务中。以下是每个注解的作用&#xff1a; GetMapping: 用于映射HTTP GET请求到处理器方法。通…

第15章 Java网络编程

第15章 网络编程 学习目标 了解网络通信协议参考模型 能够理解IP地址和端口号的作用 能够在程序中表示IP地址和端口号 能够说出TCP和UDP网络协议的区别 了解基于Socket的TCP网络编程 了解基于Socket的UDP网络编程 15.1 软件结构 C/S结构 &#xff1a;全称为Client/Server结构…

智能加湿器数据分析:预计2025年市场规模将达到164.18亿元

随着经济的发展和人民生活水平的提高&#xff0c;人们对生活质量和健康的要求愈来愈高。空气加湿器慢慢的走进家庭当中&#xff0c;预计2023年中国线上超声波加湿器零售额同比下降4.9%;线上纯净型加湿器零售额同比增长44.8%。随着社会科技的不断进步和居民消费水平的不断提高&a…

云微呼电话机器人:现代通讯的智能化助手

在当今数字化时代&#xff0c;电话机器人已经成为了企业通讯和客户服务领域的重要工具。这些智能系统通过自动化拨号和语音交互技术&#xff0c;为企业提供了高效、智能的电话沟通解决方案。本文将深入探讨电话机器人的应用范围、优势以及未来发展的前景。 应用范围&#xff1…

洗地机哪个牌子好?2024洗地机推荐

洗地机作为一种几乎替代了传统无线吸尘器的清洁工具&#xff0c;近年来在市场上迅速崛起。其优越的清洁效果和智能化设计使其成为许多家庭不可或缺的家电之一。在短短的几年时间里&#xff0c;市场上涌现出了各种各样的品牌和型号&#xff0c;价格也从几百元到数千元不等&#…

Java项目:基于SSM框架实现的高校毕业生就业管理系统(ssm+B/S架构+源码+数据库+毕业论文)

一、项目简介 本项目是一套ssm817基于SSM框架实现的高校毕业生就业管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调…

ThreadPool 模式设计与流程演示

一、背景技术 系统线程是一种稀缺资源且创建一个线程开销较大&#xff0c;频繁地创建和销毁线程反而可能使得系统在高并发时性能急剧下降。如果无限制地创建线程&#xff0c;不仅会消耗系统资源&#xff0c;还会降低系统的稳定性&#xff0c;甚至造成系统崩溃。 线程池的使用…

(二十一)Flask之上下文管理第二篇(细细扣一遍源码)

每篇前言&#xff1a; &#x1f3c6;&#x1f3c6;作者介绍&#xff1a;【孤寒者】—CSDN全栈领域优质创作者、HDZ核心组成员、华为云享专家Python全栈领域博主、CSDN原力计划作者 &#x1f525;&#x1f525;本文已收录于Flask框架从入门到实战专栏&#xff1a;《Flask框架从入…

postgresql慢查询排查和复现

postgresql慢查询排查和复现 一. 介绍一张表&#xff1a;pg_stat_activity pg_stat_activity 是 PostgreSQL 中一个非常有用的系统视图&#xff0c;提供了有关当前数据库连接和活动查询的信息。通过查询这个视图&#xff0c;你可以获取有关正在执行的查询、连接的用户、进程 …

Demo: 前端生成条形码并打印

前端生成条形码并打印 安装依赖&#xff1a; npm i print-js // 打印 npm i jsbarcode // 生成条形码 <template><div id"printContent" style"display: none;"><div id"elTable"><div class"name">名称&…

微信开放平台第三方授权(第二篇)

1.授权步骤开发 参考牛人的文档&#xff0c;按照步骤集成。 配置微信第三方平台中的授权事件接收URL&#xff1a;http://my-domain/notify/receive_ticket配置微信第三方平台中的公众号消息与事件接收URL http://my-domain/notify/APPID/callback首次启动后需要 等待收到 微信推…

VUE3动漫影视视频网站模板源码

文章目录 1.视频设计来源1.1 主界面1.2 动漫、电视剧、电影视频界面1.3 播放视频界面1.4 娱乐前线新闻界面1.5 关于我们界面 2.效果和源码2.1 动态效果2.2 源码结构 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/deta…