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

时间:2011-11-04 21:52:20

标签: linux linux-kernel scheduler

我是Linux内核的初学者,我正在努力学习Linux如何安排进程。

我已经阅读了有关Linux内核的一些书籍,并浏览了IBM http://www.ibm.com/developerworks/linux/library/l-cfs/和所有人的链接,但我仍然有些疑惑。

  1. 调度程序如何在sysctl_sched_latency时间内安排所有任务?
  2. 当一个进程唤醒place_entity函数中实际执行的操作时?
  3. 当一个进程被唤醒时,为什么vruntime通过从sched_latency减去来调整?这不能导致运行队列中的进程与vruntime值有很大差异吗?

1 个答案:

答案 0 :(得分:10)

首先是任务的虚拟运行时

  • 理论上是任务开始下一次的时间片 在理论上完美的多线程CPU上执行。
  • 实际上是它的实际运行时间标准化为正在运行的任务总数

<强> 1。调度程序如何安排调度程序中的所有任务     sysctl_sched_latency time?

它维护一个按时间排序的红色和黑色树,所有可运行的任务都在这里 按其虚拟运行时排序。左侧的节点运行时间最短。 CFS选择最左边的任务并运行它,直到任务计划或计划程序滴答为止 然后将运行所花费的CPU时间添加到其虚拟运行时。 当它不再是最左边的节点时,运行具有最短虚拟的新任务 这项旧任务得到了预备。

<强> 2。当一个进程唤醒了place_entity函数中实际执行的操作时?

简短版:

当进程唤醒时,place_entity函数会离开 任务的虚拟运行时原样或增加它。

长版:

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

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

  2. 由于睡眠不足一个延迟不计, 将阈值变量初始化为sysctl_sched_latency。 如果启用了GENTLE_FAIR_SLEEPERS功能, 那么这个变量的值的一半。 按此阈值减小先前初始化的临时虚拟运行时。

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

  4. 将任务的虚拟运行时设置为临时运行时。

  5. 第3。当一个进程醒来时,为什么通过从sched_latency中减去来调整vruntime?

    虚拟运行时间递减,因为睡眠时间少于一个延迟不计算。 例如,任务不应该在红色黑树中改变它的位置,如果有的话 只睡了一个调度程序延迟。

    <强> 4。这不能导致运行队列中的进程与vruntime值有很大差异吗?

    我认为问题2的步骤3中描述的逻辑可以防止或至少最小化。

    <强>参考

    sched.c Linux Kernel Source

    sched_fair.c Linux Kernel Source

    Notes on the CFS Scheduler Design