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

进程优先级切换调度-进程概念(6)

文章目录

  • 进程的优先级
    • 1. 先说结论
    • 2. 修改进程的优先级
    • 3. 优先级的极值问题
  • 补充四个概念(竞争,独立...)
  • 进程切换
    • 1. 死循环进程如何运行
    • 2. 聊聊CPU,寄存器
    • 3. 如何切换进程
      • 3.1 例子理解
      • 3.2 具体理解
      • 3.3 全新进程 VS 已经调度过的进程
  • 实时操作系统与分时操作系统
      • 实时操作系统的特点与应用场景
      • 分时操作系统的特点与应用场景
      • 两种操作系统的对比

进程的优先级

在这里插入图片描述

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>int main()
{while(1){printf("我是一个父进程, pid: %d, ppid: %d\n", getpid(), getppid());sleep(1);}return 0;
}

1. 先说结论

  • PRI:进程的优先级,默认为80
  • NI:进程优先级的修正数据,别称为nice
  • 进程真实的优先级 = PRI(默认)+ NI,就是PRI
  • 进程优先级它就是一种数字,task_struct中的int成员变量
  • 值越低,优先级越高,反之优先级越低。Linux是基于时间片的分时操作系统,考虑到公平性,优先级可能变化,但是变化幅度不能太大

2. 修改进程的优先级

进程的优先级不建议去改,就用默认的。改太多的话,会影响到操作系统调度进程的平衡,就算要修改进程的优先级,也建议修改nice值,而不是直接去修改PRI

先输入top命令,再按键盘上的r(意味着我要重新调整优先级),输入要重新调整进程的PID,接下来输入你想将nice值改为多少,这里我输入10,按回车键

在这里插入图片描述

此时PRI的值就是最终优先级是,OS对多次更改优先级会有一定的限制,可能你需要切换到root超级用户(su -),才能再次更改优先级

在这里插入图片描述

那此时再将nice值改为-10时(再次更改,它不允许了,需要切换成超级用户),猜一下最终优先级PRI是多少?之前是90,那减去10,最终优先级应该是80。实际上PRI为70

在这里插入图片描述

这为是70呢?之前结论提到了,进程真实的优先级 = PRI(默认)+ NI,默认是80,加上NI的值(-10)不就是70。所以进程优先级做调整,永远是从默认出发

这样初看咋感觉这么奇怪呢?为什么要这么设计呢,但仔细想想又有点道理,如果调整是从上次的最终优先级出发,那是不是还得查找上次的最终优先级?而规定死一个默认初始值,想调整最终优先级,只需要去修改nice值即可

3. 优先级的极值问题

在探究优先级的极值问题之前,先来看一个调整nice值的命令:renice -n nice值 -p 该进程的PID

在这里插入图片描述

观察上面的图片,可以看到将nice值更改成100时,最高也只能到19。将nice值更改成-100时,最高也只能到-20,因此nice值的范围是:[-20, 19],由此便能得出Linux进程的优先级范围是[60, 99]

在进程调度时要考虑公平性,幅度不能太大。如果进程优先级能随意修改的话,那用户就可能会恶意修改自己进程的优先级,来尽可能让自己进程优先得到资源

优先级设立不合理,会导致优先级低的进程,长时间得不到CPU资源,进而导致进程饥饿

补充四个概念(竞争,独立…)

  • 竞争性:系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级

  • 独立性:多进程运行,需要独享各种资源,多进程运行期间互不干扰

  • 并行:多个进程在多个CPU下分别同时进行运行,这称之为并行

  • 并发:多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,这称之为并发

这个并发概念,只要我切换进程的时间足够块,比如1秒内,这三个进程都运行了一会儿,三个进程运行的时间加起来就为1秒,它可能是1ms切换一次,关键CPU就算是1ms的时间也能运行很多很多的代码

此时用户就会感受到多个进程在同时运行,但实际上单CPU,只能支持让一个进程运行,无法让多个进程同时运行,进程运行其实是一卡一卡的,但是它切换太快了,我们感受不到而已

进程切换

1. 死循环进程如何运行

先提出一个问题:如果一个进程占有CPU,它会将自己的代码全部跑完,再让另外一个进程调度?按这样看来,如果这是一个死循环进程,那就会一直都占有CPU

