cfs

linux进程调度

和自甴很熟 提交于 2019-11-28 05:44:44
CFS调度: 新进程创建会调用到do_fork -->wake_up_new_task -->activate_task(rq, p, 0); --> enqueue_task(rq, p, flags); // 入就绪队列 -->p->sched_class->enqueue_task(rq, p, flags); --> check_preempt_curr(rq, p, WF_FORK); // 检查是否可抢占当前进程 对于CFS调度:会调用到fair_sched_class.enqueue_task = enqueue_task_fair static void enqueue_task_fair(struct rq *rq, struct task_struct *p, int flags) { struct cfs_rq *cfs_rq; struct sched_entity *se = &p->se; for_each_sched_entity(se) { if (se->on_rq) // 有父进程在队列上,退出for;没有就将该进程以及其父进程都入就绪队列cfs_rq break; cfs_rq = cfs_rq_of(se); //得到就绪队列 enqueue_entity(cfs_rq, se, flags); flags = ENQUEUE_WAKEUP;