/* * Optimization: we know that if all tasks are in * the fair class we can call that function directly: */ if (likely(rq->nr_running == rq->cfs.nr_running)) { //如果nr_running==cfs.nr_running,则说明当前rq队列中是没有rt任务的, //rt任务不在cfs队列中,它的优先级的设置和cfs不一样。 p = fair_sched_class.pick_next_task(rq); //在cfs队列中挑选即将被切换进去的进程,核心函数, if (likely(p)) return p; }
for_each_class(class) { p = class->pick_next_task(rq); if (p) return p; }
BUG(); /* the idle class will always have a runnable task */ } 这里我们可以看到内核中对挑选调度器类的时候做了一些优化。由于系统中几乎都是普通的进程,所以,一旦进程的总数等于CFS可运行队列中进程的总数时,那么可以直接调用CFS调度器。如果不是,那么选择优先级最高的那个调度器类。每个调度器都定义了自己的 pick_next_task() 函数,且拥有自己的可运行队列,所以,总是可以选出最合适的需要调度的进程。