kernel/sched/core.c
一、主调度器
inlude/linux/sched.h中定义了struct task_struct {}。
进程调度最核心的两个问题是,什么时间放弃cpu,接下来由谁获得cpu。放弃cpu有两种方式,一种是主动调用schedule(),一种是周期调度器强行调度scheduler_tick()。
------------------------------------------------------------------------------------------------
pick_next_task();
判断当前cpu就绪队列rq-running中的进程数目是否与普通进程的就绪队列中的进程数目相同,如果相同就说明系统中全是普通进程,直接通过cfs算法的调度类的pick_next_task_fair(kernel/sched/fair.c)函数来从普通进程的就绪队列中寻找进程即可。
否则,遍历调度类的链表,并从中选择一个优先级最高的进程。调度器类已经按如下顺序排序:rt_sched_class → fair_sched_class → idle_sched_class → NULL。
__schedule()调用了pick_next_task(); __schedule()是主调度器。
schedule(),do_task_dead(),schedule_idle(),preempt_schedule_common(),preemt_schedule_lock(),preempt_schedule_notrace(),preempt_schedule_irq()都调用了__schedule(); __schedule()函数主要是对当前task做善后工作,对新task做准备工作。