--------------------------------------------------------------------------------------------------------------------------------
每日鸡汤:无需匆忙,不要将就,缘分到了,就一定会在一起。
--------------------------------------------------------------------------------------------------------------------------------
一:什么是优先级?
优先级基本概念:
那么优先级到底是什么?
类比权限:优先级 VS 权限
权限:决定某文件资源能还是不能访问
优先级:对于资源的访问,决定谁先访问,谁后访问。
二:为什么会有优先级?
进程之间具有竞争性:
因为资源是有限的(本质),进程是多个的,就注定了进程之间属于竞争关系!!!
所以,操作系统就必须得保证大家良性竞争,确定优先级(谁先访问,谁后访问)。
若优先级制定的不合理,进程长时间得不到CPU资源,该进程的代码无法得到推进。——就会引发该进程的饥饿问题!比如在用户层面的实例:“该页面长时间无响应”(该进程卡死了)。
三:Linux优先级是怎样实现的?
3.1:查看进程命令
查进程:ps -l / ps -al
输入:ps -al | head -1 ; ps -al | grep mypro
目前我们已经知道 PID 和 PPID 所代表的意思了。那么UID、PRI、NI它们代表什么意思呢?
3.2:分析各个重要信息
UID
代表执行者的身份,用于代表用户的一个数据。
这里的 1001 就代表的该用户alin。
PRI
优先级 (priority),数值越小,越早被执行,优先级也越高。
默认优先级PRI为80。
NI
默认NI值为0。
3.3:更改优先级
3.3.1:PRI and NI
3.3.2:PRI vs NI
3.3.3:更改优先级
更改优先级的三种方法:nice,renice,top
nice法
nice [-n NI值] 命令
-n NI值:给命令赋予 NI 值,该值的范围为 -20~19
renice法
renice [优先级] PID
top法
普通用户无法更改,需要使用root用户
发现确实没有权限。
进入top后按“r”–>输入进程PID–>输入nice值
比如先设定mypro进程的nice值是-10,那么该进程的PRI优先级就是80-10=70.
四:关于位图
4.1:运行队列数组和等待队列数组
操作系统是如何根据优先级而开展的调度呢?
// 操作系统运行队列
struct runqueue
{//...struct task_struct** run;struct task_struct** wait;struct task_struct* running[140];struct task_struct* waitting[140];//...
}
因为整个操作系统大概一共有140种指针进程,其中[0,99]这前100种指针进程我们大概一辈子也用不到,则就剩下的[100,139]共40个指针进程,正好对应40个优先级。
操作系统运行队列中,有 run 二级指针指向运行队列指针数组running[140],有 wait 二级指针指向运行队列指针数组 waitting[140]。操作系统会根据进程优先级将进程排进操作系统内运行队列或等待队列的各个位置。
比如有一个优先级为60的进程,会将其排入到运行队列数组的下标为100(专门链入优先级为60的进程)的位置之后。当该进程运行完后,则会将其“销毁”,但当一个时间片完后该进程任务没有做完,为了保证各个进程都能平等的运行,就会将该进程链入到等待队列的下标为100的PCB双向链表的位置之后。当然,在CPU运行进程(CPU运行队列数组内的进程)的时候,新加入生成的进程也会将其链入到等待队列当中(根据优先级链入到合适的位置)。
将running数组队列中的进程执行完毕后,即为空时,Swap(&run,&wait),这样,就有了新的运行数组和等待数组。此时,新的等待队列数组就是空的。新的运行队列数组就是“满的”。
那么,如何判断队列为空呢?判断队列是否为空,只能遍历数组。通过 位图 来判断是否为空。
4.2:位图
位图的代码形式:
struct bitmap
{char bits[5];
}
一个 char 类型8个比特位,所以5个char变量,就有40个比特位。正好对应了40个优先级。40个比特序列由0或者1组成的。例如:0000000011111111000000001111111111111111。一个比特位对应着一个优先级。当该优先级运行完为空时,对应的比特位就变为0,直至该40个比特位全为0时,该运行数组就为空了。即:通过这40个二进制来判断该40个指针是否为空。