- 计算当前task在这个tick周期实际用时delta_exetime, 更新当前task的vruntime;
- 根据权重,重新计算调度period,计算当前task的应得时间片slice(idle_runtime,实际时间片);
- 若delta_exetime大于slice,则切下一个任务;否则继续检查4;
- 若delta_exetime小于最小调度粒度:0.75ms(sysctl_sched_min_granularity),则不切下一个任务;否则继续检查5;
- 取出run queue的rq_se(__pick_first_entity),比较curr_se和rq_se的vruntime,若curr_se->vruntime小于rq_se->vruntime,则不切下一个任务,否则继续检查6;
- 若curr_se->vruntime - rq_se->vruntime 大于 slice, 则切入下一个任务;
为啥第6点直接用 “虚拟时间差值” 与 “实际时间片” 作比较???是否会有误差?
参考:http://www.wowotech.net/process_management/452.html
内核代码:fair.c -> check_preempt_tick()