Linux CFS(完全公平调度程序)延迟

Linux CFS(完全公平调度程序)延迟,linux,linux-kernel,scheduler,Linux,Linux Kernel,Scheduler,我是Linux内核的初学者,我正在努力学习Linux如何调度进程 我已经阅读了一些关于Linux内核的书籍,并浏览了IBM和其他公司的链接,但我仍然有一些疑问 调度程序如何在sysctl\u sched\u延迟时间内调度所有任务 当流程唤醒时,place\u entity函数中实际执行的操作是什么 当进程唤醒时,为什么通过从调度延迟中减去来调整vruntime?这是否会导致运行队列中的进程在vruntime值上存在较大差异 首先是任务的虚拟运行时 从理论上讲,这是任务开始下一个时间段的时间 在

我是Linux内核的初学者,我正在努力学习Linux如何调度进程

我已经阅读了一些关于Linux内核的书籍,并浏览了IBM和其他公司的链接,但我仍然有一些疑问

  • 调度程序如何在
    sysctl\u sched\u延迟
    时间内调度所有任务
  • 当流程唤醒时,
    place\u entity
    函数中实际执行的操作是什么
  • 当进程唤醒时,为什么通过从
    调度延迟中减去
    来调整
    vruntime
    ?这是否会导致运行队列中的进程在
    vruntime
    值上存在较大差异

  • 首先是任务的虚拟运行时

    • 从理论上讲,这是任务开始下一个时间段的时间 在理论上完美的多线程CPU上执行
    • 实际上,它的实际运行时间是否规范化为运行任务的总数
    1。调度程序如何安排任务中的所有任务 sysctl\u sched\u延迟时间?

    它维护一个按时间顺序排列的红黑树,其中包含所有可运行的任务 按虚拟运行时排序。左侧节点的运行时间最短。 CFS选择最左边的任务并运行它,直到任务调度或调度程序发出滴答声 然后,它运行所花费的CPU时间被添加到它的虚拟运行时中。 当它不再是最左边的节点时,将运行具有最短虚拟机的新任务并 这项旧任务是有前提的

    2。当流程唤醒place_entity功能中实际执行的操作时?

    短版:

    当进程唤醒时,place_entity函数要么离开 任务的虚拟运行时保持不变或增加

    长版本:

    当进程唤醒时,place_entity函数执行以下操作

  • 将临时虚拟运行时初始化为最小任务的CFS运行队列的虚拟运行时

  • 由于睡眠时间少于一个延迟不算在内, 将阈值变量初始化为sysctl_sched_latency。 如果已启用“平缓”和“平缓”功能, 然后是这个变量值的一半。 将先前初始化的临时虚拟运行时减少此阈值

  • 通过将计算的虚拟运行时设置为自身和任务虚拟运行时的最大值,确保临时虚拟运行时至少等于任务的虚拟运行时

  • 将任务的虚拟运行时设置为临时运行时

  • 3。当进程唤醒时,为什么要通过从sched_延迟中减去来调整vruntime?

    虚拟运行时将减少,因为睡眠时间少于一个延迟不算在内。 如果任务在红黑树中的位置发生了变化,则不应改变它在红黑树中的位置 仅休眠一个调度程序延迟

    4。这是否会导致运行队列中的进程在vruntime值上存在较大差异?

    我相信步骤3中描述的问题2的逻辑可以防止或至少最小化这种情况

    参考资料


    问题1的答案并没有真正回答
    sysctl_sched_latency
    中的CFS调度问题。很抱歉,我确实无法理解给出的解释:“理论上,任务将在理论上完美的多线程CPU上开始下一次执行的时间片。”,完美的多线程CPU不应该一次运行所有进程吗?你的最后一个链接非常精确地描述了这样一台机器:“理想的多任务CPU”是一个(不存在:-)CPU,它有100%的物理能力,可以以精确相等的速度并行运行每个任务,每个任务的运行速度为1/nr_。”根据这个定义,时间片的概念甚至没有意义。顺便说一句,我还发现“关于CFS调度器设计的注释”这篇文章措辞特别糟糕,请注意第3段和第4段是如何完全矛盾的(!)关于您的第一个问题-来自:如果可运行任务的数量不超过计划延迟/计划最小粒度计划周期=计划延迟否则计划周期=运行任务的数量*计划最小粒度