目录
一.IO中的两组概念
1.阻塞/非阻塞:没有数据传过来时,读会阻塞直到有数据;缓冲区满时,写操作也会阻塞。 非阻塞遇到这些情况,都是直接返回。
2.同步/非同步:数据就绪后需要自己去读是同步,数据就绪后系统直接读好再回调给程序是异步。
二.Java BIO模型
1.BIO概念:(Blocking IO)同步阻塞IO,为每一个请求分配一个线程,IO操作基于流stream操作。
2.线程开销:客户端的并发数与服务端的线程数成1:1的关系,随着并发量变大服务端的性能将显著下降。
3.线程阻塞:连接建立后,如果该线程没有操作,会阻塞,非常浪费服务端资源。
三.Java NIO模型
1.NIO概念:(Non-Block IO)同步非阻塞IO。
2.NIO三大核心组件:Buffer、Channel、Selector(缓冲区、通道、选择器)
(1)Buffer:缓冲区的本质是一个字节数组,在BIO中数据是直接写到stream中,而在NIO中都是写到Buffer中。
(2)Channel:网络数据通过Channel读取和写入,Channel是双向的而流是单向的(InputStream/OutputStream),而且Channel支持同时读写(全双工)。
(3)Selector:Selector不断轮询注册在其上面的Channel,如果某个Channel上面发生读写事件(就绪),就会被Selector轮询出来,再通过selectedKeys获取就绪的Channel集合,进行后续的IO操作。
四.Java AIO模型
1.AIO概念:(Asynchronous IO)异步非阻塞IO,这里的异步IO是需要依赖于操作系统底层的异步IO实现。
2.AIO基本流程:用户线程通过系统调用,告知kernel内核启动某个IO操作,用户线程返回。kernel内核在整个IO操作(包括 数据准备、数据复制)完成后,通知用户程序,用户执行后续的业务操作。
3.AIO不足:windows下实现成熟,Linux 系统下目前并不完善,所以Linux实现高并发网络编程时都是以 NIO多路复用模型为主。