当前位置: 首页 > news >正文

【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

  1. PRI也还是比较好理解的,即进程的优先级,或者通俗点说就是程序被CPU执行的先后顺序,此值越小进程的优先级别越高
  2. 那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上的调度已经比较公平了,接下来在来理解一下进程优先级的概念:

  1. cpu资源分配的先后顺序,就是指进程的优先权(priority)。
  2. 优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可能改善系统性能。
  3. 还可以把进程运行到指定的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】-进程概念之进程优先级(如何去进行调度以及进程切换),还不进来看看??

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …...

《在细雨中呼喊》阅读笔记

《在细雨中呼喊》阅读笔记 2023年2月5号在家读完&#xff0c;本书就是以作者者回忆的形式来写&#xff0c;男一号叫孙光林&#xff0c;有一个哥哥孙光平&#xff0c;一个弟弟叫孙光明&#xff0c;父亲叫孙光才。书中写了四篇故事。 第一篇写的就是作者对于老家生活的回忆 小的时…...

01-1 搭建 pytorch 虚拟环境

pytorch 管网&#xff1a;PyTorch 一 进入 Anaconda 二 创建虚拟环境 conda create -n pytorch python3.9注意要注意断 VPN切换镜像&#xff1a; 移除原来的镜像 # 查看当前配置 conda config --show channels conda config --show-sources# 移除之前的镜像 conda config --…...

RocketMQ 事务消息

事务消息是 RocketMQ 的高级特性之一 。这篇文章&#xff0c;笔者会从应用场景、功能原理、实战例子三个模块慢慢为你揭开事务消息的神秘面纱。 1 应用场景 举一个电商场景的例子&#xff1a;用户购物车结算时&#xff0c;系统会创建支付订单。 用户支付成功后支付订单的状态…...

Windows安装ElasticSearch

安装环境&#xff1a;java环境。新版本需要安装高版本的java&#xff0c;所有本次安装的为 7.x版本的ElasticSearch 。所以要java11 1、安装java11 2、下载 Elasticsearch 安装包 官网地址&#xff1a;(https://www.elastic.co/cn/) 安装包下载地址&#xff1a;https://www…...

【深度学习】SMILEtrack: SiMIlarity LEarning for Multiple Object Tracking,论文

论文&#xff1a;https://arxiv.org/abs/2211.08824 代码&#xff1a;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 是京东零售推出的一款用于企业级中后台的动态列表解决方案&#xff0c;项目基于 React 和 JSON Schema&#xff0c;旨在通过简单配置快速生成页面动态列表来降低列表开发难度、提高工作效率。 DripTable 目前包含以下子项目&#xff1a;drip-table、drip-table-gene…...

STL C++学习背景

STL C学习背景 背景知识 背景知识 STL前置知识 STL&#xff0c;英文全称 standard template library&#xff0c;中文可译为标准模板库或者泛型库&#xff0c;其包含有大量的模板类和模板函数&#xff0c;是 C 提供的一个基础模板的集合&#xff0c;用于完成诸如输入/输出、数…...

C#踩坑:谨慎在XML数据列上绑定鼠标事件!

按照计划&#xff0c;昨天晚上就完成最后的公式自动计算&#xff0c;程序的流程就算完整了&#xff0c;可以正常运行了&#xff0c;一般情况下&#xff0c;是可以完成的。 10点开始干&#xff0c;窗体上放置一个Treeview&#xff0c;然后针对XML对Treeview进行数据绑定&#xf…...

逻辑代数运算

逻辑代数运算中的三种基本运算 与&#xff08;AND&#xff09;&#xff1a;只有满足全部条件&#xff0c;才会产生结果 或&#xff08;OR&#xff09; &#xff1a;只要满足一个条件&#xff0c;就会产生结果 非&#xff08;NOT&#xff09;&#xff1a;只要满足条件&#xff…...

win10笔记本显示器根据页面显示亮度自动调节亮度的问题

系统是win10企业版&#xff0c;针对这个问题查了很多种方法&#xff0c;比如&#xff1a; 1、控制面板->硬件和声音->电源选项->点击当前电源计划的更改计划设置->更改高级电源设置->显示->启用自适应亮度 但是我发现我的电源计划只有平衡这一种&#xff0c…...

