Linux的优先级说明

news2025/1/12 1:33:22

一、背景

在工作中,不少同学对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.coloradmin.cn/o/1417641.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

美化背景(拼图小游戏)

package Puzzlegame.com.wxj.ui;import javax.swing.*; import javax.swing.border.BevelBorder; import java.util.Random;public class GameJframe extends JFrame { //游戏主界面 //创建一个二维数组//目的&#xff1a;管理数据//加载图片的时候&#xff0c;会根据二维数组中…

STM32读取MPU6050数据并通过角度值控制舵机运动(STM32、GY-521 MPU6050、SG90舵机、MG946舵机)

通过STM32F103C8T6读取MPU6050数据控制舵机运动&#xff08;STM32、GY-521 MPU6050、SG90舵机、MG946舵机&#xff09; 最终现象一、MPU6050数据读取二、舵机控制原理①什么是PWM&#xff1f;②STM32F103C8T6如何生成PWM&#xff1f;③控制舵机需要什么样的PWM波&#xff1f; 三…

看图说话:Git图谱解读

很多新加入公司的同学在使用Git各类客户端管理代码的过程中对于Git图谱解读不太理解&#xff0c;我们常用的Git客户端是SourceTree&#xff0c;配合P4Merge进行冲突解决基本可以满足日常工作大部分需要。不同的Git客户端工具对图谱展示会有些许差异&#xff0c;以下是SourceTre…

jenkins对接K8S

创建连接K8S的凭据 查看需要使用到的命名空间 [rootk8s ~]# kubectl get ns |grep arts-system arts-system Active 16d创建service accounts [rootk8s ~]# kubectl create sa jenkins-k8s -n arts-system serviceaccount/jenkins-k8s created [rootk8s ~]# kubectl…

使用vscode查bug

具体操作 修改CMakeList.txt # set(CMAKE_BUILD_TYPE "Release")//注释Release模式 set(CMAKE_BUILD_TYPE "Debug")//设置为Debug模式 # set(CMAKE_CXX_FLAGS_RELEASE "-O3 -Wall -g")//注释*这行代码是用来设置 CMake 构建系统中 Release 模式…

Go Zero微服务个人探究之路(十)实战走通微服务前台请求调用的一套流程model->rpc微服务->apiHTTP调用

前言 Go语言凭借低占用&#xff0c;高并发等优秀特性成为后台编程语言的新星&#xff0c;GoZero框架由七牛云技术副总裁团队编写&#xff0c;目前已经成为Go微服务框架里star数量最多的框架 本文记录讲述笔者一步步走通前台向后台发出请求&#xff0c;后台api调用rpc服务的相…

verilog编程之乘法器的实现

知识储备 首先来回顾一下乘法是如何在计算机中实现的。 假设现在有两个32位带符号定点整数x和y&#xff0c;我们现在要让x和y相乘&#xff0c;然后把乘积存放在z中&#xff0c;大家知道&#xff0c;两个32位数相乘&#xff0c;结果不会超过64位&#xff0c;因此z的长度应该为64…

总结6(循环(for))

循环 定义&#xff1a; 某些代码会被重复执行 分类&#xff1a; for 1.格式 for(1; 2; 3) 语句A; 2.执行的流程&#xff08;1,2,A,3 2,A,3 2,A,3..........&#xff09; 单个for循环的使用 多个for循环的嵌套使用 1). for&#xff08;1; 2; 3&#xff09; for&#xff0…

用通俗易懂的方式讲解:一种全新的大模型检索增强生成方法

如何使大型语言模型更加事实、正确和可靠&#xff1f; 检索增强生成&#xff08;RAG&#xff09;是一种有效的方法&#xff0c;可以缓解大型语言模型的基本局限性&#xff0c;如幻觉和缺乏最新知识。 然而&#xff0c;如果您曾尝试过RAG&#xff0c;您会同意我所说的RAG易于原…

【每日一题】4.LeetCode——环形链表

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &#x1f64f;小杨水平有限&#xff0c;欢迎各位大佬指点&…

RK3568平台开发系列讲解(Linux系统篇)互斥锁使用

🚀返回专栏总目录 文章目录 一、互斥锁API二、使用互斥锁的步骤三、互斥锁使用规则四、使用案例沉淀、分享、成长,让自己和他人都能有所收获!😄 一、互斥锁API 在Linux中,你可以使用互斥锁(Mutex)来实现多线程或多进程之间的互斥访问。互斥锁用于确保在同一时间只有一…

24. 两两交换链表中的节点(力扣LeetCode)

文章目录 24. 两两交换链表中的节点题目描述解题思路只使用一个临时节点使用两个临时节点 24. 两两交换链表中的节点 题目描述 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff0…

STM32学习笔记(二) —— 调试串口

我们在调试程序时&#xff0c;经常会使用串口打印相关的调试信息&#xff0c;但是单片机串口不能直接与 PC 端的 USB 接口通讯&#xff0c;需要用到一个USB转串口的芯片来充当翻译的角色。我们使用的开发板上有这个芯片&#xff0c;所以在打印调试信息的时候直接使用USB线连接开…

每日一题——LeetCode1365.有多少小于当前数字的数字

方法一 暴力循环 对于数组里的没一个元素都遍历一遍看有多少元素小于当前元素 var smallerNumbersThanCurrent function(nums) {let n nums.length;let ret [];for (let i 0; i < n; i) {let count 0;for (let j 0; j < n; j) {if (nums[j] < nums[i]) {count…

【C语言】数组的应用:三子棋游戏

由于代码较长&#xff0c;为了增加可读性&#xff0c;我们把代码分别写到game.h&#xff0c;game.c&#xff0c;test.c&#xff0c;里面&#xff0c;其中game.h用来声明函数&#xff0c;实现函数功能的代码在game.c&#xff0c;测试游戏的代码在test.c 为了方便后续的更改&…

qt学习:http+访问百度智能云api实现车牌识别

目录 登录到百度智能云&#xff0c;找到文字识别 完成操作指引 开通 查看车牌识别的api文档 ​编辑​编辑 查看自己应用的api key 查看回应的数据格式 编程步骤 ui界面编辑 添加模块&#xff0c;头文件和定义变量 新建两个类&#xff0c;一个图像Image类&#xff0c…

深度学习之卷积神经网络进阶版

上一讲我们介绍了卷积神经网络和多层感知机&#xff0c;也就是全链接网络。他们在网络架构上是串行的结构&#xff0c;也就是在每一层与每一层之间&#xff0c;前面一层的输出&#xff0c;是后面一层的输入。 在神经网络里面&#xff0c;我们可能会有更加复杂的结构&#xff0…

Pycharm连接云算力远程服务器(AutoDL)训练深度学习模型全过程

前言&#xff1a;在上一篇windows搭建深度学习环境中&#xff0c;我试图使用笔记本联想小新air14的mx350显卡训练一个图像检测的深度学习模型&#xff0c;但是训练时长大概需要几天时间远超我的预期&#xff0c;所以我便选择租用GPU进行训练&#xff0c;在对多家平台对比后找到…

[BT]小迪安全2023学习笔记(第19天:Web开发-.NET项目)

第19天 名词解释 .NET 是一种由Microsoft开发的软件框架&#xff0c;用于构建和运行Windows操作系统上的应用程序。它提供了一个广泛的工具和库集合&#xff0c;支持多种编程语言&#xff0c;包括C#、VB.NET、F#等。.NET的主要目标是提供一种一致的开发平台&#xff0c;使开发…

《HTML 简易速速上手小册》第1章:HTML 入门(2024 最新版)

文章目录 1.1 HTML 简介与历史&#xff08;&#x1f609;&#x1f310;&#x1f47d;踏上神奇的网页编程之旅&#xff09;1.1.1 从过去到现在的华丽蜕变1.1.2 市场需求 —— HTML的黄金时代1.1.3 企业中的实际应用 —— 不只是个网页1.1.4 职业前景 —— 未来属于你 1.2 基本 H…