当前位置: 首页 > news >正文

红黑树(rbtree)、以及epoll的实现原理

epoll的实现原理,查看此篇博客

先明确:
在红黑树中,叶子节点指的是,没有子节点的节点的两个空节点,或者只有一个子节点的节点的另外一个空儿子,如下图所示:

在这里插入图片描述

1、定义

任意一棵红黑树,都要满足下列5个条件:

  • ① 所有节点,要么是红色,要么是黑色
  • ② 根节点是黑色
  • ③ 所有叶子节点都是黑色(这其实算是一条定义,不过这5条描述的本来就是定义😂)
    本条换个说法:从任意叶子节点到根的所有路径上不能有两个连续的红色节点
  • ④ 每个红色结点的两个子节点都是黑色
  • ⑤ 从根到任意一个叶子节点的路径中,包含的黑色节点数都相同

2、性质

从根到叶子的最长的可能路径 不多于 最短的可能路径的两倍长。
在这里插入图片描述

3、红黑树的操作

3.1 插入

3.2 删除


4、优点

使用O(logN)的时间复杂度查找任意节点。 且可以随时添加节点。

使用中序遍历可以进行范围查询,能够查询到比某个节点小的所有节点。

5、红黑树在epoll中的应用

这是epoll的源码:
https://github.com/torvalds/linux/blob/master/fs/eventpoll.c

5.1

内核事件表里的每个文件描述符都对应红黑树中的一个节点,每个节点里都有一个epoll_event结构体成员。

当调用epoll_ctl()增加或删除文件描述符时,就是增加或删除红黑树的节点。

调用epoll_create时,内核除了帮我们在epoll文件系统里建了个file结点,还在内核cache里建了棵红黑树。

调用epoll_wait时,内核只把就绪的文件描述符存到一个链表里,并返回给应用程序。

5.2 epoll为什么不用hash(O(1)的查找),而用红黑树

epoll“管理”的文件描述符数量不确定

如果使用hash,不管是用拉链法,还是用开放寻址法,都需要提前创建一个数组,但由于无法确定epoll管理的文件描述符数量,所以不知道数组要创建多大,所以没办法使用hash

相关文章:

  • epoll 的 ET,LT工作模式———实例程序
  • epoll 的EPOLLONESHOT 事件———实例程序
  • select 同时接收普通数据 和 带外数据
  • I/O复用的高级应用之一:非阻塞 connect———使用 select 实现(也可以用 poll 实现)
  • I/O复用的高级应用:同时处理 TCP 和 UDP 服务
  • I/O复用的高级应用:聊天室程序———实例代码
  • select、poll、epoll的使用方法 和 使用场景
  • 使用统一事件源的方式同时处理信号和 I/O
  • 使用SIGURG信号接受带外数据
  • 信号 ——《Linux高性能服务器编程》第10章——读书笔记
  • Linux 文件I/O 及其 多个相关函数
  • python——学校课程预习+复习
  • Linux 进程———详解
  • Linux服务器实例程序———使用定时器列表处理非活动连接
  • 各种最短路问题的常用算法模板
  • 【剑指offer】让抽象问题具体化
  • 〔开发系列〕一次关于小程序开发的深度总结
  • axios 和 cookie 的那些事
  • create-react-app做的留言板
  • github指令
  • GitUp, 你不可错过的秀外慧中的git工具
  • Python 反序列化安全问题(二)
  • Python学习之路16-使用API
  • React 快速上手 - 07 前端路由 react-router
  • Spring Boot快速入门(一):Hello Spring Boot
  • 初探 Vue 生命周期和钩子函数
  • 计算机在识别图像时“看到”了什么?
  • 人脸识别最新开发经验demo
  • 一份游戏开发学习路线
  • 湖北分布式智能数据采集方法有哪些?
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • # C++之functional库用法整理
  • #android不同版本废弃api,新api。
  • #define用法
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • $$$$GB2312-80区位编码表$$$$
  • (+4)2.2UML建模图
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (分布式缓存)Redis持久化
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (九)信息融合方式简介
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • .form文件_一篇文章学会文件上传
  • .NET Core WebAPI中封装Swagger配置
  • .NET4.0并行计算技术基础(1)
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • @RequestBody详解:用于获取请求体中的Json格式参数
  • @require_PUTNameError: name ‘require_PUT‘ is not defined 解决方法
  • [ IO.File ] FileSystemWatcher