几种IO复用简介

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。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容