1、IO多路复用模型是阻塞IO,阻塞部分是select函数而不是socket,IO多路复用模型是可以监听多个socket连接, IO多路复用模型目的不是单个连接有多快,而是需要连接大量的请求。
2、epoll的ET 需要保证socket是non block socket
首先介绍一个select 和 poll 模型吧
select : 所有的socket连接都注册到一个select,然后启动一个线程去遍历这个select,当发现有socket进入就绪状态,然后就会去执行这个socket里面的读写,处理完就返回,然后接着遍历。(轮训模式)
缺点:
1、文件描述符使用数组存,会出现数量的限制,1024个。
2、每次调用select都要去初始化一次描述符。重复初始化。将fd从用户态拷贝到内核态,每次调用select后,都需要将fd从内核态拷贝到用户态;
3、轮训排查方式太慢,效率低
poll:和select差不多 都是轮训的方式,但是有一点不一样,fd的存储使用链表,fd个数不受限制了,然后每次初始化fd之后就不用再次初始化,
缺点:轮训方式太慢
epoll: 采用事件触发模式,epoll采用只返回状态发生变化的文件描述符,便解决了轮寻的瓶颈。使用红黑树存储fd,有两种模式。
LT 水平触发模式
EL 边缘触发模式