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

【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.kler.cn/a/397662.html

相关文章:

  • 代码随想录第46期 单调栈
  • Amazon Web Services (AWS)
  • H3C NX30Pro刷机教程-2024-11-16
  • 【大数据学习 | HBASE高级】hbase-phoenix 与二次索引应用
  • Ubuntu从入门到精通(一)系统安装
  • 使用Redis的一些经验总结
  • 低代码平台:跨数据库处理的重要性与实现方式
  • MSTP实验
  • Codeforces Round 987 (Div. 2) ABCD
  • Qt Event事件系统小探2
  • Python从0到100(七十二):Python OpenCV-OpenCV实现手势音量控制(文末送书)
  • JWT 过期后 自动刷新方案
  • git/dvc笔记
  • ElasticSearch学习笔记一:简单使用
  • 项目启动运行npm run dev报错digital envelope routines::unsupported at new Hash
  • 用 Python 从零开始创建神经网络(五):损失函数(Loss Functions)计算网络误差
  • 【030】基于51单片机甲醛检测报警器【Proteus仿真+Keil程序+报告+原理图】
  • 动态网页爬取 —— ajax 与 selenium
  • Scratch 015生日贺卡(下)
  • 技术理论||01无人机倾斜摄影原理
  • ERROR TypeError: AutoImport is not a function
  • kafka中是如何快速定位到一个offset的
  • 计算机的错误计算(一百五十六)
  • Git设置用户名及邮箱
  • 接口文档的编写
  • 深入解析 CentOS 7 上 MySQL 8.0 的最佳实践20241112