【Linux】-进程概念之进程优先级(如何去进行调度以及进程切换),还不进来看看??
💖作者:小树苗渴望变成参天大树🎈
🎉作者宣言:认真写好每一篇博客💤
🎊作者gitee:gitee✨
💞作者专栏:C语言,数据结构初阶,Linux,C++ 动态规划算法🎄
如 果 你 喜 欢 作 者 的 文 章 ,就 给 作 者 点 点 关 注 吧!
文章目录
- 前言
- 一、进程优先级
- 1.1查看进程优先级
- 1.2怎么根据优先级去开展调度
- 1.3进程的并发是怎么做到的??
- 二、总结
前言
task_ struct内容分类
标示符: 描述本进程的唯一标示符,用来区别其他进程。
状态: 任务状态,退出代码,退出信号等。
优先级: 相对于其他进程的优先级。
程序计数器: 程序中即将被执行的下一条指令的地址。
内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
上下文数据: 进程执行时处理器的寄存器中的数据。
I/O状态信息: 包括显示的I/O请求分配给进程的I/O设备和被进程使用的文件列表。
记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
其他信息
上面红色部分的属性再后面都会介绍到。
一、进程优先级
我先从下面两个问题带大家先了解进程的优先级:
是什么: 权限和优先级是一样吗??权限是能与不能,而优先级是在能的基础上,对于资源谁先访问谁后访问
为什么: 因为我们的cpu只有一个,每次只能运行一个进程,而不是每个进程都有一个cpu,所以cpu的资源是有限的,注定的了进程之间是相互竞争的(竞争性),所以操作系统为了保证良性竞争,确认每个进程的优先级,就相当于排队,不能乱按顺序去执行
这都是由调度器去做,所以好的调度算法才能保证更好的良性竞争,但调度算法不是特别好,如果有的进程长时间得不到cpu资源,导致该进程的代码长时间得不到推进----该进程的饥饿问题(在windows经常会出现这种情况,表现为程序卡死了,然后弹出来一个框未响应)
一会会大致介绍一下Linux中的调度是怎么去做的
1.1查看进程优先级
我们先来写一个程序:
#include<unistd.h>#include<stdio.h>int main(){while(1){printf("我是一个进程\n");sleep(1);}return 0;}
我们使用ps -l查看,如果你是在其他窗口查看时候ps -al

我们只需要看其中两个属性PRI和NI,他两个代表优先级,其余的不重要,顶多带大家在了解一下UID,他是唯一标识用户的就是账号,使用ls -aln去查看:

接下来博主在来好好介绍一下PRI和NI这两个属性
PRI :代表这个进程可被执行的优先级,其值越小越早被执行
NI :代表这个进程的nice值
PRI and NI
- PRI也还是比较好理解的,即进程的优先级,或者通俗点说就是程序被CPU执行的先后顺序,此值越小进程的优先级别越高
- 那NI呢?就是我们所要说的nice值了,其表示进程可被执行的优先级的修正数值,PRI值越小越快被执行,那么加入nice值后,将会使得PRI变为:
PRI(new)=PRI(old)+nice,这样,当nice值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行所以,调整进程优先级,在Linux下,就是调整进程nice值,nice其取值范围是[-20,19],一共40个级别
按照上面说的我们的PRI值越小,优先级越高,那我们如果我们想要的进程优先级改的特别小,那cpu是不是就可以一直给我们的程序跑了,但Linux操作系统不允许这样做,这样就不能保证其他进程的公平性,但是万一有的时候必须修改一些优先级,所以才有有了我们的nice,给你一个范围,在这个范围里面可以随便去修改(但是不建议修改),我们看到我们一般程序的默认优先级是80,加上nice就是[60,99]
PRI vs NI
需要强调一点的是,进程的nice值不是进程的优先级,他们不是一个概念,但是进程nice值会影响到进程的优先级变化。
可以理解nice值是进程优先级的修正数据
接下来也是通过修改nice值来修改优先级
接下面我就尝试带大家来修改一下优先级:
用top命令更改已存在进程的nice:
top
进入top后按“r”–>输入进程PID–>输入nice值
top就像当任务管理器,使用普通用户去修改优先级是不行的,需要使用root用户

