概述
NIO 目录
文章目录
- 一、Java的IO演进
- 1、I/O模型基本说明
- 1.1、BIO
- 1.2、NIO
- 1.3、AIO
- 1.4、BIO、NIO、AIO适用场景分析
一、Java的IO演进
在java的软件设计开发中,通信架构是不可避免的,我们在进行不同系统或者不同进程之间的数据交互,或者在高并发下的通信场景下都需要用到网络通信相关的技术,对于一些经验丰富的程序员来说,Java早期的网络通 信架构存在一些缺陷,其中最令人恼火的是基于性能低下的同步阻塞式的I/O通信(BIO),随着互联网开发下通 信性能的高要求,Java在2002年开始支持了非阻塞式的I/O通信技术(NIO)。
1、I/O模型基本说明
I/O模型:就是用什么样的通道或者说是通信模式和架构进行数据的传输和接收,很大程度上决定了程序通信的性能 。
Java共支持3种网络编程的I/O模型:BlO、NIO、 AlO
实际通信需求下,要根据不同的业务场景和性能需求决定选择不同的I/O模型。
1.1、BIO
BIO:同步并阻塞(传统阻塞型),服务器实现模式为:一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销。
简单示意图 :
1.2、NIO
NIO:同步非阻塞,服务器实现模式为:一个线程处理多个请求(连接),即客户端发送的连接请求都会注册到多路复用器上(Selector选择器),多路复用器轮询到连接有I/O请求就进行处理。
简单示意图:
但是并不推荐用 JDK 原生 NIO 进行开发,从编码过程可以看出来,是真的难用!除了编程复杂、编程模型难之外,它还有以下让人诟病的问题:
- JDK 的 NIO 底层由 epoll 实现,该实现饱受诟病的空轮询 bug 会导致 cpu 飙升 100%
- 项目庞大之后,自行实现的 NIO 很容易出现各类 bug,维护成本较高,上面这一坨代码我都不能保证没有 bug
Netty 的出现很大程度上改善了 JDK 原生 NIO 所存在的一些让人难以忍受的问题。
Netty本身就是一个基于NIO的网络框架, 封装了Java NIO那些复杂的底层细节,给你提供简单好用的抽象概念来编程。(Dubbo底层就是用的Netty)
1.3、AIO
AIO(NIO.2):异步非阻塞,服务器实现模式为:进程读取数据时只负责发送跟接收指令,数据的准备工作完全由操作系统来处理。一般适用于连接数较多且连接时间较长的应用。
AIO 也就是 NIO 2。在 Java 7 中引入了 NIO 的改进版 NIO 2,它是异步非阻塞的IO模型。异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。
AIO 是异步IO的缩写,虽然 NIO 在网络操作中,提供了非阻塞的方法,但是 NIO 的 IO 行为还是同步的。对于 NIO 来说,我们的业务线程是在 IO 操作准备好时,得到通知,接着就由这个线程自行进行 IO 操作,IO操作本身是同步的。(除了 AIO 其他的 IO 类型都是同步的,这一点可以从底层IO线程模型解释,推荐一篇文章:《漫话:如何给女朋友解释什么是Linux的五种IO模型?》 )
查阅网上相关资料,我发现就目前来说 AIO 的应用还不是很广泛,Netty 之前也尝试使用过 AIO,不过又放弃了。
1.4、BIO、NIO、AIO适用场景分析
- (1) BIO方式适用于连接数目比小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中, jDK1.4以前的唯一选择,但程序简单易理解。
- (2) NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,弹幕系统,服务器间通讯等。 编程比较复杂,jDK1 .4开始支持。
- (3) AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作, 编程比较复杂,JDK7开始支持。
最后
以上就是任性蓝天为你收集整理的一、Java的IO演进一、Java的IO演进的全部内容,希望文章能够帮你解决一、Java的IO演进一、Java的IO演进所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复