[入门篇]Linux进程优先级详解,我不信你看不懂

目录

0.前言

1.进程优先级

1.1 引入进程优先级

 1.2 为什么要有优先级

1.3 查看优先级的方法

1.4 PRI值与NI值

1.4.1 PRI值简介

1.4.2 NI值简介

1.4.3 PRI和NI关系

1.5 如何改变进程的优先级

1.5.1 不常用的两种方法

1.5.2 使用top指令

1.6 补充知识


0.前言

在上一篇博客当中,我们初步了解了fork创建子进程的逻辑,以及进程状态的详解,下面是链接,本篇博客我们着重讲解进程的优先级。

(4条消息) [入门篇]Linux操作系统fork子进程的创建以及进程的状态 超超超详解!!!我不允许有人错过!!!_yuyulovespicy的博客-CSDN博客icon-default.png?t=M85Bhttps://blog.csdn.net/qq_63992711/article/details/127574290?spm=1001.2014.3001.5502同时这也是我们对Linux操作系统进程理解的第三篇博客,全部看完一定会有巨大收获。

本文所有代码已经上传到Gitee码云,有需要的同学可以自取:

practice9 · onlookerzy123456qwq/Linuxtwo - 码云 - 开源中国 (gitee.com)icon-default.png?t=M85Bhttps://gitee.com/onlookerzy123456qwq/linuxtwo/tree/master/practice9正文开始:

1.进程优先级

1.1 引入进程优先级

在之前的博客中我们知道,进程的运行,是在CPU上执行,每次执行只能执行CPU的一个时间片,会有多个进程在run_Queue运行队列上等待CPU的调度执行。

不同的进程PCB在run_Queue中等待CPU资源,在CPU中执行,然后再回到run_Queue中继续等待CPU资源,这样进程循环不断的等待与执行,就是进程运行的基本逻辑

[入门篇]Linux进程优先级详解,我不信你看不懂_第1张图片

进程在运行队列中等待的过程,本质其实是各个进程在排队的过程。

就像在食堂打饭,在单位领取福利有半路插队的情况有的人可以优先打到饭,可以优先领到福利,有的人却一直被插队,只能很后面打到饭或领到福利。插队的人通常可以走后门,权势高于其他队中的人,或者武力值很高,谁都惹不起所以他们可以插队。相对的,相较队中体更弱的人,更没有什么权势的人,就只能被插队,排到后面去,较晚才能领到资源。

进程在运行队列里排队领取CPU资源的过程也是这样的。

[入门篇]Linux进程优先级详解,我不信你看不懂_第2张图片

在进程排队的过程中,衡量谁先后领到资源的标准进程的优先级。优先级高的进程可以在运行队列排队过程中"优先"领到CPU资源;优先级低的进程,则是会被"插队",相对靠后享受到CPU资源。

 1.2 为什么要有优先级

再比如在食堂,我们作为学生需要在有限的窗口中,排队打饭。因为我们不可能给每一个学生都开一个窗口,不可能给每一个学生都开一个小灶,当然如果每个学生都开一个小灶的话,此时优先级就失去意义了,因为此时不需要排队了,人人平等,没有谁先谁后接受资源一说了。但是现实中,我们在一层食堂中,也就开20个窗口,为什么不给所有学生都开一个窗口呢?因为我们的资源太少了!我们没有足够的资源开几千个的打饭窗口。所以20个窗口需要好几千的学生进行排队打饭,而排队就存在优先级谁先谁后接收资源的问题,就存在插队被插队的问题

所以优先级的本质其实是分配资源的一种方式!!!

其实不止CPU资源的分配,还有网卡资源,硬盘资源等待,都需要对多个进程进行分配。分配就需要有排队,排队过程就需要队列和谁先谁后的凭据

所以我们有CPU资源的运行队列,有网卡,硬盘资源的等待队列,来供多个进程进行排队申领;所以我们的每个进程PCB中都有一个叫优先级的字段,来确认这个进程可以先/后申请到某种资源。

1.3 查看优先级的方法

我们首先跑起来几个进程。

[入门篇]Linux进程优先级详解,我不信你看不懂_第3张图片

我们通常使用 ps -al 指令来正在运行进程的优先级。

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

[入门篇]Linux进程优先级详解,我不信你看不懂_第4张图片

 简要介绍一下,如图,PRI(Priority),就是该进程的优先级大小,图中三个进程的优先级大小是80;三个进程的NI(nice)值是0,优先级的修正数据都为0。

还有一项UID:类比一下,在现实中我们每个人都有自己的姓名,张三李四王五赵六等等等,在平常中父母同学用这个标识你,每个人也有自己的身份证号xxxxxxxxxxxxxxxxxx,是你在我们中国中唯一的标识,在国家眼中你是一个身份证号。同样的,进程可以有自己的名字叫myproc,进程的UID就像人的身份证号,是进程在系统中的标识。

1.4 PRI值与NI值

[入门篇]Linux进程优先级详解,我不信你看不懂_第5张图片

1.4.1 PRI值简介

首先PRI值的确是现在这个进程的优先级大小决定了这个进程在运行队列中可以被CPU执行的先后顺序,这点毋庸置疑。

但是有一个坑的地方需要注意:PRI值越小,表明这个进程的优先级越高,越容易被CPU执行到。PRI值越大的进程优先级越低,越难以被CPU执行到。

1.4.2 NI值简介

