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

pra*_*jul 13 linux scheduler linux-kernel

我是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值有很大差异吗?

App*_*234 10

首先是任务的虚拟运行时

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

1.调度程序如何在sysctl_sched_latency时间内安排所有任务?

它维护一个按时间排序的红色和黑色树,其中所有可运行的任务按其虚拟运行时进行排序.左侧的节点运行时间最短.CFS选择最左边的任务并运行它,直到任务计划或调度程序计时,然后将其花费的CPU时间添加到其虚拟运行时.当它不再是最左边的节点时,运行具有最短虚拟的新任务并且预先执行旧任务.

2.当一个进程唤醒place_entity函数中实际执行的操作时?

精简版:

当一个进程唤醒时,place_entity函数将按原样保留任务的虚拟运行时或增加它.

长版:

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

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

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

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

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

3.当进程唤醒时,为什么通过从sched_latency中减去来调整vruntime?

虚拟运行时间会减少,因为睡眠时间少于一个延迟时间不计算.例如,如果任务仅在单个调度程序延迟时睡眠,则任务不应在红色黑树中更改其位置.

4.不能导致运行队列中的进程与vruntime值有很大差异吗?

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

参考

sched.c Linux内核源码

sched_fair.c Linux内核源码

有关CFS调度程序设计的说明