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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

有趣的css - 第一个字符串自动生成文字图标

在设计 app 界面的时候&#xff0c;要展示一部分最新的资讯入口&#xff0c;然后出了一张下面的 UI 稿。 UI稿截图如下&#xff1a; 列表设计比较简单&#xff0c;就是列表前面的圆形图标这块&#xff0c;我个人觉得还是有点意思的。 一般的话&#xff0c;大概率都是用js限制…

MYSQL基本查询(CURD:创建、读取、更新、删除)

文章目录 前言一、Create1.全列插入2.指定列插入3.插入否则更新4.替换 二、Retrieve1.SELECT列2.WHERE条件3.结果排序4.筛选分页结果 三、Update四、Delete1.删除数据2.截断表 五、插入查询结果六、聚合函数 前言 操作关系型数据库的编程语言&#xff0c;定义了一套操作关系型…

OJ_糖果分享游戏

题干 c实现 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<vector> using namespace std;void ShareCandy(vector<int>& student) {int size student.size();vector<int> share(size); //保存每个同学交换前&#xff0c;糖果数量…

[机器学习]简单线性回归——梯度下降法

一.梯度下降法概念 2.代码实现 # 0. 引入依赖 import numpy as np import matplotlib.pyplot as plt# 1. 导入数据&#xff08;data.csv&#xff09; points np.genfromtxt(data.csv, delimiter,) points[0,0]# 提取points中的两列数据&#xff0c;分别作为x&#xff0c;y …

【hcie-cloud】【23】容器编排【k8s】【Kubernetes常用工作负载、Kubernetes调度器简介、Helm简介、缩略词】【下】

文章目录 单机容器面临的问题、Kubernetes介绍与安装、Kubernetes对象的基本操作、Kubernetes YAML文件编写基础Kubernetes常用工作负载Kubernetes常用工作负载简介创建一个无状态nginx集群无状态工作负载Deployment说明无状态工作负载Deployment常见操作创建一个有状态的MySQL…

单链表实现通讯录(增删查改)

前言 之前写了很多次通讯录&#xff0c;一次比一次复杂&#xff0c;从静态到动态&#xff0c;再到文件操作&#xff0c;再到顺序表&#xff0c;今天要好好复习一下单链表&#xff0c;于是乎干脆用单链表再写一遍。 首先我们之前已经用单链表写过他的增删查改了&#xff0c;于…

1.28回溯(中等)

目录 1.格雷编码 2. 复原 IP 地址 3. 火柴拼正方形 1.格雷编码 n 位格雷码序列 是一个由 2n 个整数组成的序列&#xff0c;其中&#xff1a; 每个整数都在范围 [0, 2n - 1] 内&#xff08;含 0 和 2n - 1&#xff09;第一个整数是 0一个整数在序列中出现 不超过一次每对 相…

备战蓝桥杯----贪心算法(二进制)

已经差不多掌握了贪心的基本思想&#xff0c;让我们看几道比较趣的题吧&#xff01; 先来个比较有意思的题热热身&#xff1a; 法1.我们可以先把l,r化成二进制的形式。 然后分俩种情况&#xff1a; &#xff08;1&#xff09;若他们位数不一样并且位数高的全为1&#xff0c;…

在Shopee菲律宾站点进行选品时的策略

随着电子商务的快速发展&#xff0c;越来越多的卖家开始将目光投向了海外市场。作为东南亚地区最大的电商平台之一&#xff0c;Shopee菲律宾站点吸引了众多卖家的关注。然而&#xff0c;在这个竞争激烈的市场上&#xff0c;卖家需要制定一系列的策略&#xff0c;才能在选品中脱…

arcgis 批量删除字段

一、打开ArcToolbox-数据管理工具-字段-删除字段。 二、在输入表中选择要删除字段的要素&#xff0c;在删除字段栏中选择要删除的字段&#xff0c;点击确认即可。

git配置用户名和邮箱

1.git 1.配置用户名和邮箱 2.git初体验 git init 初始化git仓库 管理项目让git管理你的本次代码变更 git add .git commit -m “你完成的功能” 后续如果新增/修改/删除代码&#xff0c; 完成新功能时 重复2 3.查看日志 1.git log 4.版本回退 1.查看提交的版本记录 git l…

UE5.1_常用节点说明(经常忘记怎么用?)(常改)

UE5.1_常用节点说明&#xff08;经常忘记怎么用&#xff1f;&#xff09;&#xff08;常改&#xff09; 1. Gate——门节点。只有当门是Open状态才会执行Exit后面的代码。 Open开门&#xff1b;Close关门&#xff1b;Toggle开门和关门交替。 2. 关于控制ArmLength即控制相机前…

基于saltstack开发自动化开通主机防火墙策略工具

一、前言 企业安全防护策略中会要求操作系统开启防火墙&#xff0c;开启iptables防火墙后&#xff0c;对于业务网络访问意味着要经常去变更调整iptables防火墙策略。如果是管理几台服务器&#xff0c;手工登录操作下还能接受。但在实际大型IT架构中&#xff0c;可能涉及到的服…

【JavaScript基础入门】05 JavaScript基础语法(三)

JavaScript基础语法&#xff08;三&#xff09; 目录 JavaScript基础语法&#xff08;三&#xff09;数组概述数组语法多维数组 操作数组修改数组获取数组长度数组和字符串之间的转换添加和删除数组项 Null 和 Undefined字符串连接字符串字符串转换获取字符串的长度在字符串中查…

后台管理系统模板搭建/项目配置

1 项目初始化 一个项目要有统一的规范&#xff0c;需要使用eslintstylelintprettier来对我们的代码质量做检测和修复&#xff0c;需要使用husky来做commit拦截&#xff0c;需要使用commitlint来统一提交规范&#xff0c;需要使用preinstall来统一包管理工具。 1.1 环境准备 1…

合合信息技术能力

体验中心网址&#xff1a; https://www.textin.com/TextIn体验中心 - 在线免费体验中心https://www.textin.com/ 合合技术团队CSDN&#xff1a; 合合技术团队的博客_CSDN博客-基于深度学习的文本检测与识别技术白皮书,【通用文本信息抽取技术白皮书】,【技术应用】领域博主 …

xss靶场实战

靶场链接&#xff1a;https://pan.baidu.com/s/1ors60QJujcmIZPf3iU3SmA?pwd4mg4 提取码&#xff1a;4mg4 XSS漏洞原理 XSS又叫CSS&#xff08;Cross Site Script&#xff09;&#xff0c;跨站脚本攻击。因为与html中的css样式同&#xff0c;所以称之为XSS。在OWASP top 1…

Python Tornado 实现SSE服务端主动推送方案

一、SSE 服务端消息推送 SSE 是 Server-Sent Events 的简称&#xff0c; 是一种服务器端到客户端(浏览器)的单项消息推送。对应的浏览器端实现 Event Source 接口被制定为HTML5 的一部分。相比于 WebSocket&#xff0c;服务器端和客户端工作量都要小很多、简单很多&#xff0c…

深度强化学习(王树森)笔记05

深度强化学习&#xff08;DRL&#xff09; 本文是学习笔记&#xff0c;如有侵权&#xff0c;请联系删除。本文在ChatGPT辅助下完成。 参考链接 Deep Reinforcement Learning官方链接&#xff1a;https://github.com/wangshusen/DRL 源代码链接&#xff1a;https://github.c…

政安晨的机器学习笔记——基于Ubuntu系统的Miniconda安装Jupyter Notebook

一、准备工作 Miniconda的安装请参考我的另一篇博客文章&#xff1a; 实例讲解深度学习工具PyTorch在Ubuntu系统上的安装入门&#xff08;基于Miniconda&#xff09;&#xff08;非常详细&#xff09;https://blog.csdn.net/snowdenkeke/article/details/135887509 这里…