NI值nice值其实是进程优先级的修正数据,我们给出这个公式 PRI(now) = PRI(start) + NI(now)Linux操作系统中,我们是通过修改NI值的方式,来修改PRI优先级的大小NI值的取值范围是-20--19

例如,如图所示PRI(start)==80,而NI是0,则现在PRI(now)的值就是80+0=80。再比如,当NI的值是7的时候,那现在进程优先级大小PRI(now)就等于80+7=87。比如你要提高一个进程的优先级想设置PRI的值为65,那你就需要设置NI值为-15,此时PRI(now)就变成了80-15=65了。比如你想降低一个进程的优先级,你就要把NI设置大一点,

那为什么Linux操作系统中,不是直接把PRI的值改为65,而是要通过把NI值设置为-15的方式,来间接设置PRI为65呢?为什么要采用这种间接修改nice值的方式来提高(或降低)进程优先级呢?

Linux这么做的原因是:设置NI值可以随便查看到该进程优先级的修改幅度,如果NI的绝对值大,就可以直接看出来这个进程的优先级修改幅度是很大的。例如现在NI值是-20,那我们就可以直接看出这个进程的优先级修正幅度非常大(NI取值范围-20--19),这个进程的优先级被修改的非常高

1.4.3 PRI和NI关系

1.进程的nice值不是进程的优先级,PRI值才是进程的优先级大小,PRI和NI并不是同一个概念,不过NI值一定程度上决定了进程的优先级PRI值。PRI(now) = PRI(start) + NI(now)

2.在Linux操作系统中,我们是通过修改nice值的大小来间接调整现在PRI值的大小。PRI反映了进程现在优先级的大小,NI值反映了进程优先级相对初始值的修改程度。

1.5 如何改变进程的优先级

1.5.1 不常用的两种方法

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

[入门篇]Linux进程优先级详解,我不信你看不懂_第6张图片

 不常用的方法2:使用renice指令去调整进程优先级[入门篇]Linux进程优先级详解,我不信你看不懂_第7张图片

1.5.2 使用top指令

我们首先获取检测到一个正在运行进程的PID,然后我们就可以根据这个获取到的PID,使用top指令来调整这个进程的NI值,从而间接修改这个进程的PRI优先级大小。

 1. 获取欲修改优先级进程的PID

 2. 使用top指令

[入门篇]Linux进程优先级详解,我不信你看不懂_第8张图片

下面我们在top指令状态下调整NI值从而调整PRI优先级。

3. 首先输入 r ,表明我们要调整优先级。

4. 然后输入进程的PID值(如29844),表面我们要针对的是29844该进程。

5. 在set value之后,输入想设置的NI值。如输入5,表明把NI设置为5,则该进程的PRI值就修正为85。

[入门篇]Linux进程优先级详解,我不信你看不懂_第9张图片

 输入r键  ->  输入进程PID(29844)  ->  输入新NI值(5)。

NI设置为5,则该进程的PRI值就修正为80+5 == 85,这个进程的优先级就降低了。

[入门篇]Linux进程优先级详解,我不信你看不懂_第10张图片

 我们再举几个例子:

设置NI(nice值)为8 ,我们看一看进程 PRI : NI 会不会变成 88 :8。

[入门篇]Linux进程优先级详解,我不信你看不懂_第11张图片

[入门篇]Linux进程优先级详解,我不信你看不懂_第12张图片

NI的范围是 -20--19 , 那我们如果把NI值设置超过这个范围会发生什么呢?例如我们如下把NI设置为20,超过这个NI的范围。

[入门篇]Linux进程优先级详解,我不信你看不懂_第13张图片

可见,当我们设置NI值超过最大值19时,如设置NI为20,21,22,30,100...比19大的值,NI值只会设置为最大的19,PRI值也最大只能到99此时该进程的优先级也达到系统中的最低。

同样的,NI值最小只能为-20,我们设置NI比-20还小,如-21,-22,-23,-25,-30,-40,-100...比-20小的值,NI值也只会设置为最小的-20,PRI值也最小只能到60,此时该进程的优先级也达到系统中的最高。

1.6 补充知识

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

我们可以通过调整Nice值,来调整优先级PRI。可是Nice值为什么要是一个相对比较小的范围(NI :-20 -- 19)呢?这样的话PRI优先级可取的范围就只有40个等级了,为什么不可以让(NI范围)优先级PRI的取值范围变大呢?

这是因为,无论优先级怎么设置,也只能是一种相对的优先级,而不能出现绝对的优先级。如果优先级可以设置为较大的范围,会出现很严重的“进程饥饿”问题。

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

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

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

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

补充知识2 进程所具有 的性质

1. 竞争性

系统之中有很多的进程,每个进程的运行都想要使用CPU资源,不然就只能在CPU的等待队列中排队等待,而CPU只有少量或一个(单核CPU),所以进程与进程之间天然具有竞争属性。各个进程为了合理的分配有限的资源,规定先后排队先后享用CPU的顺序,所以就有了优先级这个概念。

2.独立性

进程与进程之间,相互独立,互不干扰,各自独享各种资源。

3.并行

多个进程在多个CPU下分别,同时在运行,这个称为并行。

4.并发

多个进程在一份CPU下,采用快速的进程切换的方式,进行多次的每次短时间片的执行。在一段时间内,让多个进程都得以推进,称之为并发。

5.并行vs并发

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

你可能感兴趣的:(Linux操作系统-系统编程,linux,运维,服务器,c语言,vim)