【Linux】-进程概念之进程优先级(如何去进行调度以及进程切换),还不进来看看??

news2024/11/18 9:22:04

在这里插入图片描述
💖作者:小树苗渴望变成参天大树🎈
🎉作者宣言:认真写好每一篇博客💤
🎊作者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的速度太快了,我们感觉不到,所以才会感觉难,我们的感知都是一起运行的,而计算机里面大部分进程都是处于等待的,知识我们感觉不到,也希望大家不要思维定式,下来好好理解一下,那我们今天就说到这里,我们下篇再见
请添加图片描述

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

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

相关文章

小小推磨台(我在芜湖等你)

君问归期已有期&#xff0c;江城相逢话恩奇 我 渐渐明了 因为 有祂同行 有期待 有不知所措 离别故乡 去远方 是求学 更是认识祂 我 还不知 那里有没有家 或许有 或许有人找寻 忽然间 想到不认识的相逢 已然在祂预备之中 在那里 侧耳倾听 彼此谈论 那是和睦同居 好的无比 if (&q…

优雅地处理RabbitMQ中的消息丢失

目录 一、异常处理 二、消息重试机制 三、错误日志记录 四、死信队列 五、监控与告警 优雅地处理RabbitMQ中的消息丢失对于构建可靠的消息系统至关重要。下面将介绍一些优雅处理消息丢失的方案&#xff0c;包括异常处理、重试机制、错误日志记录、死信队列和监控告警等。…

科技资讯|苹果手机版Vision Pro头显专利曝光,内嵌苹果手机使用

根据美国商标和专利局&#xff08;USPTO&#xff09;公示的清单&#xff0c;苹果公司近日获得了一项头显相关的技术专利&#xff0c;展示了一款亲民款 Vision Pro 头显&#xff0c;可以将 iPhone 放置在头显内部充当屏幕。 根据patentlyapple 媒体报道&#xff0c;这是苹果公司…

设计模式——单例模式(懒汉和饿汉)

单例模式 一、概念 单例模式是一种对象创建型模式&#xff0c;使用单例模式&#xff0c;可以保证为一个类只生成唯一的实例对象。也就是说&#xff0c;在整个程序空间中&#xff0c;该类只存在一个实例对象。一个类只能有一个实例在生活中是很常见的&#xff0c;比如打印机程…

若依管理系统后端将 Mybatis 升级为 Mybatis-Plus

文章目录 说明流程增加依赖修改配置文件注释掉MybatisConfig里面的Bean 代码生成使用IDEA生成代码注意 Controller文件 说明 若依管理系统是一个非常完善的管理系统模板&#xff0c;里面含有代码生成的方法&#xff0c;可以帮助用户快速进行开发&#xff0c;但是项目使用的是m…

单例模式_饿汉模式_懒汉模式(含线程安全写法)

前言 某个类在程序中只存在唯一一份实例&#xff0c;叫做单例模式。 目录 前言 一、饿汉模式 二、懒汉模式 &#xff08;一&#xff09;单线程写法 &#xff08;二&#xff09;线程安全写法 &#xff08;三&#xff09;线程安全和不安全写法的区别 结语 一、饿汉模式 …

分享windwosServer2012R--ISO镜像下载地址(含激活教程)

windowsServer2012R----急速网盘下载地址&#xff1a;点击下载 提取码&#xff1a;888999 激活下载&#xff1a;点击下载 提取码&#xff1a;888999

AI和GPT的崛起,对未来项目管理的影响与变革︱原微软项目经理陆敏

原微软项目经理和产品经理人才顾问陆敏先生受邀为由PMO评论主办的2023第十二届中国PMO大会演讲嘉宾&#xff0c;演讲议题&#xff1a;AI和GPT的崛起&#xff0c;对未来项目管理的影响与变革。大会将于8月12-13日在北京举办&#xff0c;敬请关注&#xff01; 议题简要&#xff1…

从LeakCanary看Service生命周期监控

作者&#xff1a;小海编码日记 大家都知道使用LeakCanary可以监控项目中存在的 内存泄漏 问题&#xff0c;那么LeakCanary是怎么实现的呢&#xff1f;LeakCanary通过检测程序中对象的引用关系&#xff0c;收集应该被回收的对象并标记&#xff0c;随后等待GC后&#xff0c;检查该…

线上电影票票务系统开发--APP、H5小程序、网站

