image.png image.png
第二个参数是输出参数
poll模型
每次调用poll函数的时候,都需要把监听套接字于已接字所感兴趣的时间组 拷贝到内核
数据拷贝是服务器性能的四大杀手之一。
epoll模型
不需要进行拷贝,只要关注的事件没有发生改变,就不需要对它关注
两种触发模式
- Level-Triggered
-Edge-Triggered
如果采用L T,那什么时候关注EPOLLOUT事件?会不会造成busy-loop?
ET模式
image.png
可以处理EMFILE
这种模式也有一个问题:
如果漏读了数据,后续新的客户端连接来,就一直不触发了。
LT电平触发(高电平触发)
-
EPOLLIN事件
内核中的socket接收缓冲区 为空 低电平 (不触发
内核中的socket接收缓冲区 不为空 高电平 -
EPOLLOUT事件
内核中的socket发送缓冲区不满 高电平
内核中的socket发送缓冲区满 低电平
ET 边沿触发
低电平-->高电平 触发
高电平-->低电平 触发
fd_set 32*32 1024位
image.png
image.png
image.png
EPOLL效率不总是高于select 和 poll。如果已连接套接字不太大,并且这些套接字非常活跃,不停的调用callback函数可能比一次性遍历返回 活跃的文件描述符效率更低
EPOLL内部实现更复杂,更复杂的代码逻辑
优势:处理大量连接,因此处理大并发服务器的时候要用EPOLL模型
网友评论