关于IO的一些思考

同步阻塞(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):事件未处理完,一直触发,可能造成机器性能负担

有时间再补充~

上一篇:如何定位Obj-C野指针随机Crash(二):让非必现Crash变成必现


下一篇:通过测试用例了解Oracle Temp表空间具体使用情况