朴素的UNIX之-LinuxCFS一个注释


本系列名为朴素的UNIX,但是也包括各个类UNIX系统的细节,本系列文章整理自本人几年来的学习笔记,着重分析各个UNIX,类UNIX的实现思想以及感悟。
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实现的判决条件是:

1.尽可能满足需要刚被唤醒的进程抢占其它进程的需求;

2.尽可能减少以上这种抢占带来的缓存刷新的影响。

到底能不能选择前两个进程,则是wakeup_preempt_entity函数来决定的,代码太多无益,看下面的图解即可:

这个CFS的细节在Linux 2.6.23最初实现CFS时并没有实现。因此从最朴素的时代开始,你才能逐渐理解细节的来龙去脉,看Changelog是有好处的。不得不说,读史使人明智。

相关内容

    暂无相关文章