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

【Linux系统】进程优先级:进程间的权力游戏

Linux系列


文章目录

  • Linux系列
  • 前言
  • 一、优先级的概念
  • 二、查看、修改优先级
    • 2.1、查看优先级
    • 2.2、修改指令
  • 三、Linux o(1)调度算法
    • 3.1、内核调度器算法的工作方式


前言

进程优先级调度是是指操作系统,根据进程的优先级来分配CPU资源的一种调度算法。系统会为每个进程分配一个优先级,优先级高的进程会优先获取CPU资源,从而更好地决定进程执行顺序。这种机制极大程度上提高了,系统的运行效率。

一、优先级的概念

首先,要知道这几个概念:
1、什么是优先级?
优先级就是对于系统资源,谁先访问,谁后访问的问题。
2、为什么要有优先级?
因为对于一个多任务的操作系统来说,CPU资源有限,进程是多个的,注定了进程之间是竞争关系,而如果一个进程长时间得不到CPU资源,该进程就一直得不到推进(就相当于某个程一直无法启动),我们称这个为进程饥饿问题,而操作系统为了规避这种情况,保证进程间的良性竞争,就给每个进程分配了对应的优先级(号码牌),进程就拿着自己的优先级去排队了。
总结一下:

  • 优先级:对CPU资源访问优先的问题
  • 存在原因:CPU的资源不足
  • 优先级高的比优先级低的更早被调度,能够确保关键任务及时完成,同时提高系统的运行效率

二、查看、修改优先级

2.1、查看优先级

随便写的程序,用来演示

  1 #include<stdio.h>  
  2 #include<unistd.h>  
  3 int main()  
  4 {
  5   while(1)
  6   {
  7                                                               
  8   }
  9   return 0;
 10 }        

在这里插入图片描述

在Linux系统中,PRI(Priority)NI(Nice)两个参数共同决定了进程的优先级,影响进程的调度顺序。
可以通过ps指令来查看具体信息。
PRI(Priority)
PRI是进程的最终优先级,由内核通过计算得到,直接影响调度器为进程分配CPU资源的顺序。
优先级数值越小,优先级月高!!
PRI的范围

  • 实时任务:范围为0到99
  • 普通任务:范围为100到139

实时任务:是指必须在规定时间内完成处理,并对响应时间和处理结果的准确性有严格要求的。
普通任务:是指对时间要求宽松没有严格时间限制的任务。

PRI的计算公式
PRI(new)=PRI(old)+NI(nice)
其中:

  • PRI(old):是进程原来优先级(其实对我们写的程序来说固定为80)
  • NI:是进程的nice值,我们可以通过设置不同的nice达到改变进程优先级的目的,但是操作系统规定nice值的范围必须在【-20,19】

对于我们执行的程序,优先级一般初始为80。

2.2、修改指令

NI(Nice)
NI值是用户空间设置的静态优先级,默认值为0,用户可以通过对NI赋予不同的值,来达到修改优先级的目的,帮助我们对一些比较重要的程序,优先分配CPU资源。如果修改NI的值超过规定空间,如:设为30,则NI会取其范围内最靠进的值19.
修改NI的值
启动top命令,进入下面页面:

在这里插入图片描述
找到要修改进程的PID,可使用/搜索,按下r键,输入要修改进程的PID,输入后直接回车,系统会提示你输入要修改的值,下面为我输入19后的值,其进程优先级修改结果为:
在这里插入图片描述
注意,我们平时不建议修改进程优先级,内核调度器分配的优先级是比较合理的,如果改动可能会导致进程响应变慢。

三、Linux o(1)调度算法

3.1、内核调度器算法的工作方式

一个CPU绑定一个运行队列,和两个优先级队列,在这两个优先级队列中,一个是活跃的一个是过期的,每个优先级队列包含140个优先级:
在这里插入图片描述

在这个优先级队列中,按优先级顺序存储着PCB结构体对象的指针,如果有两相同优先级的进程,那么他们的PCB结构体通过指针链接起来进行排队,另外操作系统还会为他创建一个对应的位图,同过遍历位图的方式判断,对应位置是否为空,若不为空则对该位图映射对应的优先级队列位置的进程,进行调度,被调度的进程时间片消耗完后,就会去另一个不活跃的优先级队列中,重新进程排对,当CPU将活跃优先级队列遍历完后,此时只要将活跃优先级的队列同不活跃优先级的队列的指针交换,就可以再次遍历队列,调度进程了,而这个交换的时间复杂度为o(1),因此被称为,o(1)的调度算法。

在这里插入图片描述


http://www.kler.cn/a/582476.html

相关文章:

  • Android : Camera之CHI API
  • 学习MDA规范_5.统一建模语言(UML)
  • Chrome 浏览器 133 版本新特性
  • 本地Git仓库搭建(DevStar)与Git基本命令
  • 20 | 如何添加单元测试用例
  • 含k个3的数(信息学奥赛一本通-1090)
  • 深度学习之目标检测/对象检测
  • Scala编程_实现Rational的基本操作
  • rust语言闭包trait类型编译器推导总结
  • Matlab深度学习ResNet、迁移学习多标签图像分类及超分辨率处理Grad CAM可视化分析COCO、手写数字数据集...
  • 大模型在甲状腺肿瘤预测及治疗方案制定中的应用研究
  • 探索DEHP暴露对小鼠心脏发育的影响:AbMole助力揭示线粒体功能障碍的奥秘
  • 每周一篇——PLG(Promtail+Loki+Grafana)轻量日志方案
  • [JAVASE] 注解
  • 大白话 Vue 中的keep - alive组件,它的作用是什么?在什么场景下使用?
  • APK文件结构与逆向工具链深度解析
  • 【BUG分析】微服务无法读取Nacos中的共享配置
  • AI模型的构建过程是怎样的(下)
  • 网络安全事件响应--应急响应(windows)
  • ES搭建详细指南+常见错误解决方法