获得徽章 0
赞了这篇文章
赞了这篇文章
赞了这篇文章
赞了这篇文章
赞了这篇文章
赞了这篇文章
#每天一个知识点#
从数据结构的角度去理解 epoll IO多路复用
1. epoll 里面主要有两个数据结构,红黑树,双向链表。这两个都是存放 文件描述符fd(file description),红黑树存放的是所有fd,双向链表存放已经就绪的fd
2. epoll 是基于事件驱动做通知的,所有添加到 epoll中的fd(和事件回调函数关联)都会和设备(网卡)驱动程序建立回调关系,也就是说当网卡检查到连接establish 后会通知 epoll 对应的 fd ready了,可以把这个fd 从红黑树移动到双向链表
3. epoll 是如何识别具体到是哪个 fd就绪了呢?遍历红黑树吗?基于回调函数就行,所以epoll 查找就绪fd 的时间复杂度是 O(1)
4. 那既查找是 O(1)那为什么还要用红黑树来存储fd?直接用链表不是更简单好用吗?因为要应对一些异常情况,在插入 fd 时需要做重复检查,所有数据结构需要承担查询的需求。所以这里用红黑树。
5. 就绪列表为什么用双向链表?这是一个不断插入就绪fd和删除fd 的场景。在插入和删除中间的节点时,双向链表性能会更好,可以通过 prev 指针操作前节点,单向链表需要暂存上一节点。
从数据结构的角度去理解 epoll IO多路复用
1. epoll 里面主要有两个数据结构,红黑树,双向链表。这两个都是存放 文件描述符fd(file description),红黑树存放的是所有fd,双向链表存放已经就绪的fd
2. epoll 是基于事件驱动做通知的,所有添加到 epoll中的fd(和事件回调函数关联)都会和设备(网卡)驱动程序建立回调关系,也就是说当网卡检查到连接establish 后会通知 epoll 对应的 fd ready了,可以把这个fd 从红黑树移动到双向链表
3. epoll 是如何识别具体到是哪个 fd就绪了呢?遍历红黑树吗?基于回调函数就行,所以epoll 查找就绪fd 的时间复杂度是 O(1)
4. 那既查找是 O(1)那为什么还要用红黑树来存储fd?直接用链表不是更简单好用吗?因为要应对一些异常情况,在插入 fd 时需要做重复检查,所有数据结构需要承担查询的需求。所以这里用红黑树。
5. 就绪列表为什么用双向链表?这是一个不断插入就绪fd和删除fd 的场景。在插入和删除中间的节点时,双向链表性能会更好,可以通过 prev 指针操作前节点,单向链表需要暂存上一节点。
展开
评论
点赞