关于nginx的epoll为什么要使用红黑树的一些总结

皆是个人的一些拙见,如果有大神看到,还请多指教。写本文的目的很简单,就是想弄明白为什么epoll要使用红黑树,在查阅文章的时候还引出了红黑树和b+树的使用场景,这里一一总结。

“针对大量数据,如果在内存中作业优先考虑红黑树(map,set之类多为RB-tree实现),如果在硬盘中作业优先考虑B系列树(B+, B, B*)”(来自:AVL树,红黑树,B树,B+树,Trie树都分别应用在哪些现实场景中? - Antmuse的回答 - 知乎 https://www.zhihu.com/question/30527705/answer/220930537)

知乎一个回答:(地址https://www.zhihu.com/question/20545708

Bt+树:(来自:https://www.zhihu.com/question/30527705

“B树,B+树:它们特点是一样的,是多路查找树,一般用于数据库系统中,为什么,因为它们分支多层数少呗,都知道磁盘IO是非常耗时的,而像大量数据存储在磁盘中所以我们要有效的减少磁盘IO次数避免磁盘频繁的查找。”

红黑树

红黑树虽然定义复杂,但是它的限制条件是相对AVL宽松的。所以在进行插入删除操作的时候出现违反限制条件的状况较少,因而重平衡操作出现的机会比AVL少。基于上述原因,许多需要进行频繁删插操作的场景都使用来红黑树:

  • Linux epoll
  • C++ STL(sert, map)
  • Completely Fair Sheduler

B+树

B+树主要应用于文件系统中,最大的原因是它高度平衡,branch factor较大,这样可以减少磁盘IO。


链接:https://www.zhihu.com/question/30527705/answer/754822718

红黑树和B树应用场景有何不同?

2者都是有序数据结构,可用作数据容器。
红黑树多用在内部排序,即全放在内存中的,微软STL的map和set的内部实现就是红黑树。
B树多用在内存里放不下,大部分数据存储在外存上时。因为B树层数少,因此可以确保每次操作,读取磁盘的次数尽可能的少。

在数据较小,可以完全放到内存中时,红黑树的时间复杂度比B树低。
反之,数据量较大,外存中占主要部分时,B树因其读磁盘次数少,而具有更快的速度。

来自:https://blog.csdn.net/benpaobagzb/article/details/50805711

红黑树的应用场景

到此,我们可能已经对红黑树有了一点初步的认识了,但是我们却不知道为什么要有红黑树,红黑树是为了解决什么问题被提出来的呢?
我们知道,二叉查找树在大多数情况下查找和插入在效率上是没有问题的,但是在最坏的情况下效率比较低,但是平衡二叉树能够保证在最坏的情况下也能达到lgN,要实现这一目标,我们就要保证在插入完成后始终保持平衡状态。在一棵具有N个节点的树中,我们希望该树的高度能够维持在lgN左右,这样我们就能保证只需要lgN次比较操作就可以查找到想要的值。不幸的是,每次插入元素之后维持树的平衡状态太昂贵。所以就出现一些新的数据结构来保证在最坏的情况下插入和查找效率都能保证在对数的时间复杂度内完成。而我们所讲的红黑树就属于此新的数据结构之一,除此之外还有B树等数据结构。

来自:http://www.akathink.com/2016/08/08/%E5%BD%BB%E5%BA%95%E6%90%9E%E6%87%82%E7%BA%A2%E9%BB%91%E6%A0%91/

“2. Linux的的进程调度,用红黑树管理进程控制块,进程的虚拟内存空间都存储在一颗红黑树上,每个虚拟内存空间都对应红黑树的一个节点,左指针指向相邻的虚拟内存空间,右指针指向相邻的高地址虚拟内存空间;”

来自:https://www.cnblogs.com/ajianbeyourself/p/11173851.html

猜你喜欢

转载自blog.csdn.net/jayxujia123/article/details/108174197