【问题标题】:Linux CFS (Completely Fair Scheduler) latencyLinux CFS(完全公平调度程序)延迟
【发布时间】:2011-11-04 21:52:19
【问题描述】:

我是 Linux 内核的初学者,我正在尝试学习 Linux 如何调度进程。

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

  1. 调度器如何调度sysctl_sched_latency时间内的所有任务?
  2. 当一个进程唤醒时,place_entity 函数实际上做了什么?
  3. 当进程唤醒时,为什么要通过从 sched_latency 中减去来调整 vruntime?这不会导致运行队列中的进程在vruntime 值上有很大差异吗?

【问题讨论】:

  • 关于你的第一个问题 - 来自oakbytes.wordpress.com/2012/06/06/…:如果可运行任务的数量不超过 sched_latency_ns/sched_min_granularity_ns 调度周期 = sched_latency_ns 否则调度周期 = number_of_running_tasks * sched_min_granularity_ns

标签: linux linux-kernel scheduler


【解决方案1】:

首先是任务的虚拟运行时

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

1.调度器如何调度所有任务 sysctl_sched_latency 时间?

它维护了一个时间有序的红黑树,所有可运行的任务都在 按他们的虚拟运行时排序。左侧的节点运行时间最短。 CFS 选择最左边的任务并运行它,直到任务调度或调度程序滴答作响 然后将其运行所花费的 CPU 时间添加到其虚拟运行时。 当它不再是最左边的节点时,运行具有最短虚拟的新任务并且 旧任务先发制人。

2。当进程唤醒时,place_entity 函数中实际做了什么?

短版:

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

加长版:

当一个进程唤醒时,place_entity 函数会做以下事情

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

  2. 由于睡眠时间少于单个延迟不计算在内, 将阈值变量初始化为 sysctl_sched_latency。 如果启用了 GENTLE_FAIR_SLEEPERS 功能, 然后是 this 变量值的一半。 将先前初始化的临时虚拟运行时减少此阈值。

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

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

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

虚拟运行时减少,因为睡眠时间少于一个延迟不计算在内。 例如,如果任务已更改,则不应更改其在红黑树中的位置 只睡了一个调度器延迟。

4.这不会导致运行队列中的进程在 vruntime 值上有很大差异吗?

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

参考文献

sched Linux Kernel Source

sched_fair.c Linux Kernel Source

Notes on the CFS Scheduler Design

【讨论】:

  • 回答问题 1 并不能真正回答 sysctl_sched_latency 内的 CFS 调度。
  • 我很抱歉,但我真的无法理解给出的解释:“理论上是任务将在理论上完美的多线程 CPU 上开始下一次执行的时间。”,完美的多线程 CPU 不应该一次运行所有进程吗?您的最后一个链接非常准确地描述了这样一台机器,例如“理想的多任务 CPU”是一个(不存在的 :-))CPU,它具有 100% 的物理功率,并且可以以精确相等的速度并行运行每个任务,每个以 1/nr_running 速度。”按照这个定义,时间片的概念甚至没有意义。
  • 顺便说一句,我还发现“CFS 调度程序设计说明”一文的措辞特别糟糕,请注意第 3 和第 4 段是完全矛盾的(!)
猜你喜欢
  • 2011-09-11
  • 1970-01-01
  • 2014-02-17
  • 1970-01-01
  • 2012-06-23
  • 2013-05-29
  • 1970-01-01
  • 2021-12-23
  • 1970-01-01
相关资源
最近更新 更多