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

【Linux庖丁解牛】—进程优先级!

1.概念

进程优先级是进程得到cpu资源的先后顺序。

为什么要有进程优先级呢?
目标资源稀缺导致要通过优先级确认谁先谁后的问题。

优先级VS权限

优先级:可以得到某种资源,先后问题。

权限:能否得到某种资源的问题。

性质:

。进程的优先级本质上也是一种数字(int类型),在task_struct中。

。进程优先级值越高,优先级越低,值越低,优先级越高。

。目前我们接触到的操作系统大多都是基于时间片的分时操作系统。

时间片我们可以理解为每个进程在cup中运行一次的规定时间,无论该进程的代码和数据是否执行完毕,该进程都会从cup中剥离下来等待下一次被调度。【至于操作系统是如何完成的,下面会详细说到】

那为什么会有时间片这种规定呢?

为了考虑公平性,优先级的差别不能太大,优先级未来可能会发生改变,但变化差别不能太大。时间片的存在就是为了让所有的进程都有机会被执行调度【在后面我们说Linux内核中的O(1)调度算法时我们可以更深刻的理解时间片的作用】!

。查看进程优先级

 ps al | head -1 && ps -al | grep process

简单写了下面一个程序测试一下。 

上面查看的有一些错位,这里把截图手动调整一下。 

 在讲进程优先级之前,这里先补充一个小知识点:UID【user ID】

在Linux中我们可以用一下命令查看用户ID

ll -ln

上面的user2是给用户看的,而下面的一串数字是给从操作系统看的。当我们创建一个文件时,文件属性中就会记录是谁创建的它,并保存到UID中,进程也是如此。

小知识点:系统怎么知道我访问文件的时候,是拥有者?所属组?other?

我们访问文件的时候本质上其实是用我们的进程去访问文件,系统首先会用进程的UID和文件的拥有者比较,如果相同,那我就是拥有者,不相同,那我再用进程的UID和文件的所属组比较【相同则是所属组,否则是other】。 

2.PRI和NI 

PRI:进程的优先级,默认:80/20->(版本不同,也可能会有所变化)

NI(nice值):进程优先级的修正数据。

进程真实的优先级=PRI(默认)+NI

所以我们可以通过更改nice值来修改进程的优先级,但我们一般不建议随便修改进程的优先级,因为如果我们频繁的修改进程的优先级会破坏系统的调度平衡。

top命令修改优先级

输入top命令按下回车

再输入r(renice)

接着输入我们要修改进程的pid后回车,这里我创建了一个进程pid为1845365

最后我们再修改nice值即可,这里我就先把nice值修改为10

修改成功后,我们再查看该进程的优先级,发现PRI变成了30(这里默认的优先级是20),并且NI值变为了10。

 这里我们再把NI值修改成-10(这里在user2用户中已经不让修改了,所以我们在root用户中修改)

按照惯性思维,这里调整为-10后,PIR应该为30-10=20,但事实却并不如此。这也说明了,PIR的默认值是永远不变的。而操作系统这样设计的目的是为了让我们方便操作,当我们要修改一个进程的优先级时,我们不必查看该进程的历史优先级,直接在默认优先级的基础上修改即可!

其他修改进程优先级的方法:nice,renice(命令),getpriority(系统调用)

3.优先级的极值问题

。修改nice值为-100,发现PRI=0,NI=-20

。修改nice值为100,发现PRI=39,NI=19 

。所以NI的范围【-20,19】

。PRI的范围     【0,39】

所以Linux中进程的优先级总共有40个,而操作系统为什么不敢把优先级设置多一点呢,原因也很简单:为了确保进程获得cpu资源的相对公平性,如果有用户恶意将自己的进程优先级每次都设为最高,那就会有优先级低的进程始终得不到资源进而导致进程饥饿。

最后,这里其实还有一个问题,为什么要设有nice值呢,我们直接修改PIR不好吗?这里现在还说不清楚,和进程的切换和调度有关,后面在说Linux内核中的真实调度算法时会说清楚啦!

相关文章:

  • 小白如何使用Cursor运行python程序(含环境配置教程)
  • ts中null类型--结合在vue中的使用、tsconfig.json
  • Spring框架学习(中)
  • 电子设备的“记忆大脑”:NAND、NOR、EEPROM谁在掌控你的数据?
  • 【防火墙 pfsense】2配置
  • 软件工程-进度管理-PERT图Gantt图
  • 力扣-141.环形链表
  • Python数据分析案例73——基于多种异常值监测算法探查内幕交易信息
  • 系统设计(1)—前端—CDN—Nginx—服务集群
  • conformer编码器
  • RFID使用指南
  • MODBUS转ProfiNet边缘计算网关驱动霍尼韦尔HPT温湿度仪表的动态控制闭环方案
  • Trae 实测:AI 助力前端开发,替代工具还远吗?
  • 2025年PTA天梯赛正式赛 | 算法竞赛,题目详解
  • 从 0 开始认识 WebSocket:前端实时通信的利器!
  • LabVIEW基于VI Server的控件引用操作
  • PTC加热片详解(STM32)
  • 代码随想录算法训练营day11(二叉树)
  • openwrt查询网关的命令
  • Android 14 系统统一修改app启动时图标大小和圆角
  • 上海明天起进入“升温通道”,五一假期冲刺33℃
  • 商务部:入境消费增长潜力巨大,离境退税有助降低境外旅客购物成本
  • 持续更新丨伊朗港口爆炸事件已致561人受伤
  • 三大猪企去年净利润同比均较大幅度增长,资产负债率齐降
  • 三部门提出17条举措,全力促进高校毕业生等青年就业创业
  • 政治局会议:持续稳定和活跃资本市场