linux - linux CFS 调度程序如何防止具有非常小的 vruntime 的任务使处理器挨饿?

标签 linux runtime scheduler

所以当一个任务吃完它的时间片后,它会被重新插入到红黑树中。如果任务之前已经休眠了很长时间,导致 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/

相关文章:

linux - 如何在 linux 上将 nagios 添加为服务

linux - 为arm linux交叉编译chromium

c - 为什么这个 ptrace 错误?

list - Lisp 是如何动态分配符号的? Lisp 符号的底层数据结构/机制?

javascript - 如何在运行 javascript 函数后修改 html 页面

function - 使用 powershell 更改运行时版本 azure 函数

linux - 内核如何知道 CPU 处于空闲状态?

c - 内核 - Linux - 内核在哪里与 cpu 对话?

更改 xv6 内核 :ERROR: expected declaration or statement at end of input in C

linux - 分支与 merge 策略 - Linux 内核