所以当一个任务吃完它的时间片后,它会被重新插入到红黑树中。如果任务之前已经休眠了很长时间,导致 vruntime 与运行队列中的其他任务相比非常小,那么它会作为红黑树中最左边的节点重复插入,对吧?因此它总是会被选为下一个要运行的任务?我已经检查了 core.c 和 fair.c 中的源代码,我没有看到这个任务应该屈服于其他任务的任何地方。尽管在函数 pick_next_entity() 中,我确实看到了一些任务,例如 cfs_rq->next、cfs_rq->last 等。它们可能具有更高的运行优先级,但我认为这不是阻止非常小的任务的正确位置vruntime 占用处理器时间过长,对吗?有人有线索吗?谢谢,
最佳答案
我找到了答案。 当任务从运行队列中出队时,会调用: se->vruntime -= cfs_rq->min_vruntime 当任务再次入队到运行队列时,这将被调用: se->vruntime += cfs_rq->min_vruntime 所以实际上在任务休眠时只会存储vruntime的偏移量,当它醒来时会再次添加偏移量。
关于linux - linux CFS 调度程序如何防止具有非常小的 vruntime 的任务使处理器挨饿?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11297285/