I/O模型介绍
1、概念/作用:说到I/O肯定想到的就是IO流做文件的上传下载的操作,那这里也就不难解释了,它就是决定用哪一个通道进行数据的发送和接收,不同的通道对程序通信的性能指标也是不一的
2、JAVA领域目前支持三种网络编程模型:BIO(同步并阻塞)、NIO(同步非阻塞)、AIO(异步非阻塞)
可能有童鞋不了解什么是同步异步,阻塞和非阻塞,那这里也顺势说一下
①阻塞和非阻塞,可以理解为堵车和不堵车,堵车的话,请求就不顺畅,不堵车的话,请求就很顺畅,不用等待,直接执行下面流程
②同步和异步:前者可以理解为一个两点一线,请求只能按照流程一来一回的执行,后者可以理解两点多线,请求可以多来多回,请求之间互不影响,不需要等待其他请求
BIO模型
BIO就是比较传统的socket编程了,实现是一个连接一个线程,也就是客户端有连接请求时,服务器就要对应的启动一个线程去处理这个请求,但是可能存在请求是无效的,为了不浪费线程资源,可以使用线程池来避免这个问题
工作原理:
一个线程处理一个请求,就相当于来一辆车就要配一个司机,烧水只需要一个门童,可以结合下面的图来了解一下
BIO的问题
- 每一个请求都要创建一个线程来与处理客户端的数据请求
- 如果并发量大,那这个时候每个并发都需要线程,那将会创建大量线程,资源占比就会比较大
- 如果请求是读,但是数据在读上面出现问题了,比如数据没了,也就啥也读不出来,这个是都读操作就会一直阻塞,这样就又造成了资源浪费
适用场景
适用于连接数相对小并且固定的场景,因为BIO对服务器资源要求比较高,而且BIO还是JDK1.4之前的唯一选择,不过好处就是简单容易理解
NIO模型
跟BIO的区别就是:BIO是一个请求一个线程,NIO是一个线程多个请求,这里面NIO在BIO的架构基础上加了一层多路复用器,看图
适用场景
适用于连接数多而且连接比较短的场景,如果聊天服务器、弹幕等等,他是JDK1.4之后才出现的,源码比较复杂
AIO模型
AIO对比NIO相当于又做了升级,它引入了异步通道和采用了Proactor模式,也就是有效的请求才会创建线程去处理,特点就是请求会先交给操作系统完成后才会通知服务端创建线程来处理请求,所以一般情况下,AIO适用于连接数较多且连接时间较长的应用场景,看架构图:
适用场景
适用于连接数多而且连接比较长的场景,他是JDK7之后出现的,源码上也是比较复杂的