一、系统架构 后端架构&#xff1a;采用微服务架构&#xff0c;包括API接口、业务逻辑层和数据访问层。使用云服务器进行数据存储&#xff0c;保证数据的安全性和稳定性。 前端架构&#xff1a;APP采用原生开发方式&#xff0c;前端与后端通过API接口进行数据交互。 二、功能…

司空见惯 - Realwear公司及产品介绍

基于安卓系统的头显设备&#xff0c;Android based headset display&#xff0c;集成了摄像头&#xff0c;还有个小显示屏。 设备价格很贵哦&#xff1a; 显示屏在前方&#xff1a; 官方网站&#xff1a;https://www.realwear.com/ RealWear head-mounted displays. Built to …

直播平台的秘密武器:揭秘流行直播实时美颜SDK的背后技术

近年来&#xff0c;随着社交媒体和直播平台的崛起&#xff0c;实时美颜成为了许多用户在分享自己生活的过程中的一项重要需求。无论是个人的自拍照片&#xff0c;还是主播在直播中的形象展示&#xff0c;美颜效果都直接影响着观众的视觉感受。而支撑这种实时美颜效果背后的技术…

uniapp 实现滑动视图切换 顶部滚动导航栏

无论小程序的时候一般有这个功能,在页面处于首页时候,滑动视图,切换视图顶部滚动导航也跟着切换 1.想要实现这个功能就需要实现顶部导航栏,首先实现顶部滚导航栏 点击高亮颜色显示 模板代码 <scroll-view scroll-x"true" class"scroll-content" > …

MySQL不知道密码,直接修改密码

很简单&#xff0c;我们跳过验证&#xff0c;直接进去修改就好 修改配置文件 vim /etc/my.cnf在[mysqld]下直接添加配置 skip-grant-tables如图&#xff1a; 保存&#xff0c;退出即可。 重启服务 service mysqld restart进入MySQL #(直接点击回车&#xff0c;密码为空)…

20230809在WIN10下使用python3将DOCX文件转换为TXT文件

20230809在WIN10下使用python3将DOCX文件转换为TXT文件 2023/8/9 11:38 python docx txt https://blog.51cto.com/u_16175446/6620474 如何实现Python读取word内容转为TXT的具体操作步骤 如何实现Python读取word内容转为TXT的具体操作步骤 原创 mob649e81576de12023-07-04 14:0…

伪原创文章生成器软件【php源码】

这篇文章主要介绍了python怎么做gui界面&#xff0c;具有一定借鉴价值&#xff0c;需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获&#xff0c;下面让小编带着大家一起了解一下。 火车头采集ai伪原创插件截图&#xff1a; Author&#xff1a;Runsen 现在极少有人会用…

Python入门【串行、并行与并发的区别、 进程、线程、协程的区别、线程是什么? 、协程是什么?、同步和异步介绍、线程Thread 、守护线程】(二十三)

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小王&#xff0c;CSDN博客博主,Python小白 &#x1f4d5;系列专栏&#xff1a;python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发 &#x1f4e7;如果文章知识点有错误…

小红书运营 从入门到精通

大家好&#xff0c;我是网媒智星&#xff0c;今天跟大家分享一下小红书运营的经验&#xff0c;从入门到精通&#xff0c;一文读懂&#xff0c;全篇干货输出&#xff0c;非常实用。 一、注册账号 首先要说明一点&#xff0c;小红书与其他平台有所不同&#xff0c;因此具有特殊性…

mysql二进制方式升级8.0.34

一、概述 mysql8.0.33 存在如下高危漏洞&#xff0c;需要通过升级版本修复漏洞 Oracle MySQL Cluster 安全漏洞(CVE-2023-0361) mysql/8.0.33 Apache Skywalking <8.3 SQL注入漏洞 二、查看mysql版本及安装包信息 [rootlocalhost mysql]# mysql -V mysql Ver 8.0.33 fo…

做外贸受伤的并不总是你

外贸群里的小伙伴们经常吐槽&#xff1a; 小伙伴A 说&#xff1a;我前两天做一个PI&#xff0c;是新开发成功的一个客户。客户让我再次降价&#xff0c;我也同意了&#xff0c;刚刚客户反过来说&#xff0c;一再同意降价&#xff0c;是不是品质同时也变差了&#xff0c;应该怎…