IO NIO AIO

IO大致分为两类:面向磁盘和面向网络。
在 Java 中有3种 I/O 类型:
BIO 同步阻塞
NIO 同步非阻塞
AIO 异步非阻塞

在这里插入图片描述

BIO是一个连接一个线程。

NIO是一个请求一个线程。

AIO是一个有效请求一个线程。

第一, java.io包,它基于流实现,提供基础 IO 功能,比如 File 抽象、输入流输出流等。同步阻塞的方式,在读取输入流或者写入输出流时,在读、写动作完成之前,线程会一直阻塞在那里。

java.io包的好处是代码比较简单、直观,缺点则是 IO 效率和扩展性存在局限性,容易成为应用性能的瓶颈。

很多时候,人们也把 java.net下面提供的部分网络 API,比如 Socket、ServerSocket、HttpURLConnection 也归类到同步阻塞 IO 类库,属于网络io。

第二,在 Java 1.4 中引入了 NIO 框架(java.nio 包),提供了 Channel(硬件设备、文件或网络套接字的连接)、Selector、Buffer 等新的抽象,可以构建多路复用的、同步非阻塞 IO ,同时提供了更接近操作系统底层的高性能数据操作方式。NIO 将读写改为非阻塞,无数据可读,线程返回线程池,可用于处理其他连接。它对原始 I/O 提供了新的抽象 - Channel(通道),并且提供基于缓冲区的读写 API。

第三,在 Java 7 中,NIO 有了进一步的改进,也就是 NIO 2,引入了异步非阻塞 IO 方式,也有很多人叫它 AIO(Asynchronous IO)。异步 IO 操作基于事件和回调机制,可以简单理解为,应用操作直接返回,而不会阻塞在那里,等后台处理完成,操作系统会通知相应线程进行后续工作(异步)。

BIO

NIO基于Reactor,当socket有流可读或可写入socket时,操作系统会相应的通知引用程序进行处理,应用再将流读取到缓冲区或写入操作系统。 也就是说,这个时候,已经不是一个连接就要对应一个处理线程了,而是有效的请求,对应一个线程,当连接没有数据时,是没有工作线程来处理的。

BIO与NIO一个比较重要的不同,是我们使用BIO的时候往往会引入多线程,每个连接一个单独的线程;而NIO则是使用单线程或者只使用少量的多线程,每个连接共用一个线程。

NIO的最重要的地方是当一个连接创建后,不需要对应一个线程,这个连接会被注册到多路复用器上面,所以所有的连接只需要一个线程就可以搞定,当这个线程中的多路复用器进行轮询的时候,发现连接上有请求的话,才开启一个线程进行处理,也就是一个请求一个线程模式。

在NIO的处理方式中,当一个请求来的话,开启线程进行处理,可能会等待后端应用的资源(JDBC连接等),其实这个线程就被阻塞了,当并发上来的话,还是会有BIO一样的问题。

BIO,采用BIO编程通信模型的服务端,通常由一个独立的Acceptor线程负责监听客户端的连接。它接收到客户端连接请求之后为每个客户端创建一个新的线程进行链路处理,处理完成后,通过输出流返回给对应的客户端,然后销毁线程。

服务端提供IP地址和监听的端口,客户端通过TCP的三次握手与之连接,连接成功后,双方通过套接字通信。  ServerSocket负责绑定IP地址,启动监听端口;Socket负责发起链接操作。连接成功,双方通过输入和输出流进行同步阻塞式通信。
Java.net提供的API,如Socket,ServerSocket,HttpURLConnection也归与同步阻塞IO类库,因为网络通信同样是IO行为。

优点:代码简单,直观,维护方便。  
缺点:IO效率极低,影响性能。  
当吞吐量增大了,采用线程池。  
使用线程池管理线程,避免频繁创建,销毁线程的开销。
但是,其底层使用的依然是同步阻塞IO,通常被称为“伪异步IO模型”。
IO不仅仅时对文件的操作,网络编程中,比如Socket通信也是典型的IO操作。  
输入流(InputStream),输出流(OutputStream),用于读取或写入字节的(在java中以Stream结尾)而Reader/Writer操作字符,增加了字符编解码等功能(在java中以Reader/Writer结尾)。本质上计算机操作的都是字节,不管是网络通信还是文件读取,Reader/Writer相当于构建了应用逻辑和原始数据之间的桥梁BufferdOutputStream,等带缓冲区的实现,可以避免频繁的磁盘读写,进而提高IO处理效率。

NIO

设计原理:

  1. 服务端与客户端通过Channel通信;
  2. NIO在Channel上读写;
    3.Channel被注册到Selector多路复用器上。Selector通过一个线程轮询这些Channel,找出已经就绪的Channel。
    NIO通过线程的轮询,实现非阻塞IONIO的组成部分:
    1,Buffer 缓冲区;高效的数据容器
    不同的是BIO将数据直接读写到Stream对象中
    NIO的数据操作都是在缓冲区中进行的
    缓冲区实际上是一个数组,常见类型ByteBuffer,CharBuffer,ShortBuffer,IntBuffer,LongBuffer,FloutBuffer,DoubleBuffer
    2.,Channel 在NIO中被用来支持批量式IO操作的一种抽象,与流不同,通道是双向的。 File/Socket,通常被认为是比较高层次的抽象,而Channel则是更加偏向操作系统底层的一种抽象,这也使得NIO得以充分利用现代操作系统底层机制,进行性能优化。分两大类:网络读写SelectableChannel(子类包括SocketChannel和ServerSocketChannel);文件操作(FileChannel)
    3,Selector 是NIO实现多路复用的基础。它提供一种高效机制,不断轮询注册在其上的Channel,找出处于就绪状态,通过SelectionKey取得就绪的Channel集合,进行后续的IO操作。服务端只要提供一个负责Selector轮询的线程即可,实现单线程对多Channel的高效管理,也是基于操作系统底层机制。

AIO

(Asynchronous IO) NIO 2
Java 7提出,NIO的升级版。实现非阻塞异步的通信模式;
提供异步文件通道和异步套接字通道;
其read,write方法的返回类型都是Future对象;
Future模型是异步的,
其核心思想是:去主函数等待时间;
事件和回调机制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值