因此,在任务耗尽其时间片之后,它将被重新插入到红黑树中。如果任务之前已经睡了很长时间,导致与runqueue中的其他任务相比非常小的vruntime,那么它将作为红黑树中最左边的节点重复插入,对吧?因此,它总是被选为下一个要运行的任务?我已经检查了core.c和fair.c中的源代码,我没有看到任何这个任务应该放到其他任务的地方。虽然在函数pick_next_entity()中,我确实看到了一些任务,如cfs_rq-> next,cfs_rq-> last等等。这可能有更高的运行优先级,我不认为这是防止任务的正确位置从处理器中停留太长时间的非常小的运行时间,对吗?有人有线索吗?谢谢,
答案 0 :(得分:4)
我找到了答案。 当任务从runqueue中出队时,将调用: se-> vruntime - = cfs_rq-> min_vruntime 当任务再次入队到runqueue时,将调用: se-> vruntime + = cfs_rq-> min_vruntime 所以实际上只有当任务处于休眠状态时才会存储vruntime的偏移量,并且当它被唤醒时会再次添加偏移量。