无人驾驶实战-第一课(自动驾驶概述)

在七月算法上报了《无人驾驶实战》课程&#xff0c;老师讲的真好。好记性不如烂笔头&#xff0c;记录一下学习内容。 课程入口&#xff0c;感兴趣的也可以跟着学一下。 ————————————————————————————————————————— 无人驾驶汽车的定义…...

15.节点操作

15.1 DOM节点 1.DOM节点 DOM树里每一个内容都称之为节点 2.节点类型 ●元素节点 所有的标签 比如body、div html是根节点 ●属性节点 所有的属性 比如href ●文本节点 所有的文本 15.2查找节点 1.父节点查找&#xff1a; parentNode属性 返回最近一级的父节点找不到返回为n…...

C语言自定义类型 — 结构体、位段、枚举、联合

前言 本期主要对通讯录三篇博客文章进行补充 通讯录文章&#xff1a;通讯录系列文章 对结构体进行详细介绍&#xff0c;其次讲解位段、枚举、联合体 文章目录 前言一、结构体1.什么是结构体2.结构声明2.1 声明格式2.2 如何声明&#xff08;代码演示&#xff09; 3.特殊声明3.1…...

新手指南:流程图中各种图形的含义及用法解析

我们经常在技术设计、沟通、业务演示等一些领域看到流程图&#xff0c;它也可以称为输入输出图。顾名思义&#xff0c;它是指一种简单的工作流程的具体步骤&#xff0c;比如包括一次会议的流程&#xff0c;以及一次生产制造的顺序和过程等。本文将为大家介绍流程图的含义和具体…...

【知识产权】专利的弊端

接上篇【知识产权】著作权的作用_qilei2010的博客-CSDN博客。 ​ 1 专利的分类 首先,专利分为:发明专利、实用新型专利、外观设计专利。这里要说明的是专利的不同种类在不同的国家都是有不同规定的,并不是所有国家和地区都是分成这三类。 >国家法律法规数据库 >中华…...

用Rust实现23种设计模式之抽象工厂

在 Rust 中&#xff0c;可以使用 trait 和泛型来实现抽象工厂模式。抽象工厂模式是一种创建型设计模式&#xff0c;它提供了一个接口来创建一系列相关或依赖对象的家族&#xff0c;而无需指定具体的类。下面是一个简单的示例&#xff0c;展示了如何使用 Rust 实现抽象工厂模式&…...

31.利用linprog 解决 投资问题(matlab程序)

1.简述 语法&#xff1a;[X,FVAL] linprog(f,a,b,Aeq,Beq,LB,UB,X0)&#xff1b; X 为最终解 &#xff0c; FVAL为最终解对应的函数值 *注意&#xff1a;求最大值时&#xff0c;结果FVAL需要取反* f 为决策函数的系数矩阵。 *注意&#xff1a;当所求为最大值…...

整数线性规划求解工具isl使用方法

整数线性规划求解工具 Integer Set Library 代码 参考 isl是一个用于多面体模型调度实现的c/c库。通过isl&#xff0c;我们可以对模型进行自动的调度&#xff0c;循环优化等。 编译 ISL,Integer Set Library 版本0.22.1&#xff0c;http://isl.gforge.inria.fr/ README关于…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

基于鸿蒙(HarmonyOS5)的打车小程序

1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...

VisualXML全新升级 | 新增数据库编辑功能

VisualXML是一个功能强大的网络总线设计工具&#xff0c;专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑&#xff08;如DBC、LDF、ARXML、HEX等&#xff09;&#xff0c;并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...

Axure 下拉框联动

实现选省、选完省之后选对应省份下的市区...

2025-05-08-deepseek本地化部署

title: 2025-05-08-deepseek 本地化部署 tags: 深度学习 程序开发 2025-05-08-deepseek 本地化部署 参考博客 本地部署 DeepSeek&#xff1a;小白也能轻松搞定&#xff01; 如何给本地部署的 DeepSeek 投喂数据&#xff0c;让他更懂你 [实验目的]&#xff1a;理解系统架构与原…...