版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tiantao2012/article/details/87912755
在rt_sched_class定义的next是fair_sched_class,
const struct sched_class rt_sched_class = {
.next = &fair_sched_class,
在fair_sched_class定义的next是idle_sched_class
const struct sched_class fair_sched_class = {
.next = &idle_sched_class,
从这里也可以看出调度的优先级是是rt>fair>idle
而idle_sched_class的定义如下:
const struct sched_class idle_sched_class = {
/* .next is NULL */
/* no enqueue/yield_task for idle tasks */
/* dequeue is not valid, we print a debug message there: */
.dequeue_task = dequeue_task_idle,
.check_preempt_curr = check_preempt_curr_idle,
.pick_next_task = pick_next_task_idle,
.put_prev_task = put_prev_task_idle,
这里可以看到idle_sched_class的next是null,从这里可以知道idle_sched_class 就是最低优先级的.
这里我们重点看看idle_sched_class的pick_next_task的实现
static struct task_struct *
pick_next_task_idle(struct rq *rq, struct task_struct *prev, struct rq_flags *rf)
{
put_prev_task(rq, prev);
update_idle_core(rq);
schedstat_inc(rq->sched_goidle);
return rq->idle;
}
void init_idle(struct task_struct *idle, int cpu)
{
rq->curr = rq->idle = idle;
}
可以看到这里的rq->idle 就是idle进程