BIO : blocking io 同步阻塞模式
NIO : new io (non blocking) 同步非阻塞
AIO : asynchronous io
BIO
一个acceptor 线程负责监听客户端连接,当acceptor接收到了请求,就会建立连接,此时不能在接收其他客户端请求。(优化方式是使用线程池,但即使用了线程池,减少了线程创建销毁的开支,但线程切换还是不可避免。)
当访问量急剧增长时,会让线程数量飞速上涨,导致线程创建失败,堆栈溢出问题,最后服务宕机。
下图是线程池优化,通过设置线程池,减少线程创建,销毁的开销,同时,对线程总数做限制,不会导致服务器资源不够的情况。
BIO 适用低访问的服务,当单机访问小于1000的情况下,模型对于访问的处理简单,有效,单一线程执行相关程序。
NIO
同步非阻塞IO模型, N 也可以是 Non-blocking
对于IO 的区别,NIO 是不阻塞的,单线程在读取/写入数据时,可以处理其他事务,等到数据读取/写入完毕,再进行下一步。
IO是面对流, NIO 是面对缓冲区。
NIO 通过channel进行读写,channel的读写只和buffer交互 (和buffer交互,channel可以异步),并且channel是双向,可读可写(流是单向的)。
NIO 有Selectors(选择器),IO没有。Selectors用于单个线程匹配多个channel,只需要较少的线程可以处理多个通道,减少了线程间的切换。
NIO的核心组件就是 Channel (通道),Buffer(缓冲区),Selectors(选择器)。
JDK nio 底层用的epoll实现,有空轮询bug会导致CPU 100%。
AIO
即 NIO 2。 异步非阻塞的IO模型。 基于事件和回调机制实现。
补充,套接字连接过程(IO的阻塞处):