🎯epoll
type
status
date
slug
summary
tags
category
icon
password
Blocked by
Blocking
AI summary
IO 多路复用是什么
多路:存在多个需要处理的io event的fd
复用:复用一个loop thead 同时为多个fd提供服务
多路复用技术分类
linux内核提供了三种经典的多路复用技术

select
- 一次可以最多处理1024个 fd
- loop thread 通过select 将一组fd提交到内核中,做监听
- 当fd 中无io event 就绪时,loop thread 陷入阻塞
- 当这组fd 有io event到达时,内核会唤醒loop thread
- 其中,loop thead 无法精确感知哪些fd为 就绪,需要遍历一轮fd列表,时间复杂度为O(N)
epoll
- 可以处理的fd没有上限
- loop thead 通过
epoll_create
创建一个epoll池子
- loop thread 通过
epoll_ctl
每次将一个待监听
的fd添加到epoll的池子中
- 每当fd列表中有fd就绪事件时,会唤醒loop thread,这个过程是事件通知的形式,无需额外的遍历
epoll涉及的函数
- epoll_create:在内核开辟空间,创建一个 epoll 池子用于批量存储管理 fd,后续可以通过 epoll_ctl 往池子中增删改 fd.
- epoll_ctl:在某个 epoll 池子中进行一个 fd 的增删改
- epoll_wait:从对应 epoll 池子中获取就绪的 epollevent
epoll池是使用linux内核的红黑树(red-black tree,一种自平衡二叉查找树),保证了所有增、删、改操作的平均时间复杂度维持在 O(logN) 的对数级水平
主要优势
- 拆解构池接口epoll_create和入池接口 epoll_ctl,实现fd一次拷贝,多次服用
- 通过红黑树池子维护fd数据,增删改查平均复杂度为0(logN)
- 精准事件回调,准确告诉loop thread 具体哪些fd已就绪,减少了一次额外的遍历操作,时间复杂度由O(N)优化到了O(1)
本质:
- 减少用户态和内核态之间文件句柄的拷贝
- 减少对可读可写文件句柄的遍历
红黑树 TODO
ref
Prev
Golang map
Next
Golang GMP模型
Loading...