bio、nio、aio都是什么以及它们的区别

 目录

BIO:同步阻塞IO模式

NIO:同步非阻塞IO模式

AIO:异步非阻塞IO模式


IO的通信模式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。

BIO:同步阻塞IO模式

BIO是最传统的网络通信模式,通信模式是首先服务端启动一个ServerSocket,然后在客户端启动Socket来对服务端进行通信,此时就进入了同步阻塞模式的通信,客户端Socket发送一个请求,服务端Socket处理后进行响应,响应必须是处理完以后,在这之前任何事情都干不了。通常服务端Socket需要对每个请求建立一个线程来服务这个客户端。

当面对几万甚至成千上百万的请求时,该模式就显得效率低下,会导致服务器负载过高,最后崩溃等。因此我们需要更加高效的网络通信模式。

BIO通信模式图:

 

NIO:同步非阻塞IO模式

jdk1.4以后引入了NIO,对应 java.nio 包,是基于 Reactor 模型的一种同步非阻塞IO模式。

nio 包提供了 Channel , Selector,Buffer等抽象。NIO中的N可以理解为Non-blocking,不单纯是New。它支持面向缓冲的,基于通道的I/O操作方法。 一般是将数据写入 Buffer 中,然后从 Buffer 中读取数据,有 IntBuffer、LongBuffer、CharBuffer等多种基础的数据类型Buffer。Channel  是提供数据读写的,Selector 是一个多路复用器,Selector 会不断的轮循注册的 channel  ,如果某个 channel  上发生了读写事件,Selector 就会将 channel  获取出来,通过 selectionKey 获取有读写事件的 channel  ,就可以进行IO操作。一 个 Selector 通过一个线程,就可以轮循成千上万个  channel ,也意味着可以接入成千上万的客户端。

NIO提供了与传统BIO模型中的 SocketServerSocket 相对应的 SocketChannel 和 ServerSocketChannel 两种不同的套接字通道实现,两种通道都支持阻塞和非阻塞两种模式。阻塞模式使用就像传统中的支持一样,比较简单,但是性能和可靠性都不好;非阻塞模式正好与之相反。对于低负载、低并发的应用程序,可以使用同步阻塞I/O来提升开发速率和更好的维护性;对于高负载、高并发的(网络)应用,应使用 NIO 的非阻塞模式来开发。

NIO通信模式图:

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

AIO:异步非阻塞IO模式

是基于 Proactor 模型的一种异步非阻塞模式。

基于事件和回调机制实现:每个请求过来,都会绑定一个 buffer,然后通知操作系统异步完成,此时客户端可以执行其他逻辑,等待操作系统执行完以后,就会回调你的接口,通知你异步操作完成,然后你对数据进行处理并把结果往回写,写的时候也是给操作系统一个 buffer,让操作系统自己来读并完成写操作,写完以后再来通知你。

 

 

这篇文章说的也很好,值得参考:http://ifeve.com/netty-2-5/

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值