一、IO的分类
1、根据通信机制
同步IO:排队,用户线程发送请求后,需要等待IO完成后才能继续执行
异步IO:并发,用户发起IO请求后可继续执行,IO操作完成后会通知用户线程
2、根据调用状态
阻塞IO: IO操作需要彻底完成后,才能返回用户空间
非阻塞IO: IO操作调用后,会立即返回一个状态值,无序IO操作彻底完成后
二、典型IO:BIO、NIO、AIO
(一)BIO---同步阻塞式 JDK1.4前
1、实现模式
一个连接请求对应一个线程,服务器为每一个客户端请求创建一个线程
2、适用场景
连接数目少,且服务器资源多
3、缺点
若这个连接不做任何操作,会造成不必要的线程开销---------改善:线程池
4、使用Stream流方式读写数据(字节流)
(二)NIO---同步非阻塞式 JDK1.4前
1、实现模式
多个请求对应一个线程,客户端连接请求被注册到一个多路复用器Selector上
Selector轮询连接有IO请求时,才启动一个线程处理
2、适用场景
连接数目多且连接时间短
3、特点
同步:线程要不断接收客户端连接并等待IO处理完成后继续执行
非阻塞:如果一个管道里没有数据,不需一直等待,轮询下一个管道
4、核心组件
(1)Selector:多路复用,轮循检查Channel状态,判断是否处于可读或可写状态
将要使用的Channel注册到Selector,并获得一个SelectionKey
进而用来获得Channel及Selector信息
(2)channel:双向通道,通过Buffer来读写数据,不能直接访问数据
(3)Buffer:缓冲区,一块可读写的数据内存,用来简化数据的读写
三个属性:position-----下次读写数据的位置
limit-------本次读写的极限位置
capacity----最大容量
5、读写数据
从channel中读数据----相当于向buffer中写数据,调用buffer中flip方法转为读模式
从channel中写数据----相当于向buffer中读数据,调用buffer中clear或compact方法清空缓冲区
(三)AIO---异步非阻塞式 JDK7
1、实现模式
一个有效请求对应一个线程
客户端的IO请求都是由操作系统先完成IO操作后,再通知服务器应用来直接使用准备好的数据
操作系统完成IO操作期间,服务器可执行其他操作, 而不是等IO请求完成后才开始执行
2、适用场景
连接数目多且连接时间长的场景
3、特点
异步:服务端接收到客户端管道后就交给底层处理IO通信,自己可以处理其他事情
非阻塞:客户端有数据就会处理,处理好就通知服务器,而不是等IO操作彻底完成
4、涉及的核心原理
(1)两种实现方式:Future模式和注册CompletionHandler接口
(2) 引入了TCP,和面向流的异步socket channel,表示一个连接。
[注]传输层:TCP 面向来凝结的传输控制协议
UDP 无连接的数据报协议
(3)非阻塞nio框架一般都是采用Reactor模式,Reacot负责事件的注册、select、事件的派发;
异步IO有个Proactor模式,Proactor负责 CompletionHandler的派发
(4)异步channel的分组管理,目的是为了资源共享。
一个AsynchronousChannelGroup绑定一个线程池,这个线程池执行两个任务:处理IO事件和派发CompletionHandler
核心原理部分来源:AIO原理_u012515285的博客-CSDN博客_aio实现原理