进程调度分析之周期性调度器

博文《linux2.6.29 CFS调度详细分析(二)》中有如下截图

这是时钟中断的调用流程,跟进程调度有关的就是update_process_times->scheduler_tick(); scheduler_tick()根据被中断的进程curr所属的调度类来调用相关调度类的task_tick函数。由此可见周期调度器不属于哪一个调度类,而是由它来调用相关调度类的函数。对于CFS调度类,task_tick就是task_tick_fair.

task_tick_fair 最终就是要做两件事:

1 更新当前进程curr及就绪队列的信息,既更新当前进程的虚拟时间,跟新就绪队列的cfs_rq->min_vruntime。

进程虚拟时间计算通过公式:Delta = delta* NICE_0_LOAD/ se->load   (delta 两次时钟中断之间进程占用CPU的时间)

2 判断当前进程是否执行了足够的时间,如果是则被换出。那这里就要跟两个数据有关了:该进程应该运行了多少时间和已经运行了多少时间。

进程应该运行多少时间是由sched_slice(cfs_rq, curr);计算出来的,原理可以见《独辟蹊径品linux内核》354页11.1 和11.2

进程运行了多少时间则是由进程现在运行的总时间减去进程这次获取cpu时的时间,由此既得出进程此次获取CPU后,占用了多长时间。

/*sum_exec_runtime: 进程执行的总时间*/

/*prev_sum_exec_runtime:进程在最近一次获得CPU时的sum_exec_runtime值*/
delta_exec = curr->sum_exec_runtime - curr->prev_sum_exec_runtime;

 

以前分析对虚拟时间使用十分模糊,由1,2分析可知,进程虚拟时间仅仅是用在就绪队列的排队中,该队列的排队顺序既在树的左边或右边决定了下次被调度的优先级高或低。而至于进程到底应该占用多长时间的cpu,已经占用了多长时间的cpu,使用的是真实时间,跟虚拟时间就无关了。

 

你可能感兴趣的:(进程调度分析之周期性调度器)