我们如果修改的nice值小于-20,也会变成-20来处理,修改的值大于19也会按照19来处理,第二次修改nice值,会从起始的默认值开始算,不会按照第一次修改的PRI开始算。
我们最好不要去修改我们的nice值,因为没必要,Linux上的调度已经比较公平了,接下来在来理解一下进程优先级的概念:
- cpu资源分配的先后顺序,就是指进程的优先权(priority)。
- 优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可能改善系统性能。
- 还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能
1.2怎么根据优先级去开展调度
我们调度的前提是在运行态的时候,时刻准备着被调度,所以肯定是在运行队列里面,接下来我们来看看运行队列是怎么去做的:

看到这里大家应该知道我们调度器大致是怎么去调度的并且根据优先级去优先调度的,此时还有一个小问题就是怎么判断数组遍历结束,是不是就是判断数组是不是为空,此时就需要使用位图的知识,这里简单提一下,就是每个数组下标对应一个比特位,当有元素,比特位为1,不然就为0,所以我们再runqueue队列里面应该还有一个属性叫
bitmap[40],存放比特位的,当位图的值为0就说明数组为空了,可以进行交换了。这种方法也叫我们Linux上的大o(1)调度算法
还有其他概念:
竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级
独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰
并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行
并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发
前面两个概念相信大家已经有所了解,第三个并行,就是再多个物理cpu上跑的进程叫做并行,我们现在使用的电脑几乎都是只有一个cpu,而且并行很好理解,接下来我们就好好的理解一下并发
1.3进程的并发是怎么做到的??
并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发
我们再上一篇介绍运行态的时候画的图上说过什么是并发,大致意思就是再运行队列的进程会不止一次的从cpu拿上拿下(时间片的概念),就会导致运行队列上的进程会在一定的时间内将运行队列的所有进程都跑上一遍,把这个过程叫做并行。这就叫基于时间片基于进程切换的调度算法
接下会带大家理解计算机是怎么做到跑一次进程下次再跑,从上次结束的位置继续运行的??(进程切换是怎么做的)
小故事时间:
故事一、
我们再大学的时候不知道大家有没有听到过部队到学校里面征兵,而你是一个梦想当兵的人,由于当年没有考好导致上一个普通的学校,这次不对征兵你势必要去当兵,刚好不对也选中了你,至此你高兴的来到了宿舍和自己的室友说,我去当兵了,明年再见,什么都没干,就直接跟部队走了,结果你一年之后就回来了,然后准备完成剩下来的学业,结果你发现你早就被学校开除了,而且对应的宿舍已经不是你的了。你惊讶说到,我是去当兵了,不是退学了,结果学校领导跟你说,你走的时候又没有告诉我你去当兵,我们发现你每次上课和考试都不来,直接给你开除,你后悔的拍了拍大腿。但事实已经改变不了了。
故事二、
还是相同的场景,部队来征兵,此时的你学聪明了,没有直接走,你是先回宿舍将自己的宿舍里面的东西收拾好,然后去辅导员哪里跟学校说明了情况,学校将你的血迹进行了保留,你把学籍信息也一起带走了,一年后你又回来了,将自己的学籍给学校了,学校重新把你排课,安排考试,安排宿舍,你继续完成之前未完成的学业。
通过这两个故事,我想说的是我们再学校里面上学,就相当于进程再cpu上正在运行,我们去部队,就相当于进程从cpu下拿下来,同时需要将自己运行的重要数据信息带走,方便下次再上来的时候可以恢复你上次运行的数据以便可以继续跑程序。
那我们每次运行的后的数据都是放在哪里?
之前我们看过内存层状图,最上面的是寄存器,也是离cpu最近的,因为离的越近,速度越快,效率越高,cpu上面跑的程序将计算好的数据先放到寄存器上做临时保存,当时间片的时间到了,进程被拿下来了,我们就需要把寄存器上的数据带走保存起来,因为其他进程上面跑的时候此时寄存器的保存的数据是别的进程计算出来的数据,所以再我们的task_struct里面肯定还有一个保存寄存器里面值的结构,下次再运行的时候直接先将保存好的数据拂去出来放到寄存器上,运行再跑下面的代码,接下来画图带大家去理解:
所以cpu里面的寄存器是保存进程的临时数据—进程的上下文,进程的切换就是上下文保存和恢复的操作。
既然数据的问题解决了,那么我们的cpu是怎么知道我们程序下次从哪里开始运行呢,就好比上面,我们怎么知道下次上到cpu从第二行开始,原因就是我们的task_struct里面还有一个属性就是程序计数器pc:记录当前进程正在执行的指令的下一条指令的地址,下次再运行的时候,通过pc就可以找到上次运行结束后的下一行代码的位置了。
到这里大家应该知道进程切换是怎么去做的吧,希望大家可以理解。所以计算机里面的寄存器很多,但是每个都不大,因为存放的数据不大,而且每个进程继续后会被下一个上面的进程覆盖掉,也不需要保存。
所以我们一个函数的返回值是怎么做到被外部接收的这个问题也解决了,就是将函数的返回的数据先放到寄存器是,也叫临时数据,这也是我们平时说的,返回值不是直接将值返回给接受方,而是通过临时变量,这个临时变量就是寄存器,函数的返回值可以很好的帮助我们理解上面所说的内容。
二、总结
将到这里,我们进程优先级,如何根据优先级去调度,以及是怎么进行进程切换的,我们已经讲解完毕了,希望大家可以好好的吸收一下,这一块本身就一点难理解,因为cpu的速度太快了,我们感觉不到,所以才会感觉难,我们的感知都是一起运行的,而计算机里面大部分进程都是处于等待的,知识我们感觉不到,也希望大家不要思维定式,下来好好理解一下,那我们今天就说到这里,我们下篇再见

