idle 进程的运行时机

版权声明:本文为博主原创文章,未经博主允许不得转载。 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进程

猜你喜欢

转载自blog.csdn.net/tiantao2012/article/details/87912755
今日推荐