Linux服务端编程
IO复用
select:
- 连接数有限制需要修改linux系统设置
- 遍历所有句柄,确定那些有事件发生,具体是什么事件
epoll:
- 只选择发生初始注册的事件的句柄,内核使用红黑树保存句柄链表
- 分为ET(边沿触发)、LT(水平触发)
1. LT(水平触发):
只要数据没有被取完,内核就一直在提醒
2. ET(边沿触发):
- 与LT相比,ET模型是通过减少系统调用来达到提高并行效率的。
- 只有状态发生发生改变,内核才会通知
Epoll在LT和ET模式下的读写方式
Epoll工作模式详解
Accept连接问题:
当多个连接同时到达的时候
- 在LT模式下,如果有accept有返回,可以马上建立当前连接,然后使用epoll_wait等待下次通知
- 在ET模式下,由于只有在状态发生改变(到达的连接都是EPOLLIN状态)才会接收到通知,因而只收到一次通知。所以我们除了建立这个连接外,不能马上epoll_wait,需要继续循环accept防止剩余其他的未处理的连接,直到返回-1,且errno==EAGAIN。