相关文章:
【Linux】-进程概念之进程优先级(如何去进行调度以及进程切换),还不进来看看??
💖作者:小树苗渴望变成参天大树🎈 🎉作者宣言:认真写好每一篇博客💤 🎊作者gitee:gitee✨ 💞作者专栏:C语言,数据结构初阶,Linux,C 动态规划算法🎄 如 果 你 …...
《在细雨中呼喊》阅读笔记
《在细雨中呼喊》阅读笔记 2023年2月5号在家读完,本书就是以作者者回忆的形式来写,男一号叫孙光林,有一个哥哥孙光平,一个弟弟叫孙光明,父亲叫孙光才。书中写了四篇故事。 第一篇写的就是作者对于老家生活的回忆 小的时…...
01-1 搭建 pytorch 虚拟环境
pytorch 管网:PyTorch 一 进入 Anaconda 二 创建虚拟环境 conda create -n pytorch python3.9注意要注意断 VPN切换镜像: 移除原来的镜像 # 查看当前配置 conda config --show channels conda config --show-sources# 移除之前的镜像 conda config --…...
RocketMQ 事务消息
事务消息是 RocketMQ 的高级特性之一 。这篇文章,笔者会从应用场景、功能原理、实战例子三个模块慢慢为你揭开事务消息的神秘面纱。 1 应用场景 举一个电商场景的例子:用户购物车结算时,系统会创建支付订单。 用户支付成功后支付订单的状态…...
Windows安装ElasticSearch
安装环境:java环境。新版本需要安装高版本的java,所有本次安装的为 7.x版本的ElasticSearch 。所以要java11 1、安装java11 2、下载 Elasticsearch 安装包 官网地址:(https://www.elastic.co/cn/) 安装包下载地址:https://www…...
【深度学习】SMILEtrack: SiMIlarity LEarning for Multiple Object Tracking,论文
论文:https://arxiv.org/abs/2211.08824 代码:https://github.com/WWangYuHsiang/SMILEtrack 文章目录 AbstractIntroductionRelated WorkTracking-by-DetectionDetection methodData association method Tracking-by-Attention Methodology架构概述外观…...
【Kubernetes】Kubernetes之二进制部署
kubernetes 一、Kubernetes 的安装部署1. 常见的安装部署方式1.1 Minikube1.2 Kubeadm1.3 二进制安装部署2. K8S 部署 二进制与高可用的区别2.1 二进制部署2.2 kubeadm 部署二、Kubernetes 二进制部署过程1. 服务器相关设置以及架构2. 操作系统初始化配置3. 部署 etcd 集群4. 部…...
京东开源的、高效的企业级表格可视化搭建解决方案:DripTable
DripTable 是京东零售推出的一款用于企业级中后台的动态列表解决方案,项目基于 React 和 JSON Schema,旨在通过简单配置快速生成页面动态列表来降低列表开发难度、提高工作效率。 DripTable 目前包含以下子项目:drip-table、drip-table-gene…...
STL C++学习背景
STL C学习背景 背景知识 背景知识 STL前置知识 STL,英文全称 standard template library,中文可译为标准模板库或者泛型库,其包含有大量的模板类和模板函数,是 C 提供的一个基础模板的集合,用于完成诸如输入/输出、数…...
C#踩坑:谨慎在XML数据列上绑定鼠标事件!
按照计划,昨天晚上就完成最后的公式自动计算,程序的流程就算完整了,可以正常运行了,一般情况下,是可以完成的。 10点开始干,窗体上放置一个Treeview,然后针对XML对Treeview进行数据绑定…...
逻辑代数运算
逻辑代数运算中的三种基本运算 与(AND):只有满足全部条件,才会产生结果 或(OR) :只要满足一个条件,就会产生结果 非(NOT):只要满足条件ÿ…...
win10笔记本显示器根据页面显示亮度自动调节亮度的问题
系统是win10企业版,针对这个问题查了很多种方法,比如: 1、控制面板->硬件和声音->电源选项->点击当前电源计划的更改计划设置->更改高级电源设置->显示->启用自适应亮度 但是我发现我的电源计划只有平衡这一种,…...
无人驾驶实战-第一课(自动驾驶概述)
在七月算法上报了《无人驾驶实战》课程,老师讲的真好。好记性不如烂笔头,记录一下学习内容。 课程入口,感兴趣的也可以跟着学一下。 ————————————————————————————————————————— 无人驾驶汽车的定义…...
15.节点操作
15.1 DOM节点 1.DOM节点 DOM树里每一个内容都称之为节点 2.节点类型 ●元素节点 所有的标签 比如body、div html是根节点 ●属性节点 所有的属性 比如href ●文本节点 所有的文本 15.2查找节点 1.父节点查找: parentNode属性 返回最近一级的父节点找不到返回为n…...
C语言自定义类型 — 结构体、位段、枚举、联合
前言 本期主要对通讯录三篇博客文章进行补充 通讯录文章:通讯录系列文章 对结构体进行详细介绍,其次讲解位段、枚举、联合体 文章目录 前言一、结构体1.什么是结构体2.结构声明2.1 声明格式2.2 如何声明(代码演示) 3.特殊声明3.1…...
新手指南:流程图中各种图形的含义及用法解析
我们经常在技术设计、沟通、业务演示等一些领域看到流程图,它也可以称为输入输出图。顾名思义,它是指一种简单的工作流程的具体步骤,比如包括一次会议的流程,以及一次生产制造的顺序和过程等。本文将为大家介绍流程图的含义和具体…...
【知识产权】专利的弊端
接上篇【知识产权】著作权的作用_qilei2010的博客-CSDN博客。 1 专利的分类 首先,专利分为:发明专利、实用新型专利、外观设计专利。这里要说明的是专利的不同种类在不同的国家都是有不同规定的,并不是所有国家和地区都是分成这三类。 >国家法律法规数据库 >中华…...
用Rust实现23种设计模式之抽象工厂
在 Rust 中,可以使用 trait 和泛型来实现抽象工厂模式。抽象工厂模式是一种创建型设计模式,它提供了一个接口来创建一系列相关或依赖对象的家族,而无需指定具体的类。下面是一个简单的示例,展示了如何使用 Rust 实现抽象工厂模式&…...
31.利用linprog 解决 投资问题(matlab程序)
1.简述 语法:[X,FVAL] linprog(f,a,b,Aeq,Beq,LB,UB,X0); X 为最终解 , FVAL为最终解对应的函数值 *注意:求最大值时,结果FVAL需要取反* f 为决策函数的系数矩阵。 *注意:当所求为最大值…...
整数线性规划求解工具isl使用方法
整数线性规划求解工具 Integer Set Library 代码 参考 isl是一个用于多面体模型调度实现的c/c库。通过isl,我们可以对模型进行自动的调度,循环优化等。 编译 ISL,Integer Set Library 版本0.22.1,http://isl.gforge.inria.fr/ README关于…...
大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
【 java 虚拟机知识 第一篇 】
目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...
[USACO23FEB] Bakery S
题目描述 Bessie 开了一家面包店! 在她的面包店里,Bessie 有一个烤箱,可以在 t C t_C tC 的时间内生产一块饼干或在 t M t_M tM 单位时间内生产一块松糕。 ( 1 ≤ t C , t M ≤ 10 9 ) (1 \le t_C,t_M \le 10^9) (1≤tC,tM≤109)。由于空间…...


