进程调度简要总结

0. 权重

进程的优先级与内核的nice值对应,nice值降低对应权重增加;

内核根据进程类型和静态优先级计算权重值;

内核不仅维护进程自身的权重,还维护调度队列的权重,当进程被加入到调度队列时,也要该进程的权重增加到队列权重中;

1. 完全公平调度延时周期

内核可以通过参数sysctl_sched_latency配置一个时间间隔,用来保证每个可运行进程在此间隔下都能至少运行一次;
控制参数sched_nr_latency控制在上述时间间隔下最大的活动进程数目;如果活动进程的数目超过该配置数,则延时间隔时间成比例的进行扩展;

sysctl_sched_latency = sysctl_sched_latency * nr_running / sched_nr_latency

进程分配到的时间根据进程权重在就绪队列中权重的比例进行分配;

slice = slice * se->load / rq->load

2. 周期调度器扫描

周期调度器每个HZ扫描一次,更新当前进程的运行时间,并检查当前进程的运行时间是否超过了进程分配到的运行时间,如果超过了则标记进行重新调度标记;

在系统调用返回、中断返回等时机,会检查该标记,调用注册的实际调度方法的函数(比如公平调度注册的处理函数)处理进程,并进行实际的进程上下文切换;

3. 完全公平调度红黑树

完全公平调度就绪队列将进行维护在一棵红黑树中,调度器每次获取最左侧节点进程进行调度;
调度会从红黑树中删除该节点(仍可通过curr关联队列),当调度结束之后将该节点插入树中;得到调度进程的运行时间增加,使其重新插入的时候右移,未得到调度的进程实际不变,则相对左移,更容易得到调度;

对于权重大的进程,其运行时间增加的慢,向右移动的速度也慢,调度的机会要更大;

睡眠的进程的运行时间保持不变,这样当唤醒之后,位置更靠左,更容易得到调度;

posted @ 2019-10-29 22:22  AlexAlex  阅读(442)  评论(0编辑  收藏  举报