Linux 第十五讲 --- 进程篇(五)优先级与Linux的进程调度

前言:

在上一讲《Linux 第十四讲 —— 进程篇(四)环境变量与命令行参数》中,我们深入探讨了进程运行时的环境变量传递机制和命令行参数的实际应用。这些知识帮助我们理解了进程如何通过外部输入动态调整行为,同时也为多任务场景下的程序交互提供了基础支持。

从本讲开始,我们将聚焦于进程的“资源竞争”与“调度策略”,这是操作系统在多任务环境下实现高效资源管理的核心机制。具体来说,我们会学习进程优先级的概念及其在Linux中的实现方式,同时剖析Linux内核的进程调度算法(如CFS完全公平调度器)。通过理解优先级调整工具(如nicerenice命令)和调度策略的实际应用,你将从系统层面掌握如何优化进程的执行效率,平衡不同任务的资源占用,从而更深入地体会Linux作为多用户、多任务操作系统的设计哲学。


目录

前言:

一、什么是进程优先级?

1.1 基本概念

1.2 优先级存在的原因?

二、查看进程优先级

2.1 查看进程优先级

 2.2 PRI与NI

三、改变进程的优先级

3.1 使用函数接口

3.2 使用 renice指令

3.3 通过top命令更改进程的nice值

四、四个Linux的高频概念

四、进程优先级的相关话题

4.1 饥饿问题

4.2  进程切换

总结:


一、什么是进程优先级?

1.1 基本概念

什么是优先级?
优先级实际上就是获取某种资源的先后顺序,而进程优先级实际上就是进程获取CPU资源分配的先后顺序,就是指进程的优先权(priority),优先权高的进程有优先执行的权力。

1.2 优先级存在的原因?


优先级存在的主要原因就是资源是有限的,而存在进程优先级的主要原因就是CPU资源是有限的,一个CPU一次只能跑一个进程,而进程是可以有多个的,所以需要存在进程优先级,来确定进程获取CPU资源的先后顺序。

避免某个进程长时间不能在CPU运行,导致饥饿问题。


二、查看进程优先级

2.1 查看进程优先级

在Linux或者Unix操作系统中,:我们输入ps -l/ps -al指令后就可以看到进程优先级相关的属性:

 我们重点讲解下面几个元素。

  • UID : 代表执行者的身份
  • PID : 代表这个进程的代号
  • PPID :该进程的父进程的代号
  • PRI :代表这个进程可被执行的优先级,其值越小越早被执行
  • NI :代表这个进程的nice值

 2.2 PRI与NI

  1. PRI代表进程的优先级(priority),通俗点说就是进程被CPU执行的先后顺序,该值越小进程的优先级别越高。
  2. NI代表的是nice值,其表示进程可被执行的优先级的修正数值。
  3. PRI值越小越快被执行,当加入nice值后,将会使得PRI变为:PRI(new) = PRI(old) + NI。
  4. 若NI值为负值,那么该进程的PRI将变小,即其优先级会变高。
  5. 调整进程优先级,在Linux下,就是调整进程的nice值。
  6. NI的取值范围是-20至19,一共40个级别。

注意: 在Linux操作系统当中,PRI(old)默认为80,即PRI = 80 + NI。


三、改变进程的优先级

3.1 使用函数接口

方法1:通过系统调用接口去调整进程的优先级。例如下面这个系统接口,具体有哪些接口和如何使用这些系统接口,可以查询CSDN等博客以及Linux中的man手册。

当然了,这种办法是在是太冷门了,基本上没有程序会内置一个改变优先级的方法。

这个方法,我们不演示,我们更多的是介绍下面的两种通过指令实现的方法。

3.2 使用 renice指令

使用renice命令,后面跟上想要更改后的nice值和进程的PID即可【需要提权】。

之后我们再用ps命令查看进程的优先级信息,也可以发现进程的NI变成了10,PRI变成了90(80+NI) 

注意: 若是想使用renice命令将NI值调为负值,需要使用sudo命令提升权限。

3.3 通过top命令更改进程的nice值

top命令就相当于Windows操作系统中的任务管理器,它能够动态实时的显示系统当中进程的资源占用情况。

 

使用top命令后按“r”键,会要求你输入待调整nice值的进程的PID。

输入进程PID并回车后,会要求你输入调整后的nice值。

当然由于使用的是普通账号没有权限,演示不了改变后的顺序,但是大概的流程就是这样了。 

就是类似于renice的操作

注意: 若是想将NI值调为负值,也就是将进程的优先级调高,需要使用sudo命令提升权限。

注:我们可以使用指令或者接口改变某个进程的优先级但是我们人为的再怎么改变都是不能超过系统的限制的,即NI 【-20,19】 


