为了了解 CFS调度,特意学习了一下红黑树相关的基础知识。
网上一大堆将红黑树的,一上来就是跟你说各种性质,各种操作技巧,天花乱坠,通通讲的是 how,典型的国内教材风格。让人看了一脸懵逼。
其实最重要的,不是跟你说 什么是 Red Black Tree,记住哪几种性质,怎么染色。。。最重要的是,先跟你说明白,why? 为什么会有这玩意,是用来解决什么问题的,这才是认知的真正次序。
这里参考了知乎上的一篇文章,写得很好:
https://zhuanlan.zhihu.com/p/104048881
老规矩,先提出问题:
提出问题
计算机中非常经典的问题了,如何快速查找/插入/删除?
学过数据结构的人,都知道,用 hash 表,时间复杂度接近 常数 级别。但是他有个弊端,就是内存占用比较大。
而红黑树,是一种 查找/插入/删除 性能都非常出色的数据结构,而且内存占用比 hash 表小,所以,在一些对于资源占用有限制,以及动态资源的查询,插入等动态操作的场景, 红黑树有更好的表现。
linux 内核的 CFS 调度底层用的数据结构就是 red-black tree。
这部分内容,参考了:https://blog.51cto.com/u_15990681/6099774
红黑树原理
这部分内容,大家就直接看这篇文章吧,我就不写了: https://zhuanlan.zhihu.com/p/104048881
整体的思考线是:
搜索二叉树 -> 但是某些情况下会退化为一维数组 -> 提出了平衡二叉树 -> 但是平衡二叉树每次插入删除之后,需要维持平衡,开销太大 -> 提出了2,3 树的概念,看2,3树是怎么解决这个问题的 -> 通过2,3树的改造,变成了 红黑树,红黑树就是 2,3树的一个变体而已 -> 最后,才是红黑树为了维持平衡的各种操作方法和技巧:旋转、着色、等等。。。
你看,最后才是 “术” 的内容,这才是正确的思维方式。
从某种意义上来说,其实最不重要的是 “术”,而大家习惯,开门就讲“术”,因为可以显示自己的工作量,自己的学识。。。。。工作学习中,很多这样的人。你很烦,但是这些人总是存在,而且广受好评。
最后
似乎对于 红黑树 ,啥也没讲。。。。