日期:2014-05-16 浏览次数:20822 次
在Professional Linux Kernel Architecture 2.6.3 section 中作者对CFS 的place_entity 中sched_entity 的vruntime 更新提到:
However, if the sleeper has accumulated a large unfairness as indicated by a large se_vruntime value, the kernel must honor this. If se->vruntime is larger than the previously computed difference, it is kept as the vruntime of the process, which leads to a leftward placement on the red-black tree — recall that large vruntime values are good to schedule early!
这个就奇怪了,明明vruntime 越大,对应在rb tree 中的位置就越右,怎么还越左,然后越早scheduler.
再反过来看place_entity 这段代码: version linux kernel 3.4.10 in kernel/sched/fair.c
static void
place_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int initial)
{
u64 vruntime = cfs_rq->min_vruntime;
/*
* The 'current' period is already promised to the current tasks,
* however the extra weight of the new task will slow them down a
* little, place the new task so that it fits in the slot that
* stays open at the end.
*/
if (initial && sched_feat(START_DEBIT))
vruntime += sched_vslice(cfs_rq, se);
/* sleeps up to a single latency don't count. */
if (!initial) {
unsigned long thresh = sysctl_sched_latency;
/*
* Halve their sleep time's effect, to allow
* for a gentler effect of sleepers:
*/
if (sched_feat(GENTLE_FAIR_SLEEPERS))
thresh >>= 1;
vruntime -= thresh;
}
/* ensure we never gain time by being placed backwards. */
vruntime = max_vruntime(se->vruntime, vruntime);
se->vruntime = vruntime;
}
?
--------------------------------------------------
/* ensure we never gain time by being placed backwards. */
vruntime = max_vruntime(se->vruntime, vruntime);
作者当时的用意应当是防止vruntime 出现倒流的情况; 反过来,我们考察两种case.
1. process 短暂sleep ,这时se->vruntime 一般比min_vruntime 要大,选择se->vruntime 无可厚非。
2. process 长时间sleep, 这时se->vruntime 已经要比min_vruntime 要小很多,通过在min_vruntime 削掉sysctl_sched_latency 可保证插入rb tree 时,位置越往左,从而这个进程即越早被sched 到。 这可让长时间sleep 的process 尽早执行,也算一种奖励把。
至于书上写到的,真的怪怪的。
?