关于epoll数据结构的选择

 

 我们知道,epoll需要维护一个fd集合,epoll_ctl定义了ADDMODDEL三种操作。为了维护这个集合,我们选用红黑树。

为什么要使用红黑树呢?哈希表、B树不行吗?

首先,与哈希表相比,红黑树的查找时间复杂度虽然为O(logn),但是红黑树的内存足迹更小。再者,即使在C10M问题中,红黑树的查找操作的性能也是相当可观的。而哈希表还需要rehashing等时间复杂度较高的维护操作。

B树适用于磁盘I/O这种顺序读写优于随机读写的场景,作为多叉树,B树的查找操作的时间复杂度是不如红黑树的(常数级别的差别)。而epoll主要的工作场景是内存I/O,并不需要与磁盘交互。

另外,epoll_wait需要返回一个就绪的事件集合。那么,epoll内部也应该有一个存储就绪事件的数据结构。由于每个事件的发生是有时间先后的,因此可以使用队列。由于队列长度不定,因此使用双向链表实现。

由于我们已经选择使用红黑树来维护fd集合了,而epoll_wait返回就绪的事件集合时是复制到用户态数组中的,因此,在epoll内部,红黑树的节点和就绪队列的链表节点就可以复用。也就是说,就绪队列的建立只需要把原来已经在红黑树上的某些节点相互连接起来。

参考资料:https://zhuanlan.zhihu.com/p/481200040
posted @ 2022-09-06 09:34  爱上飞飞的面码  阅读(199)  评论(0编辑  收藏  举报