【问题标题】:How can the linux CFS scheduler prevent a task with a very small vruntime from starving the processor?linux CFS调度程序如何防止具有非常小的vruntime的任务使处理器挨饿?
【发布时间】:2012-07-02 16:08:29
【问题描述】:

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

【问题讨论】:

    标签: linux runtime scheduler


    【解决方案1】:

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

    【讨论】:

    • 我理解你的意思,以防进程在睡眠后唤醒。但是你能解释一下stackoverflow.com/questions/24947547/linux-cfs-scheduler这个问题吗?在这方面,如果有两个进程 p1 和 p2,cfs 如何防止饥饿,p1 正在执行很长时间,所以它的 vruntime 现在会很大,如果进程 p2 启动它的 vruntime 将为零,那么新任务将针对 p1 调度,因为它的vruntime 更少。
    • @anshulgarg 我认为vruntime 在创建时由一个孩子从父母那里继承,所以vruntime 不是从零开始的。
    • 嗨@Hao,你能说得更清楚一点吗? min_vruntime 是给定任务的最小时间片的静态值(通常默认为 1-2ms)吗(以避免过多的上下文切换)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-05
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-17
    • 1970-01-01
    相关资源
    最近更新 更多