Linux系统编程进程优先级

文章目录

  • 1. 优先级的基本概念
  • 2. 为什么存在优先级
  • 3. 查看系统进程
  • 4. PRI and NI
  • 5. top命令修改已存在进程的nice值
  • 6. 其他概念

1. 优先级的基本概念

本篇文章讲解进程优先级,首先我们来了解一下进程优先级的概念:

  1. cpu资源分配的先后顺序,就是指进程的优先级(priority)。
  2. 优先权高的进程具有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。
    还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能。

这是优先级的概念

我们之前学习过权限,权限决定的是能不能的问题。比如你想对某个文件进行修改操作,那要看你有没有对应的权限,有的话,你才能做。
而优先级呢是在能做的基础上,决定谁先谁后的问题。
比如我们在学校吃饭,餐厅的窗口数量是有限的,我们去买饭的时候如果人比较多那我们需要排队。那排队的这些学生,它们都可以打饭,但是要有一个先后顺序,那正常情况下排在前面的同学它打饭的优先级就高,可以先打;排在后面的同学优先级就低。

2. 为什么存在优先级

那为什么会存在优先级呢?

资源有限。
就好比我们在学校买饭为什么要排队呢?为什么要有先后呢?
因为窗口的数量有限,如果一个学生一个窗口,那就不用排了。
那进程为什么也有优先级呢?
因为CPU资源有限。

那我们了解了什么是优先级和为什么存在优先级之后,下面我们就来具体看看Linux上进程的优先级是什么样子的:

3. 查看系统进程

在Linux上,使用ps -l命令可以查看当前正在运行的进程列表,并提供关于这些进程的详细信息:

在这里插入图片描述
我们很容易注意到其中的几个重要信息,有下:
UID : 代表执行者的身份
PID : 代表这个进程的代号(进程标识符)
PPID :代表这个进程是由哪个进程发展衍生而来的,亦即父进程的代号/PID
PRI :代表这个进程可被执行的优先级,其值越小越早被执行
NI :代表这个进程的nice值,是进程优先级的修正数据

那这里我们重点要来谈一谈PRI和NI

4. PRI and NI

PRI:

PRI即进程的优先级,或者通俗点说就是程序被CPU执行的先后顺序,也还是比较好理解的,此值越小进程的优先级别越高

NI(NICE):

nice值,表示进程可被执行的优先级的修正数据
PRI值越小越快被执行,那么加入nice值后,将会使得PRI变为:PRI(new)=PRI(old)+nice

这样:

当nice值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行
所以,调整进程优先级,在Linux下,通常就是调整进程nice值
nice其取值范围是-20至19,一共40个级别

5. top命令修改已存在进程的nice值

那下面我们就来演示一下,如何修改进程优先级

我们来写这样一个代码:

在这里插入图片描述
死循环打印.,每次printf之后休眠一秒。
这里的fflush函数我们之前进度条那篇文章讲过,这里就不再解释了
然后我们执行这个程序:
在这里插入图片描述
在这里插入图片描述
它就每隔一秒打印一个点。

那这时:

让这个进程跑起来,然后我们执行ps -al
a选项: 显示终端上的所有进程,包括其他用户的进程。
在这里插入图片描述
然后我们就能看到我们的这个myproc进程,它的PRI是80,NI是0

那如果我现在想修改它的优先级,怎么做呢?

这里用到的命令——top
输入一个top,回车
在这里插入图片描述
然后输入r(renice)
在这里插入图片描述
然后,你要修改那个进程的NICE值,就输入谁的PID,这里myproc的PID是20796
在这里插入图片描述
然后,再输入要修改的值,那我这里输入一个-20
在这里插入图片描述
但是我们看到这里显示请求被拒绝了。
怎么回事呢?

修改 NI 值时有几个注意事项:

NI 范围是 -20~19。
普通用户调整 NI 值的范围是 0~19,而且只能调整自己的进程。
普通用户只能调高 NI 值,而不能降低。如原本 NI 值为 0,则只能调整为大于 0。
只有 root 用户才能设定进程 NI 值为负值,而且可以调整任何用户的进程。

所以怎么办呢?

我们可以切换成root;或者可以使用sudo提升top命令的权限
所以我们这次输入sudo top
然后同样的操作
在这里插入图片描述
这次就成功了。
当然还有一点就是上面说NI 范围是 -20~19。那如果我们设置的时候超出了这个范围,可以吗?
??,你输入的值可以超出这个范围比如-30,但是最终的结果还是按-20。不会超过这个范围。

我们再来是一个,我们NICE给个正值,让PRI变大看看:

在这里插入图片描述
我们给个100,那PRI真的会+100嘛,当然不行,它超过范围[-20,19]了,所以真实应该是19。
那按照上面说的PRI(new)=PRI(old)+nice
上次我们修改之后PRI是60,那60+19应该是79

我们看看是不是79:

在这里插入图片描述
欸,怎么回事,不是79,而是99。

为什么呢?

PRI(new)=PRI(old)+nice
公式确实是这样的,但是这个PRI(old)它的值,一直都是80,虽然上一次我们修改之后它的PRI是60。
但是这个PRI(old)不受影响,它一直都是80。

6. 其他概念

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

我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:链接: https://cloud.tencent.com/developer/support-plan?invite_code=1ir8xlw6mwx5w