5

所以当一个任务吃完它的时间片后,它会被重新插入到红黑树中。如果任务之前已经休眠了很长时间,导致vruntime与runqueue中的其他任务相比非常小,那么它会被重复地重新插入到红黑树的最左边,对吧?因此,它总是会被选为下一个要运行的任务?我检查了 core.c 和 fair.c 中的源代码,我没有看到该任务应该让给其他任务的任何地方。尽管在函数 pick_next_entity() 中,我确实看到了一些任务,例如 cfs_rq->next、cfs_rq->last 等。它们可能具有更高的运行优先级,但我认为这不是阻止非常小的任务的正确位置vruntime 不会占用处理器太长时间,对吗?有人有线索吗?谢谢,

4

1 回答 1

4

我找到了答案。当任务从运行队列出队时,会调用: se->vruntime -= cfs_rq->min_vruntime 当任务再次入队到运行队列时,会调用: se->vruntime += cfs_rq->min_vruntime 所以实际上只有vruntime 的偏移量将在任务休眠时存储,并在任务唤醒时再次添加偏移量。

于 2012-07-03T13:38:31.010 回答