同步阻塞、同步非阻塞、同步多路复用、异步阻塞(没有此情况)、异步非阻塞

  • 同步:线程自己去获取结果(一个线程)
  • 异步:线程自己不去获取结果,而是由其它线程送结果(至少两个线程)

当调用一次 channel.read 或 stream.read 后,会切换至操作系统内核态来完成真正数据读取,而读取又分为两个阶段,分别为:

  • 等待数据阶段
  • 复制数据阶段

阻塞 IO
image.png

非阻塞 IO

  1. 客户端反复去轮询获取结果<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/1405454/1619364333949-2f8654b7-2e7f-4ae9-a4b1-3aeacaf9afcf.png#align=left&display=inline&height=303&margin=%5Bobject%20Object%5D&name=image.png&originHeight=606&originWidth=946&size=107308&status=done&style=none&width=473)

多路复用

事件机制,可能一次等待期间会产生多个事件,收到这多个事件后客户端可以一次性处理。
image.png

信号驱动

异步 IO
image.png

  • 阻塞 IO vs 多路复用

🔖 参考

UNIX 网络编程 - 卷 I