实际上OS并不会让一个进程持续性占有CPU,否则遇到死循环进程,系统就直接卡死了,OS会通过时间片这样的东西进行调度和切换进程

这个时间片可以这么理解:你这个进程我只给你1ms的时间占用CPU哦,1ms结束之后我就将你从CPU中拿下来,你的代码和数据没跑完就自己再重新到运行队列去排队。那这个1ms就是时间片

2. 聊聊CPU,寄存器

其实CPU执行进程时,就跟PCB关系不大了,重点是去执行进程的代码和数据,在CPU上会存在着一片寄存器,这个寄存器就是CPU内部的临时空间

当这个进程在跑的时候,CPU所有的寄存器都会被填上对应的临时值,有的寄存器是描述你这个进程数据结果有没有溢出,有的是描述数据计算有没有错误,有的是描述你的代码和数据是从哪里开始的等等

各个寄存器有各自的任务,保存正在运行进程的临时数据。但是要特别注意的是,寄存器它只是空间,不等同于寄存器里面的数据(内容),空间只有一份,内容可以是变化的,多份的,这一点非常重要

就比如int a = 10;这里的a是一个左值,a = 20;是将20这个数值放到a这个空间里,此时再赋值b = a;而这里的a并不是空间,它是一个右值,是将a中的内容赋值给b

在这里插入图片描述

3. 如何切换进程

3.1 例子理解

在这里插入图片描述

这里可以用大学生入伍的例子进行类比说明,首先你得告诉导员,办理好征兵入伍的报名表,交给导员进行初步审查,再经导员交给学校办理保留学籍证明,此时你的身份从学生变成了义务兵。这是一次切换

当两年兵回来之后,不是马上就能上课的,你得恢复学籍,身份得从义务兵再次变成学生,并经由导员,学校批准审核办理恢复学籍证明。这是二次切换

在这个过程中,你是一个进程,导员就是一个调度器,而学校就是CPU

学籍就是进程运行时的临时数据,CPU中寄存器里面的内容,称作当前进程的上下文数据

保留学籍就是保存进程的上下文数据,将CPU寄存器里面的内容给保存起来

恢复学籍就是恢复进程的上下文数据,将保存的内容重新恢复到CPU寄存器内

去当兵就是将该进程从CPU上给剥离下来当兵结束就是CPU重新调度该进程

3.2 具体理解

在这里插入图片描述

在A进程的时间片到了之后,进程A切换走之前,会将寄存器中的内容拷贝一份到某个地方,这样寄存器中的值就对A进程没有任何意义了,所以到了进程B运行时,直接将进程B的上下文数据覆盖寄存器中的值即可,进程A被重新调度时,并不能直接跑,要将曾经保存的上下文数据逐一恢复到各寄存器上,这样进程A就能在历史的位置继续运行了

进程切换最为核心的工作就是,保存和恢复当前进程的硬件上下文数据,即CPU内寄存器中的内容,而OS会将这个内容保存到该进程的task_struct中的TSS(任务状态段),就是一个结构体成员变量,下面是Linux源代码文件

在这里插入图片描述

3.3 全新进程 VS 已经调度过的进程

全新进程与已经调度过的进程要如何区分呢?其实在task_struct里再去新增一个标志位int isrunning,只要开始第一次调度,那isrunning从今往后都是1,否则就是0。这样C调度器就很容易检测出来你这个进程是全新的,还是已经调度过的进程

实时操作系统与分时操作系统

调度器:进行调度和切换的工作,首先是将进程保存下来,再切换进程,选择另外一个进程放上去

分时操作系统:以时间片为单位,进行公平调度

实时操作系统:来了一个进程,就要将这个进程给处理完才能处理下一个进程,所以它的调度算法是一定要比分时操作系统的调度算法要简单的

