本篇文章讲解进程优先级,首先我们来了解一下进程优先级的概念:
- cpu资源分配的先后顺序,就是指进程的优先级(priority)。
- 优先权高的进程具有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。
还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能。
这是优先级的概念
我们之前学习过权限,权限决定的是能不能的问题。比如你想对某个文件进行修改操作,那要看你有没有对应的权限,有的话,你才能做。
而优先级呢是在能做的基础上,决定谁先谁后的问题。
比如我们在学校吃饭,餐厅的窗口数量是有限的,我们去买饭的时候如果人比较多那我们需要排队。那排队的这些学生,它们都可以打饭,但是要有一个先后顺序,那正常情况下排在前面的同学它打饭的优先级就高,可以先打;排在后面的同学优先级就低。
那为什么会存在优先级呢?
资源有限。
就好比我们在学校买饭为什么要排队呢?为什么要有先后呢?
因为窗口的数量有限,如果一个学生一个窗口,那就不用排了。
那进程为什么也有优先级呢?
因为CPU资源有限。
那我们了解了什么是优先级和为什么存在优先级之后,下面我们就来具体看看Linux上进程的优先级是什么样子的:
在Linux上,使用ps -l
命令可以查看当前正在运行的进程列表,并提供关于这些进程的详细信息:
我们很容易注意到其中的几个重要信息,有下:
UID : 代表执行者的身份
PID : 代表这个进程的代号(进程标识符)
PPID :代表这个进程是由哪个进程发展衍生而来的,亦即父进程的代号/PID
PRI :代表这个进程可被执行的优先级,其值越小越早被执行
NI :代表这个进程的nice值,是进程优先级的修正数据
那这里我们重点要来谈一谈PRI和NI
PRI:
PRI即进程的优先级,或者通俗点说就是程序被CPU执行的先后顺序,也还是比较好理解的,此值越小进程的优先级别越高
NI(NICE):
nice值,表示进程可被执行的优先级的修正数据
PRI值越小越快被执行,那么加入nice值后,将会使得PRI变为:PRI(new)=PRI(old)+nice
这样:
当nice值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行
所以,调整进程优先级,在Linux下,通常就是调整进程nice值
nice其取值范围是-20至19,一共40个级别
那下面我们就来演示一下,如何修改进程优先级
我们来写这样一个代码:
死循环打印.
,每次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。
竞争性:系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级
独立性:多进程运行,需要独享各种资源,多进程运行期间互不干扰
并行:多个进程在多个CPU下分别,同时进行运行,这称之为并行
并发:多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发。