1、Stream 与 Channel

  • stream 不会自动缓冲数据,channel 会利用系统提供的发送缓冲区、接收缓冲区(更为底层)
  • stream 仅支持阻塞 API,channel 同时支持阻塞、非阻塞 API,网络 channel 可配合 selector 实现多路复用
  • 二者均为全双工,即读写可以同时进行
  • 虽然 Stream 是单向流动的,但是它也是全双工的

2、IO 模型

  • 同步:线程自己去获取结果(一个线程)
  • 例如:线程调用一个方法后,需要等待方法返回结果
  • 异步:线程自己不去获取结果,而是由其它线程返回结果(至少两个线程)
  • 例如:线程 A 调用一个方法后,继续向下运行,运行结果由线程 B 返回

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

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

IO、NIO、BIO_用户线程

根据 UNIX 网络编程 - 卷 I,IO 模型主要有以下几种

  • 用户线程进行 read 操作时,需要等待操作系统执行实际的 read 操作,此期间用户线程是被阻塞的,无法执行其他操作
  • 用户线程
    在一个循环中一直调用 read 方法,若内核空间中还没有数据可读,立即返回
  • 只是在等待阶段非阻塞