目录
1.进程优先级
1.1.基本概念
1.2.其他概念
1.3.进程切换
2.解读Linux2.6内核进程的调度队列
1.进程优先级
1.1.基本概念
我们在日常生活中的经验,排队的本质就是确认优先级,排队的原因就是资源不足,需要进行分配。那么在内存资源有限的场景下,且均需要CPU调度,进程优先级就显得十分必要了。
进程优先级:cpu资源分配的先后顺序
在PCB中实现就是一个int类型字段,数值越小,优先级越大。
UID:执行者的身份
PRI:进程优先级,默认值为80
NI:优先级的修正数值
!注意:PRI在NI调整的瞬间回到默认值80
通过top命令我们可以更改NI
我们知道进程优先级,有一定的范围
1.2.其他概念
以上是进程相关的一些概念,一般情况下,多个进程都是在一个CPU上被调度,并且多进程场景下在任意时刻,都会出现多个单进程在某一个时间片内快速切换,CPU进行运算,进行高频切换进程,这时候处于进程的“并发”
1.3.进程切换
CPU在调度进程时不会一直调度某一个进程直至完成,而是会在一个时间片中连续、分开调度多个进程,进行多进程的并发,这时候就需要了解进程是如何进行切换以及如何继续运行的。
就是进程在运行队列排队时,当第一次被CPU调度,会产生一份进程上下文,当在这个时间片完成调度后,这段上下文会被保存在进程PCB相关的结构体tss_struct中,然后再把排队的下一个进程PCB的上下文放入寄存器中,这样CPU通过读取放入的上下文就知道从哪里开始继续将这个进程运行下去。
2.解读Linux2.6内核进程的调度队列
nr_active用于判断调度队列是否为空,如果nr_active的值为0那么就进行active和expired的交换。
bitmap[5]为位图,因为有140个优先级,也就是140个对应优先级的进程队列,为了提高查找非空队列的效率就用0,1这两个数字和5*32个比特位表示队列是否为空。
活动队列active和过期队列expired两个互相配合,一个处理进程,一个新增进程,最终在交换两个队列的地址。
这也就是CPU在调度进程时的状态