前言
我们现在了解了进程是什么,进程状态表示什么 ,我们现在继续来了解进程的属性 —— 进程优先级
进程执行者
在了解进程优先级之前,先来思考一个问题:在我们进行文件访问操作时,操作系统是如何直到我们是谁(拥有者
、所属者
或者other
)的?
我们知道指令它其实就是进程,所以我们进行文件访问操作,本质上就是进程进行访问,那操作系统是如何知道进程它是谁呢?
在进程的task_struct
中,存在一个UID
,它表示user id
就是用户的id
我们可以使用ps -l
命令来查看:
通过上图我们可以发现进程属性UID
、PID
、PPID
、PRI
、NI
等
PID
是进程的id
,PPID
是进程的父进程的id
;
UID
:表示user id
,执行者的id
;
PRI
、NI
:和进程的优先级相关,本篇文章后面详细讲解。
我们使用ls -l
时,它会显示出来文件的拥有者、所属组,但都是以用户名的形式显示出来的;
我们可以通过ls -ln
,查看文件时将用户名以数字形式显示出来;
进程优先级
首先,优先级是什么?
CPU
资源分配的先后顺序,就指进程的优先权- 优先权高的进程具有优先执行的权利
简单来说,进程优先级就是进程等到CPU
资源的先后顺序。
这里我们要理解一下优先级和权限
优先级:是决定得到某种资源的先后顺序。
权限:是决定是否能够得到某种资源。
为什么要存在优先级呢?
简单来说就是,目标资源短缺,我们要通过优先级来确定先后顺序。
那在Linux
中,我们如何查看进程的优先级呢?
查看进程优先级
在上述中提到了ps -l
,我们可以通过ps -l
指令来查看进程的优先级:
但是,在Linux
中优先级是如何表示的呢?
PRI
和NI
这里感觉怪怪的,进程优先级为什么要使用两个值来表示呢?
PRI
:表示进程的优先级,默认是80
;NI
:表示进程优先级的修正数值;也称为进程的nice
值。我们进程实际的优先级 =
PRI(默认)
+NI
PRI
PRI
表示进程当前的优先级,它的默认值是80
;
这个非常好理解,就不过多描述了。
NI
NI
:nice值表示进程可被执行的优先级的修正数值。当
nice
值为负数时,该进程的优先级值就会变小,优先级就变高,更快的被执行在
Linux
下,我们调整优先级就是调整nice
值。
nice
的取值范围是[-20 , 19]
。
这里进程的PRI
和NI
都不是进程真实的优先级,进程真实的优先级P = PRI + NI
这里我们可以通过修改NI
值进而影响进程的优先级。
修改进程优先级
我们修改进程优先级,并不是直接修改进程的优先级值,而是通过修改nice
值来改变进程的优先级
我们可以通过top
来修改已经存在进程的优先级:
这里,我们修改过一次进程的
NI
值之后,再次修改会发现,无法进行修改了;这是因为操作系统为了防止恶意修改进程优先级,只允许普通用户对进程修改一次优先级;
root
可以多次修改进程优先级。
这里我们还需要注意:
我们每次修改
NI
值之后,进程优先级都是等于PRI
的默认值(也就是80
)加上NI
值。
nice
和renice
除了使用top
来修改进程的NI
值之外,我们还可以使用nice
和renice
来修改
nice
nice
指令,在程序启动时,修改程序进程的NI
值。
nice -n 10 ./code
这个指令就是在./code
程序运行时,将nice
修改为10
。
renice
nice
指令是在程序启动时(创建进程时),就给定NI
值;而renice
指令则是修改已有进程的NI
值,从而修改进程优先级。
这里我们除了通过top
、nice
和renice
指令来查看和修改进程优先级之外,我们还可以通过系统调用,在代码中查看和修改进程的优先级
getpriority
:获取当前进程的优先级;
setpriority
:修改当前进程的优先级。
可以看到这两个函数都是系统调用,这里就不过多描述了;
在后续内容中遇到了再详细讲解。
这里,普通用户只能修改一次进程的优先级!!!
进程优先级的范围
我们可以修改Ni
,从而影响进程的优先级,但是我们不能把NI
修改的非常大或者非常小吧;
NI
值的取值范围:[-20,19]
(一共40
个数据)
进程优先级的范围:[60 , 99]
(一共40
个优先级)
可以看到进程NI
值的范围的确是[-20 , 19]
;进程优先级的范围的确是[60 , 99]
。
理解竞争、独立、并发、并行
进程具有竞争性、独立性、并行、并发;
- 竞争性:系统中的进程非常多,而
CPU
资源只有很少的一部分,所以进程之间是具有竞争属性的;为了使效率更高,更好的完成认为,更合理的竞争资源,就有了优先级这一概念。- 独立性:多进行运行,需要独自享有各种资源,多进程运行之间互不影响。
- 并行:多个进程在多个
CPU
下分别,同时运行,称为并行- 并发:多个进程在一个
CPU
下采用进程切换的方式,在这一段时间内,多个进程都得以推进,称为进程的并发。
到这里,本篇文章的内容就结束了
简单总结:
- 了解了进程的优先级
- 进程
PRI
和NI
- 查看和修改进程的优先级(
NI
值)- 进程的特性(竞争性、独立性、并行、并发)