基本概念
优先级是什么?
优先级 vs 权限
权限决定的是能还是不能, 而优先级决定是谁先谁后(你已经能了)
为什么要设置优先级?
因为资源是有限的,进程是多个的, 所以就注定了, 进程之间是要相互竞争这个资源的, 进程之间是竞争关系 --竞争性
操作系统必须保证大家进行良性竞争, 所以就为大家确认优先级;
由于进程优先级设计不合理, 计算机调度不合理等等原因, 导致进程长时间得不到CPU资源,该进程的代码长时间无法得到推进 --该进程的饥饿问题
Linux中是怎么做到设置优先级的?
补充知识 Linux中pcb
的数据结构
查看系统进程
ps -l
查看系统进程
直接使用ps -l
只能查看当前终端中运行的程序 我们加上-a
就可以查看所有的进程
我们重点关注的是 PRI
和 NI
其中 PRI
就是优先级(priority)
NI
是进程优先级的修正数据(nice)值;
我们在修改优先级是不是该PRI
而是改 NI
PRI 与 NI
PRI即进程的优先级, 次值越小, 优先级越高
NI 即nice值 其表示进程的优先级的修正值
加入NI
值后其PRI值就会变成PRI(old) + NI
所以,调整进程的优先级,在Linux下就是调整进程的nice
值
nice其取值范围是-29 ~ 19
一共40个级别
PRI vs NI
需要强调的是, 进程的nice
值不是进程的优先级, 他们不是一个概念,但是进程的nice
值会影响到进程的优先级变化。
可以理解为nice
值是进程优先级的修正数据
top
指令更改优先级
nice 和 renice指令也可以更改进程的优先级, 这里不做介绍, 需要的可以自己在网上搜索
首先我们进入top界面, 然后键盘输入r
此时就需要输入我们进程的pid
输入pid后我们就可以更改nice值了
但是如果我们是普通用户的话就无法进行更改(没有权限)
所以我们切换到root
用户
就修改成功了
需要注意的是, Linux中调整优先级都是从80开始调的, 即第一次我们调成60 第二次再调 +19 是 PRI
实际上是 99;
也就是说, 每次我们调整的其实都是NI值, 最终的 PRI 其实是等于 80 + NI
操作系统是如何根据优先级
展开的调度呢?
Linux通过hash的方式维护40个链表, 不同优先级的进程链接在不同的链表上, 从低到高调度, 就实现了按优先级调度,
有时会发生这么一件事, 我们正在调度该表上的进程, 然而又有新的进程来了, 这时候怎么办, 所以Linux又维护了两个指针, 一个指向正在运行的, 另一个指向没在运行的, 这样只要是调度就去正在运行的地方, 只要是新进程要添加, 就去等待的队列中添加, 当某一个地方的进程被调度完了, 就交换
一下两指针地址即可;
如果就这样的话,那么在判断某个地方是否为空时,必须得完全遍历一遍,才行, 这样太费时间了, 所以Linux又维护了一个位图
我们在判断一个地方是否为空时只需要判断位图的值是否为0
即可, 而某个位置不为0 只需要找到最低位的1
即可(lowbit x & (-x)); 这样就实现了O(1)的判断是否为空