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

【Linux】进程的优先级

进程的优先级

    • 一.概念
    • 二.修改优先级的方法
    • 三.进程切换的大致原理:
    • 四.上下文数据的保存位置:

一.概念

  1. cpu资源分配的先后顺序,就是指进程的优先权(priority)。
    优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。
    还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能。俗话说就是,谁的优先级高谁就先被CPU调度(运行)

  2. 存在优先级的原因:因为资源太少了!像是我们的CPU一般只有一个或者几个!但是进程却一般有几十个或者几百个,所以就得确认优先级。

  3. linux下优先级的特点:计算机里面的优先级的本质就是pcb里面的一个整数。linux里面的优先级是用两个整数来代替的,一个是PRI(priority) 一个是NI(nice)
    在这里插入图片描述

  4. 最终优先级 (PRI)= 初始优先级+NI(nice),linux支持进程运行中,优先级调整的!调整策略就是通过更改nice值完成的!
    不过我们一般都是不改的 图中PR就是PRI,NI就是NI。

二.修改优先级的方法

输入top后就会进入下图中的页面!——使用top修改可能需要用到root权限!

在这里插入图片描述

输入r就会跳出一个renice 后面显示的pid就是当前进程的pid,我们可以输入想要的进程pid用来修改nice值!

在这里插入图片描述

通过上图可以发现linux下nice值的范围是 从 [-20,19]

为什么要给一个范围呢?这是因为为了防止调优先级导致某个进程过度占用CPU资源!导致调度失衡!

总结:

  1. PRI也还是比较好理解的,即进程的优先级,或者通俗点说就是程序被CPU执行的先后顺序,此值越小 进程的优先级别越高
  2. 那NI呢?就是我们所要说的nice值了,其表示进程可被执行的优先级的修正数值
  3. PRI值越小越快被执行,那么加入nice值后,将会使得PRI变为:PRI(new)=PRI(old)+nice
  4. 这样,当nice值为负值的时候,那么该进程的优先级值将变小,即该进程的优先级会变高,它就越快被执行
  5. 所以,调整进程优先级,在Linux下,就是调整进程nice值
  6. nice其取值范围是-20至19,一共40个级别。
  7. 需要强调一点的是,进程的nice值不是进程的优先级,他们不是一个概念,但是进程nice值会影响到进 程的优先级变化。
  8. 可以理解nice值是进程优先级的修正数据

三.进程切换的大致原理:

  • 首先我们要知道CPU一直在执行三件事——1.取指令 2.分析指令 3.执行指令
    CPU里面存在很多寄存器——这些寄存器都是同一套的,当CPU要执行某个进程的时候!首先会将进程的PCB放到寄存器里面!然后通过PCB来找到该进程的代码。

  • 寄存器的功能有很多
    例如pc(eip)寄存器它的作用就是:存放当前执行指令的下一条指令的地址——也就是说CPU里面存在的一个寄存器专门用来标记下一次要从当前这个进程的哪一行指令开始执行,例如保存return值的寄存器:我们以前函数执行的时候进行return,但是明明函数过来作用域已经被释放了,主函数是怎么得到的return的值呢,答案也是通过寄存器来实现的。
    当我运行进程的时候 一定会产生十分多的临时数据

  • 例如我们进行一个加法运算函数那么CPU就要将这些a,b,c变量导入寄存器里面!然后用里面的寄存单元进行计算,然后将结果保存在另一个寄存单元里面,最后计算完毕再拷回去,所以一定会存在很多的临时数据,这些临时数据是属于当前进程的。

  • 要明确一点寄存器硬件 不等于 寄存器内的数据,虽然这些数据是保存在寄存器里面的,且进程在运行的时候是占用着CPU的,但是进程不能一直占用CPU到进程结束。就像是我们写个死循环,我们仍然可以使用其他程序,进程在运行的时候都有自己的时间片,存在进程在执行过程未完成时就被拿下去的情况。所以就必须考虑下一次进程回来的时候执行到哪里,对于那些属于进程的临时数据,也必须处理,否则下一次进程再次回到CPU就必须重新开始了。

  • 对于进程离开CPU保留临时数据的过程我们称为上下文保护,当进程再次被CPU调度后,恢复临时数据的过程就称为上下文恢复。要区分寄存器和寄存器里面的临时数据!——上下文保护是保存寄存器里面的临时数据!(寄存器只有一套,但是里面的数据可以不断的换)

  • 上下文恢复就是将这些临时数据重新写入到寄存器里面,所以进程再次被CPU调度的时候,要首先进行上下文恢复!离开时也不是立刻离开,要进行上下文保护!寄存器被所有进程共享,但是寄存器里面的数据都是属于当前的进程的,一般可以简单的认为是保存在PCB里面

四.上下文数据的保存位置:

  1. 内核栈
  • 存储进程切换时的寄存器现场
  • 保存各种中断和系统调用时的现场信息
  • 属于每个进程私有的栈空间
  1. PCB (进程控制块)
  • 包含进程的状态、程序计数器
  • 保存进程调度相关的重要信息
  • 操作系统内核中为每个进程维护的数据结构
  1. 硬件寄存器
  • 通用寄存器
  • 程序计数器(PC)
  • 栈指针寄存器
  • 状态寄存器
  1. 页表和MMU
  • 保存进程的虚拟内存映射
  • 存储进程的内存空间信息

想要了解上下文知识可以观看该篇博客:上下文恢复

http://www.lryc.cn/news/486116.html

相关文章:

  • python实现十进制转换二进制,tkinter界面
  • 电子应用设计方案-12:智能窗帘系统方案设计
  • 力扣 回文链表-234
  • 采样率22050,那么CHUNK_SIZE 一次传输的音频数据大小设置多少合适?unity接收后出现卡顿的问题的思路
  • 网络初识--Java
  • K8S单节点部署及集群部署
  • GPIO相关的寄存器(重要)
  • OpenCV基础
  • 两行命令搭建深度学习环境(Docker/torch2.5.1+cu118/命令行美化+插件),含完整的 Docker 安装步骤
  • Redis做分布式锁
  • lambdaQueryWrapper详细解释
  • 【工控】线扫相机小结 第三篇
  • golang中的init函数
  • 理解和选择Vue的组件风格:组合式API与选项式API详解
  • Java基础——高级技术
  • 什么是SSL VPN?其中的协议结构是怎样的?
  • 程序员高频率面试题-整理篇
  • 第二十二章 TCP 客户端 服务器通信 - TCP设备的OPEN和USE命令关键字
  • CSS 语法规范
  • Linux开发常用命令
  • Linux第92步_如何编写“设备树”下的platform设备驱动
  • 从零开始学习 sg200x 多核开发之 eth0 MAC 地址修改
  • JMeter与大模型融合应用之JMeter日志分析服务化实战应用
  • AtCoder Beginner Contest 380(A-F)
  • 多线程-阻塞队列
  • el-table合并单元格之后,再进行隔行换色的且覆盖表格行鼠标移入的背景色的实现
  • java模拟键盘实现selenium上下左右键 table中的左右滚动条实现滚动
  • SDF,一个从1978年运行至今的公共Unix Shell
  • 前馈神经网络 (Feedforward Neural Network, FNN)
  • 【Python进阶】Python中的数据库交互:使用SQLite进行本地数据存储