本文共 1310 字,大约阅读时间需要 4 分钟。
static struct sched_entity *pick_next_entity(struct cfs_rq *cfs_rq){ struct sched_entity *se = __pick_next_entity(cfs_rq); struct sched_entity *left = se; if (cfs_rq->next && wakeup_preempt_entity(cfs_rq->next, left) < 1) se = cfs_rq->next; /* * Prefer last buddy, try to return the CPU to a preempted task. */ if (cfs_rq->last && wakeup_preempt_entity(cfs_rq->last, left) < 1) se = cfs_rq->last; clear_buddies(cfs_rq, se); return se;}非常显然,要把红黑树最左下角的进程和另外两个进程,即next和last最比較,next是抢占失败的进程,而last则是抢占成功后被抢占的进程,这三个进程究竟哪一个是最优的next进程呢?Linux CFS实现的判决条件是:
究竟能不能选择前两个进程,则是wakeup_preempt_entity函数来决定的,代码太多无益,看以下的图解就可以:
这个CFS细节Linux 2.6.23初步实现CFS如果没有达到。因此,从最简单的时代,你来了解插件的能力的细节和出局,看Changelog有利的是。不得不说。读史使人明智。
本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5035040.html,如需转载请自行联系原作者