什么是非io阻塞

io模型指的是同时操作socket 的方案

  • 阻塞

    • 一个线程负责一个socket,阻塞,内核等待。

    • 同步读写socket,线程陷入内核态

    • 当读写成功后,切回用户态,继续执行

      缺点:内核态切换开销大

      优点:简单

  • 非io阻塞

    如果暂时无法收发数据,会返回错误

    应用会不断轮训,直到socket可以读写

    优点:不会陷入内核态,自由度高

    缺点:需求自旋轮训

    一个线程可以开多个socket 处理

  • 多路复用

    • 注册多个socket事件
    • 调用epoll,当有事件发生,返回
    • 优点:提供了事件列表,不需要查询各个socket
    • 缺点:开发难度大,逻辑复杂
    • linux epoll ,Mac:kqueue ,windows:iocp