- 论坛徽章:
- 0
|
本帖最后由 wangjianchangdx 于 2011-12-08 17:40 编辑
>1)之前的调度实体问什么还有加入cfs_rq,而下一个要运行的进程却要移除cfs_rq?
个人以为,是要通过enqueue和dequeue完成对entity rbtree的维护,没看到其他调整rbtree的途径;
>2)on_rq有什么用,prev如果是on_rq,怎么还加入cfs_rq?
这个要看on_rq是在哪里改变的:enqueue_task & dequeue_task;
你看的是sched_fair.c里面的代码,所以是cfs_rq;
这里的on_rq指的是runqueue,而非cfs_rq,同一个runqueue里面的task可以有多种调度方式;
这里如果不on_rq也就是task被从runqueue中移除了,还有必要加入到属于runqueue的cfs_rq里面吗?- /*
- * activate_task - move a task to the runqueue.
- */
- static void activate_task(struct rq *rq, struct task_struct *p, int flags)
- {
- if (task_contributes_to_load(p))
- rq->nr_uninterruptible--;
- enqueue_task(rq, p, flags);
- inc_nr_running(rq);
- }
复制代码- static void enqueue_task(struct rq *rq, struct task_struct *p, int flags)
- {
- update_rq_clock(rq);
- sched_info_queued(p);
- p->sched_class->enqueue_task(rq, p, flags);
- p->se.on_rq = 1;
- }
复制代码 |
|