Linux CFS调度程序如何防止处理器挨饿导致任务执行很小的vruntime?

所以在任务完成后,它会被重新插入到红黑树中。 如果任务之前已经睡了很长时间,导致与runqueue中的其他任务相比vruntime很小,那么它将作为红黑树中最左边的节点重复插入,对吧? 因此,它总是会被挑选作为下一个运行的任务? 我已经检查了core.c和fair.c中的源代码,我没有看到这个任务应该让步到其他任务的地方。 虽然在函数pick_next_entity()中,我确实看到了一些任务,例如cfs_rq-> next,cfs_rq-> last等等,这可能会有更高的运行优先级,我不认为这是防止任务很小的正确位置vruntime从一个处理器花了很长时间,对吧? 有人有线索吗? 谢谢,

我找到了答案。 当任务从runqueue出队时,这将被称为:se-> vruntime – = cfs_rq-> min_vruntime当任务再次入队到runqueue,这将被称为:se-> vruntime + = cfs_rq-> min_vruntime所以实际上只当任务处于休眠状态时,vruntime的偏移量将被存储,并且在唤醒时将再次添加偏移量。