kernel/sched/core.c文件中,是调度器的入口,内核其他模块需要进行调度时,调用的都是这个文件中定义的入口函数,比如最典型的就是schedule函数。kernel/sched/fair.c文件中定义了,这就是通常我们所说的CFS(Complete Fair Scheduler,完全公平调度器)的具体实现了。CFS,我们就称之为一个调度类。struct sched_class, 定义在kernel/sched/sched.h头文件第2364行,定义如下:struct sched_class {
....
void (*enqueue_task) (struct rq *rq, struct task_struct *p, int flags);
bool (*dequeue_task) (struct rq *rq, struct task_struct *p, int flags);
void (*yield_task) (struct rq *rq);
bool (*yield_to_task)(struct rq *rq, struct task_struct *p);
void (*wakeup_preempt)(struct rq *rq, struct task_struct *p, int flags);
int (*balance)(struct rq *rq, struct task_struct *prev, struct rq_flags *rf);
struct task_struct *(*pick_task)(struct rq *rq);
/*
* Optional! When implemented pick_next_task() should be equivalent to:
*
* next = pick_task();
* if (next) {
* put_prev_task(prev);
* set_next_task_first(next);
* }
*/
struct task_struct *(*pick_next_task)(struct rq *rq, struct task_struct *prev);
void (*put_prev_task)(struct rq *rq, struct task_struct *p, struct task_struct *next);
void (*set_next_task)(struct rq *rq, struct task_struct *p, bool first);
....
};kernel/sched/sched.h文件第2485行定义了DEFINE_SCHED_CLASS这个辅助宏,保证符合相关限制要求。/*
* Helper to define a sched_class instance; each one is placed in a separate
* section which is ordered by the linker script:
*
* include/asm-generic/vmlinux.lds.h
*
* *CAREFUL* they are laid out in *REVERSE* order!!!
*
* Also enforce alignment on the instance, not the type, to guarantee layout.
*/
#define DEFINE_SCHED_CLASS(name) \
const struct sched_class name##_sched_class \
__aligned(__alignof__(struct sched_class)) \
__section("__" #name "_sched_class")
DEFINE_SCHED_CLASS引用,具体如下:
DEFINE_SCHED_CLASS(dl)
DEFINE_SCHED_CLASS(ext)
DEFINE_SCHED_CLASS(fair)
DEFINE_SCHED_CLASS(idle)
DEFINE_SCHED_CLASS(rt)
DEFINE_SCHED_CLASS(stop)因此,结合前面所说的调度类分层,准确的描述如下:
这六个调度类,严格遵循先后顺序:stop_sched_class > dl_sched_class(DEADLINE) > rt_sched_class(FIFO/RR) > ext_sched_class > fair_sched_class(CFS EEVDF) > idle_sched_class