【问题标题】:Inside the Linux 2.6 Completely Fair SchedulerLinux 2.6 内部完全公平调度器
【发布时间】:2020-12-12 20:29:21
【问题描述】:

我在这个链接http://www.ibm.com/developerworks/linux/library/l-completely-fair-scheduler上研究了使用RED-BLACK_TREE数据结构的CFS调度算法

我的问题是:在 CFS 中使用红黑树的目的是什么,为什么不能使用 AVL 树?

【问题讨论】:

  • “他们使用 AVL,为什么不使用 RB 树?”
  • 他们没有,我想知道为什么你认为 AVL 是那里的“明显”选择。
  • AVL 也可以做同样的工作——具有一些相同的红黑属性。

标签: linux algorithm data-structures


【解决方案1】:

注意:我是从纯算法的角度回答这个问题(在实践中基本搜索树操作的性能),我不知道 Linux 开发人员是否有其他内部原因选择 RB树(它可能会让它们做某些 AVL 树不做的事情)。

一般来说,两者是可以互换的,就功能而言,它们也可以与基本的搜索树、treaps、splay 树等互换。区别在于实际性能,因为所有平衡搜索树(AVL 和 RB 树都是平衡的)具有相同的理论性能。

根据两种数据结构(AVL、RB)的 wiki 页面,AVL 树在查询方面表现更好,而在插入和删除方面表现更差。如果您查看实现,很容易注意到这一点:平衡 AVL 树涉及更多内容,导致实践中的性能下降。

所以我的猜测是,他们可以使用 AVL 树(除非他们利用 RB 树具有而 AVL 树没有的结构属性,这是不太可能的),但他们更关心插入和删除性能而不是查询性能,所以他们选择了RB。

还值得一提的是,许多 C++、Java 和 .NET 中的内置数据结构在其实现中使用红黑树,这可能也是因为它们在所有操作中的性能相似。

【讨论】:

    【解决方案2】:

    CFS Linux 调度程序实际上使用了定制的 RB 树 (linux/rbtree.h)。但这里的关键是,CFS 基本上想知道接下来要选择哪个任务。这是通过从树中选择最左边的节点来实现的(因为它将是具有较小切片时间的节点)。但是,为了方便,CFS 使用的 RBT 也有一个指向该节点的指针。

    在这一点上,您可以说 AVL 树可以以相同的复杂性完成相同的任务。另一方面,在添加或删除任务条目时,您必须重新平衡并遍历 RBT。据我所知,RBT 比 AVL 更适合这项工作。

    【讨论】:

      【解决方案3】:

      因为 RB 树是自平衡的,所以树中的任何路径都不会是任何其他路径的两倍,因为树的自平衡特性,因此,所有操作都是 O (log n),因此从树中插入和删除任务可以快速高效地完成。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-06-10
        • 1970-01-01
        • 1970-01-01
        • 2011-05-09
        • 2012-11-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多