实时操作系统的特点与应用场景

  1. 实时操作系统的核心特性
    • 能够在严格的时间约束内完成任务调度和响应。
    • 适用于对时间敏感的场景,例如需要快速响应的控制任务。
  2. 主要应用领域
    • 汽车领域
      • 车载系统和行车电脑需要实时操作系统来实现关键功能,如主动刹车、车道保持等。
      • 当传感器检测到危险(如与前车距离过近)时,实时操作系统会立即生成高优先级的刹车任务,确保在极短时间内完成刹车操作,保障行车安全。
      • 这种场景下,分时操作系统无法满足快速响应的需求,因为分时操作系统会根据任务优先级和时间片分配资源,可能会导致刹车任务延迟执行。
    • 工业和制造业领域
      • 在生产线上,实时操作系统用于监控和控制生产过程。
      • 例如,当检测到产品质量问题导致良品率下降时,实时操作系统能够快速停止生产线,避免进一步生产不合格产品。
      • 这种快速响应能力对于减少生产损失和提高生产效率至关重要。

分时操作系统的特点与应用场景

  1. 分时操作系统的核心特性
    • 通过时间片轮转的方式分配系统资源,允许多个任务同时运行。
    • 适合用户交互频繁的场景,例如日常办公、娱乐等。
  2. 主要应用领域
    • 互联网领域
      • 用户在使用电脑或手机时,通常需要同时运行多个任务,如听歌、浏览网页、编写代码等。
      • 分时操作系统能够合理分配资源,让用户在不同任务之间切换时感觉流畅。
      • 例如,用户不会因为某个任务(如代码编译)而无法立即播放音乐,这种灵活性和多任务处理能力是分时操作系统的优势。
    • 日常使用场景
      • 对于普通用户来说,分时操作系统能够满足日常需求,提供良好的用户体验。
      • 用户更倾向于使用能够灵活切换任务的系统,而不是实时操作系统这种严格按优先级调度任务的系统。

两种操作系统的对比

  1. 实时操作系统
    • 优点:能够快速响应紧急任务,确保任务在规定时间内完成。
    • 缺点:灵活性较差,任务调度较为严格,不适合多任务交互频繁的场景。
    • 适用场景:对时间敏感的控制任务,如汽车安全系统、工业自动化控制等。
  2. 分时操作系统
    • 优点:能够同时处理多个任务,用户交互体验好。
    • 缺点:无法保证任务在严格的时间约束内完成,不适合对时间要求极高的场景。
    • 适用场景:日常办公、娱乐、互联网应用等。
http://www.xdnf.cn/news/1167139.html

相关文章:

  • Taro 网络 API 详解与实用案例
  • SecretFlow (3) --- 添加合作方并创建项目
  • JavaScript,发生异常,try...catch...finally处理,继续向上层调用者传递异常信息
  • RabbitMQ03——面试题
  • uniapp各大平台导航组件
  • 在 Ubuntu 22.04 上安装并优化 Nginx nginx入门操作 稍难,需要有一定理论 多理解 多实践
  • 《Uniapp-Vue 3-TS 实战开发》自定义时间选择
  • Kafka基础理论速通
  • IDEA全局Maven配置
  • 比特币技术简史 第六章:网络协议 - P2P网络、节点类型与消息传播
  • 未来趋势:LeafletJS 与 Web3/AI 的融合
  • Visual Studio Code 远端云服务器开发使用指南
  • (3)重定向 | 时间相关指令 | 文件查找 | 打包与压缩
  • FastDFS 6.11.0 单机环境搭建与测试(附 Nginx 集成)+ docker构建+k8s启动文件
  • Linux异常与信号处理
  • 浙江大学PTA程序设计C语言基础编程练习题1-5
  • 【论文阅读 | TIV 2024 | CDC-YOLOFusion:利用跨尺度动态卷积融合实现可见光-红外目标检测】
  • 边缘计算网关赋能智慧农业:物联网边缘计算的创新应用与实践
  • 【每日算法】专题九_链表
  • python-FTP爆破脚本(phpstudy)-一点bug记录
  • C++性能优化擂台技术文章大纲
  • Unity笔记——事件中心
  • Web3介绍(Web 3.0)(一种基于区块链技术的去中心化互联网范式,旨在通过技术手段实现用户对数据的自主权、隐私保护和价值共享)
  • 算法第26天|贪心算法:用最少数量的箭引爆气球、无重叠区间、划分字母区间
  • solidity从入门到精通 第二章:Solidity初相见
  • AI 音频产品开发模板及流程(二)
  • 数据结构 堆(2)---堆的实现
  • Markdown 转 PDF API 数据接口
  • Android ViewModel 深度解析:原理、使用与最佳实践
  • Redis——Redis进阶命令集详解(下)