四、四个Linux的高频概念

  1. 竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便有了优先级。
  2. 独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰。
  3. 并行: 多个进程在多个CPU下分别同时进行运行,这称之为并行。
  4. 并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发。
  5. 并行vs并发

不过这里需要说明一点:我们家用电脑的CPU并不存在真正的并行,不是在同时运行,我们的电脑一般是单CPU,都没法做到真正的并行,虽然你看起来是多个进程在同时运行,即可以一边打开CSDN,也打开网易云音乐听摇滚,同时也可以QQ聊天,但是这不过是进程在CPU上快速切换实现的,这其实是并发!!!并行是在任何一个时刻,都有两个及以上的进程在运行,并发是一个时间段内,多个进程的推进。


四、进程优先级的相关话题

4.1 饥饿问题

为什么nice值(即优先级)是一个较小的取值范围?

我们可以通过调整Nice值,来调整优先级PRI。可是Nice值为什么要是一个相对比较小的范围(NI :-20 -- 19)呢?

这样的话PRI优先级可取的范围就只有40个等级了,为什么不可以让(NI范围)优先级PRI的取值范围变大呢?

这是因为,无论优先级怎么设置,也只能是一种相对的优先级,而不能出现绝对的优先级。

如果优先级可以设置为较大的范围,会出现很严重的“进程饥饿”问题。

比如在食堂打饭的时候,有人插队,有人被插队,那就是这个人在调整TA的优先级。如果一个人可以设置的优先级范围很大(假设-1亿--1亿),可以任意设置自己的优先级,则超过别的低优先级的进程的几率就会变大,也就是说现在一堆人都可以任意的插队,范围过大,则他们这一堆调整优先级的可以插队的人就都可以插我的队,因为我相较于他们的优先级都变低,就会很可能导致这些进程长时间得不到CPU资源,就会出现进程饥饿问题。

所以在Linux操作系统中,nice值(即优先级)的范围只有40个等级,这就很好的防止了优先级取值范围过大,进程饥饿问题出现的问题。

再补充一点,在Linux操作系统中,有一个调度器,其功能是较为均衡的让每个进程享受到CPU资源,就是让插队现象出现的食堂打饭场景中,让大家都能吃到饭!调度器可以让一个进程往前插,往前先打饭,不能让一个进程由于优先级太低而一直被插队,而导致该进程"饥饿"。

nice值(优先级)较小范围的设置,以及调度器机制,可以让进程的优先级更为均衡,以至不会出现严重的“进程饥饿”问题。

当然这只是我们在Linux操作系统得出的结论,换到其他系统可能就不适用了。

比如,车载系统上遇到突发事故,要刹车了,不能说音乐进程没结束,就不能执行刹车吧?

这样的问题都是要结合具体的场景来看的。

4.2  进程切换

一个CPU里面存在一套硬件寄存器,宏观上寄存器分为用户可见,用户不可见。

计算机调度某个进程时,CPU会把这个进程的PCB地址加载到某个寄存器,也就是说,CPU内只有寄存器可以找到进程的PCB地址。

CPU里有一个eip寄存器(PC指针),指向当前执行指令的下一条指令的地址。

而进程运行的时候一定会产生很多的临时数据,但这些临时数据只属于当前进程,虽然CPU内部只有一套寄存器硬件,但是寄存器保存的数据只属于当前进程,也就是说,寄存器硬件不是寄存器内的数据,这是两码事,寄存器被所有进程共享,但是寄存器里的数据时每个进程各自私有的。

时间片引出

进程在运行的时候占有CPU,但是却不是一直占有到进程结束,进程都有自己的时间片!因为时间片的存在,进程会出现没有被执行完就被拿下去的情况,这时候问题来了:这个进程下一次如何在次回到CPU继续运行:

进程切换的时候,需要先进行上下文保护,这里的上下文指的是CPU里的寄存器的数据,而不是寄存器,这里简单理解为临时数据保存至PCB里,而当进程恢复运行的时候,要进行上下文的恢复,该进程在次回到CPU继续运行时,重新加载恢复这些数据。


总结:

通过本节内容的学习,我们掌握了进程优先级的意义及其在Linux中的实践方法,同时分析了内核调度算法的核心思想。这些知识是理解操作系统如何协调多个进程共享CPU资源的关键,也为后续学习进程间通信(IPC)和系统性能调优奠定了基础。

在下一讲《Linux —— 进程地址空间》中,我们将转向进程的“内存视角”,深入探讨虚拟内存管理机制。从进程的地址空间布局(如代码段、堆、栈)到内存映射技术(如mmap),我们将揭示操作系统如何通过抽象和隔离内存资源,保障进程的安全性与独立性。理解这一机制,是掌握现代操作系统内存管理精髓的重要一步,敬请期待!

我们下一讲见!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值