BIO

同步阻塞I/O模式,数据的读取写入必须阻塞在一个线程内等待其完成(一请求一应答)。
BIO NIO AIO - 图1

Blocking IO,会一直等待数据传输,直到对方把数据发过来,或者等到网络超时。
对于单线程的网络服务,这样做就会有卡死的问题。

因为当等待时,整个线程会被挂起,无法执行,也无法做其他的工作。于是就通过多线程方式处理,但是多线程会造成CPU和内存的极大浪费:

  • 线程越多,Context Switch就越多,而Context Switch是一个比较重的操作,会无谓浪费大量的CPU。
  • 每个线程会占用一定的内存作为线程的栈。比如有1000个线程同时运行,每个占用1MB内存,就占用了1个G的内存。

    NIO

    Java NIO使我们可以进行非阻塞IO操作。比如说,单线程中从通道读取数据到buffer,同时可以继续做别的事情,当数据读取到buffer中后,线程再继续处理数据。写数据也是一样的。另外,非阻塞写也是如此。一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程同时可以去做别的事情。

    缓冲区

    通道

    选择器

    AIO

    异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。

    Linux五种IO

    BIO NIO AIO - 图2
    IO复用模型:多个进程的IO可以注册到同一个管道上,这个管道会统一和内核进行交互。当管道中的某一个请求需要的数据准备好之后,进程再把对应的数据拷贝到用户空间中。

    推荐阅读

    https://snailclimb.gitee.io/javaguide/#/docs/java/BIO-NIO-AIO?id=_1-bio-blocking-io