1、什么是优先级?
进程需要某一种资源,而系统要通过特定的方式来决定谁先获得这些资源,而系统的做法就是给不同的进程安排不同的优先级。让优先级高的进程先享有一些资源。
2、为什么要有优先级
因为资源的缺乏,所以系统的才会设置优先级来安排哪一个进程先享有某些资源。在我们的电脑上可能只有一块cpu。但是,我们可能有上百个进程需要运行,这时候cpu资源就变得很紧缺了,所以我们就需要用优先来确定哪些进程可以先享有这些资源。
3、在Linux中的优先级
这里我们可以用一段简单的代码看看liunx系统中的优先级。
运行这段代码,并用ps -al 命令查看进程状态(这里ps -al 命令其实就是显示该用户运行的进程的情况)
这里右侧就是ps命令的执行结果,其中,我们可以看到一列PRI,这个就一般就可以看作linux系统下的优先级,而在我们的进程的task_struct里面,PRI其实就是一个整数。而这个整数默认一般都是80。(在其他操作系统中,默认值可能略有不同)。
在linux系统中,这个优先级是可以被修改,而linux的优先级的范围区间是[ 60 , 99 ],这里面有40个优先级,而这个表示优先级的数字越小,优先级越高。而在linux默认的优先级值是80(这里的PRI是内核调度器根据nice值来计算的,nice值的取值范围是[-20,19],这个nice是优先级的修正值。但是需要注意的,系统的PRI不一定是80,不同系统的PRI可能不同,这个值的计算也受多种因素的影响,主要分为这几个:
-
nice值:这是用户可以通过
nice
命令设置的一个值,用于调整进程的优先级。nice值的范围是从-20到19,其中-20表示最高优先级(对于普通用户),19表示最低优先级。nice值越高,进程的优先级越低。 -
进程的调度类:Linux支持实时(RT)和标准(SCHED_OTHER)两种调度类。实时进程通常具有较高的优先级,可以抢占标准进程的CPU时间。
-
进程的状态:如等待(sleeping)、运行(running)、阻塞(blocked)等。不同的状态可能会影响进程的调度优先级。
-
进程的调度策略:Linux有多种调度策略,如CFS(Completely Fair Scheduler)、RR(Round Robin)等。不同的策略会对进程的优先级有不同的处理方式。(CFS其实算一个进程调度器,其调度策略是公平的,每个进程都可以得到公平的CPU时间)
-
CPU亲和性:进程可以绑定到特定的CPU核心上,这可能会影响其优先级。绑定到高优先级核心的进程可能会获得更多的CPU时间。
-
进程的优先级队列:在某些调度策略中,如CFS,进程会被分配到一个优先级队列中。队列的优先级会影响进程的调度顺序。
-
进程的调度权重:在某些调度策略中,如CFS,每个进程都有一个调度权重,这会影响进程的调度优先级。
-
CPU负载:如果系统处于高负载状态,调度器可能会调整进程的优先级以保证系统的稳定性和响应性。
-
系统配置:系统管理员可以通过修改系统配置文件(如
/etc/sysctl.conf
)来全局性地调整进程的优先级。
)
如果我们需要修改修改优先级,我们就可以根据上面的影响因素来对优先级进行调整(这里一般不建议随意调整),这里只介绍通过nice值调整优先级,其他方法可自行查阅(通过将进程调整为实时调度策略,cpu亲和性,修改系统文件改变进程调度权重等等)
这里我们可以先运行一个程序
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<stdlib.h>int main()
{while(1){printf("I am a process, pid:%d\n,",getpid());sleep(1);}return 0;
}
然后打开top监视窗口,按R键,此时光标闪动的地方就是需要输入我们想要修改的进程的PID.
然后修改我们的nice值,输入10(意思就是让这个进程的优先级增加10)
此时我们就会发现,修改完后的PRI变成了90,NI(nice值)变成了10。这里的PRI = PRI(old) + nice ,需要注意的是,这里的nice值是覆盖式写入,意思就是第二次假如我输入的是-10,那这里的NI,就会变成-10,而不是0。同时,这里old也一直是80,所以第二次修正nice值后,PRI是变成了70,而不是由第一次的90变为80。
测试优先级的极值:我们可以测试一下当前进程的最大和最小优先级,这里我们直接把nice值输入成100,然后观察结果
这里我们可以看见,PRI最多就增长到99就停止了,而NI也没有变成100,而是变成19。同理,我们可以测出PRI最小减少到60就停止了,NI最小也就是-20。那这里为什么我们要对这些进程的优先级做一个限制呢? 如果我们的优先级不被限制的话,有人为了让自己的优先级更高,会无限制地调低优先级。而优先级更高地进程是能更快地享受CPU资源的,如果把用户把个人的进程优先级设置太高,就会造成常规进程迟迟无法享有CPU进程,这也叫做进程饥饿状态。
希望文章内容能对你有些许帮助,文中如有不当之处,还望各位大佬指正,谢谢!!!