知识铺: 致力于打造轻知识点,持续更新每次的知识点较少,阅读不累。不占太多时间,不停的来唤醒你记忆深处的知识点。
一、解决问题
1.1.解决select 文件句柄 数量限制
1.2.解决select及 poll 遗留的等待队列在用户态和内核态切换带来的资源浪费情况。
1.3 解决select及poll遗留的需要遍历整个等待队列中的所有 socket 激活事件问题。
二、相关函数
2.1 epoll _create
当天一个socket连接上来,基于epoll模式的 多路复用 模型,会主动创建一个epoll对象与之对应,同时把该对象添加到事件表中。既创建了红黑树储存对象ID和就绪list 链表 。
2.2 epoll_ctl
监控上面的epoll事件表,如果有socket可读可写就绪,则自动把该socket对应的对象,添加到就绪列表中。则检查在红黑树中是否存在,如果存在立即返回,不存在就插入到红黑树种。
2.3 epoll_wait
监控上面的就绪列表,这种模式无需poll和select模式下面必须遍历的情况。立刻返回准备绪链表即可。
2.4 close
epoll 对象使用完毕需要关闭,释放资源。
三、稍微了解下c/c++实战 伪代码
四、工作模式
socket就绪状态,如何通知,这里涉及到两种模式。
4.1 LT模式
LT(Level Triggered),水平模式触发,该模式同时指出阻塞socket和非阻塞socket。主动通知socket是否就绪状态,即使不需要,也会来通知。
4.2 ET模式 ( netty 默认)
ET(Edge Triggered),边缘模式触发,只有当未就绪模式切换到就绪模式,会通知一次。需要注意点:这种模式下,有可能只读取了部分数据,因为后续的得不到通知。需要开发人员正确处理好socket的读和写,要一直调用读写,直到碰到结束退出。