同步阻塞(BIO)
- 服务器采用单线程模型的情况下,当accept一个请求后,调用send/recv时线程将会被阻塞。
- 服务器采用多线程模型下,当accept一个请求后,开启线程进行recv,可以完成并发处理,但是线程数量是有限的,并且线程也会相应的消耗系统资源。
同步非阻塞(NIO)
- 服务器accept一个请求后,将其加入fds集合,采用轮询的方式对fds集合进行遍历,可以完成并发处理,但是缺陷在与需要遍历所有的fds集合,在真实业务情况下大部分的fd都是没有消息的。
IO多路复用
- 采用单线程模式对多个文件句柄进行监控
select的局限性
- 每次需要将fds从用户态拷贝到内核态,性能消耗
- 为防止fd拷贝时对性能的消耗太大,设置数组大小为1024限制
- 事件处理需要遍历整个fds集合,效率低
鸡肋的poll
- 解决1024限制,但是fds拷贝与遍历性能低未解决
epoll
- linux底层采用红黑树维护fds,基于epoll_ctrl完成fd的修改,解决拷贝消耗与1024限制
- 采用readylist的方式维护事件列表,解决事件处理遍历整个fds集合问题
ET/LT
- 边缘触发(ET):无论事件有没有处理完,只触发一次,存在消息一次未处理完的可能
- 水平触发(LT):事件未处理完,一直触发,可能造成机器性能负担
有时间再补充~