Please enable JavaScript.
Coggle requires JavaScript to display documents.
epoll (:recycle:模式 (:apple:状态 (:one:空闲状态, :two:就绪状态, :bread…
epoll
:recycle:模式
:moneybag:2种模式
:one:select.EPOLLEL
:warning:我们要在应用程序维护就绪队列,保证数据读写完整
:heavy_dollar_sign:用途
:one:当我们不需要读取用户所有数据时,比如前面50字节能说明该数据是否需要,那么我们先读取50字节,如果无用的话,就将缓冲区清空;如果有用的话,利用边沿触发的模式,直接再去读
-
:explode:ET(edge trigger) LT(level trigger). ET表示处理的机会就只有一次,如果poll了我就通知这一次,要是不处理就不再通知了.而LT如果你不处理就会一直通知你.ET效率高
:apple:状态
-
-
:bread:EPOLLET中如果不处理事件,就会从就绪队列中移除,并且kernel不再关心该文件描述符,直到应用程序读写它为止
-
-
:banana:libevent库
-
-
:wrench:使用开源库
:explode:先./configure
等安装好,然后在当前目录下有.libs
目录,里面有libevent的动态库和静态库.然后samples
里有例子,可以去查看
-
:watermelon:epoll反应堆
-
:apple:连接套接字写数据给对方
:bread:epoll->服务器->监听->cfd->可读->epoll返回->read->cfd从树上摘下->设置监听cfd写事件->操作->等待epoll_wait返回->回写客户端->cfd从树上摘下->设置监听cfd读事件->操作->epoll继续监听
:baguette_bread:我们的连接套接字不仅能读数据,还应该能写入数据
:snowflake:思路
-
-
:three:超时时间剔除
-
:two:每次epoll_wait所在while执行一次的时候,只检查里面的一部分(比如1024大小就只检查100)
-
-
:watermelon:心跳包
:explode:工作在应用层,比如TCP建立连接后,服务器/客户端为了知道对方能连接到,就周期地发送一些数据,如果对方正确返回数据,我就认为健康的,否则就认为不健康的(通常多发几次都失败)
-
:bulb:设置TCP属性,乒乓包(可以传递简单的数据)
:fire:编程特点
:one:创建epoll实例,添加文件描述符到epoll实例中管理,调用epoll_wait函数来阻塞检测IO
-
:apple:评价
:musical_note:优势
:one:共享内存
:explode:select和epoll有数据来后要将数据从内核空间拷贝到用户空间(内存拷贝),而epoll采用共享内存
:two:回调机制
:explode:发生事件后,调用回调函数把事件放到epoll就绪队列中
:three:减少了应用层的遍历
:explode:epoll_wait将输出放到events数组中,我们只要遍历events,就可以直接定位到事件
-
-
:peach:epoll红黑树
-
:two:普通节点
-
:two:data
:explode:事件相关的数据,比如说这个事件要怎么处理,对应什么文件描述符等
-
:warning:一些细节问题
:one:readn的阻塞问题
:explode:如果readn阻塞了,那我们的程序就卡在readn里,而不能调用epoll_wait来处理其他文件描述符
-
-