主调度器调度层次如下:
schedule
__schedule
pick_next_task
在pick_next_task里面会根据stop->dl->rt->fair->idle的顺序,遍历各个调度类,从中选择一个进程放入cpu执行。pick_next_task里面也进行了优化:如果cpu运行队列rq中所有进程都是普通进程,那么直接从fair_sched_class调度类中选择一个进程调度执行。
进程进入cpu执行的时候会记录开始执行的时间,进程从cpu中切换出去之后,会记录进程在cpu上总的执行时间。例如stop进程:
pick_next_task_stop:stop->se.exec_start = rq_clock_task(rq); 记录进程进入cpu执行时候的时间;
put_prev_task_stop:记录进程在cpu上执行的总时间