在Linux 2.6完全公平的调度程序内

时间:2012-06-27 11:07:45

标签: linux algorithm data-structures

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

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

3 个答案:

答案 0 :(得分:2)

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

通常,两者是可互换的,就功能而言,它们也可与基本搜索树,treaps,splay树等互换。不同之处在于实际性能,因为所有平衡搜索树(AVL和RB树都是平衡的)具有相同的理论性能。

根据两个数据结构的维基页面(AVLRB),AVL树在查询时表现更好,插入和删除效果更差。如果你看一个实现,这很容易注意到:平衡AVL树更复杂,导致实际性能下降。

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

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

答案 1 :(得分:1)

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

此时您可以说AVL树可以执行具有同等复杂性的相同任务。另一方面,在添加或删除任务条目时,您必须重新平衡和遍历RBT。据我所知,这里的RBT比AVL更适合这项工作。

答案 2 :(得分:0)

因为RB TREE是自平衡的,所以由于树的自平衡特性,树中的路径不会是任何其他路径的两倍,因此,所有操作都将为O(log n),因此从树中插入和删除任务可以很快并且非常有效。