Hello,大家好。本文我们要来介绍的是有关Linux下【进程优先级】,首先我们要了解的是其基本概念
接下去的话我们来谈谈为什么会存在进程的优先级这么一个东西
首先我想要问的是:读者有时候是否会觉得自己的电脑会比较得卡呢?
所以操作系统必须保证大家良性竞争,确认优先级,才可以组织所有的进程一一运行
不仅如此呢,还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能
所以呢,优先权高的进程有优先执行权利,有了优先级;才能使得一些重要的进程被率先执行
知道了进程优先级的基本概念后,我们来Linux中看看它到底是个什么东西呢?
ps -al
那我们重点来讲解一下这两个信息值
PRI
还是比较好理解的,即 进程的优先级,或者通俗点说就是程序被CPU执行的先后顺序,此值越小进程的优先级别越高NI
呢? 就是我们所要说的nice值了,其表示进程可被执行的优先级的修正数值那有读者就很疑惑这个修正数值 的概念了
nice
的值。首先的话我们执行[top]
指令,进入到Linux下类似于【任务管理器】的界面R/r
之后,就会跳出来下面这句话,这里的renice
指的就是要重新修改进程,此时 shell 正在等待我们输入进程的PID值,那我们就可以输入上方的635
PID to renice [default pid = 1]
nice
值Renice PID 635 to value
nice
的值,一开始看到其为80
,现在呢我们将其减去30,不过在执行结束之后发现跳出了一个Permission denied
,那对Linux权限清楚的同学就可以知道此为【权限拒绝】那接下去呢,我们就来看看 root 到底有多少强大
PRI(new) = PRI(old) + nice
NI
的值真的有发生变化,但是呢我们可以看到虽然修改的值为-30
,但是最后去查看的时候却是-20
,所以PRI
的值就变成了[60]
NI
的值去调整进程优先级,不过这个调整可不是让你乱调整的,Linux不想过多地让用户参与优先级的调整,所以存在这么一个取值范围是-20 ~ 19
,一共40个级别。所以呢我们在调整【NI】的值时如果超出了这个范围的话也是会受到一定限制的。那么这个PRI
的值就是在60 ~ 99
之间,为闭区间99
这个地方,而不会再上去了。读者也可以去试一其他的值,也是一样的,只会被限制在这个区间内部这里的话再补充一点,其实对于普通用户而言也是可以去设置进程优先级的,我们一起来看看
-30
遭到了Permission denied
,但是呢现在但我们输入100的时候此时再出去查看这个进程的PRI
值时却看到其确实也发生了变化以上就是如何去查看并修改当前进程的优先级,不过对于一个进程的优先级大家还是最好不要进行轻易的修改,否则的话会带来一些不必要的麻烦
这个概念的话我会在讲解C++专栏文章的时候详细说到,这里点到为之
首先我想问的是:操作系统是如何根据优先级,开展的调度呢?
01
序列,就像下面这样0000000000000000001111111111111111111
struct bitmap
{
char bits[100];
}
bits
数组中有100个元素,一个char
类型的元素存在8个比特位,那么我们就可以通过计算当前下标和 pos 的值,然后进行一个位运算来得出这个N具体的所在位置我们在讲解 进程的基本概念 时说到每一个CPU都要去维护一个运行队列即
run_queue
run_queue
的运行队列,里面呢有两个指针数组,其里面存放的都是指向task_struct
的结构体指针。这个指针数组的[0, 99]
号下标一般都是不用的,给其他的进程使用的,所以我们使用的便是[100, 139]
这个区间NI
,那时候的范围是[60, 99]
,其中也包含40个数字task_struct
,即一个进程PCB,此后如果有相同优先级的进程来了,那么就像队列一样排在后面,如果有这个优先级不一样的进程,那么就链在其他结构体指针的后面那读者应该可以感觉到这个操作系统中的进程是不断需要被执行的,那我现在想问:如果CPU现在正在调度这个运行队列,但此时又有新的进程过来了,此时该怎么处理这个进程呢?
run_quque
中其实还有两个二级指针,为【run】和【wait】,它们分别又指向了running
和waiting
,此时看到右侧的这个画面,它们其实是两个镜像队列,上面的队列正在被CPU调度运行,而下面的队列则为等待队列,如果是有新的进程需要被调度执行的时候就先链接到这个等待队列中swap(&run, &wait);
那我们要怎么知道这个当前的运行队列是否为空呢?
run_queue
的结构体中再新增一个成员叫做is_empty
的位图结构变量。char
类型的数组,大小为5,那我们现在通过这个数组去遍历这个进程队列的时候,假设第一位为进程优先级为 60 的这一组是否为空、第二位为进程优先级为 61 的这一组是否为空。我们用0
代表空,用1
代表非空,那如果我们要去判断一下这个进程队列是否为空的话只需要看看这个 01序列是否为0即可,如果想要查找哪个进程优先级中的队列不为空的话,只需要去找这个序列中为【1】的即可最后总结一下本文所学习的内容
NI
这个值去进行一个修改,但是呢我们在修改的时候要注意分寸,Linux为了防止用户去做过多的修改,就对这个NI
的值做了一个限定,范围定死在了[60, 99]
,所以我们过多地向上或者是向下进行修改的话,是不会超出限制的run_queue
这个运行队列的同时,我们很清楚地知道了操作系统面对如此多的进程,是怎样做好合理规划的呢,是通过维护两个镜像等待队列,交替执行里面的进程以上就是本文要介绍的所有内容,感谢您的阅读