BIO、NIO、AIO的定义和区别

1.同步和异步
同步(synchronize)、异步(asychronize)是应用程序和内核的交互而言的

同步:
指用户进程触发IO操作等待或者轮训的方式查看IO操作是否就绪

同步举例:
银行取钱,我自己去取钱,取钱的过程中等待
异步:
当一个异步进程调用发出之后,调用者不会立刻得到结果,而是在调用发出之后,被调用通过状态、通知来通知调用者,或者通过回调函数来处理这个调用。
使用异步IO时,JAVA将IO读写委托给OS处理,需要将数据缓冲区地址和大小传给OS,OS需要支持异步IO操作

2.阻塞和非阻塞

阻塞和非阻塞是针对于进程访问数据的时候,根据IO操作的就绪状态来采取不同的方式.
简单点说就是一种读写操作方法的实现方式. 阻塞方式下读取和写入将一直等待, 而非阻塞方式下,读取和写入方法,会理解返回一个状态值
阻塞:
ATM机排队取款,你只能等待排队取款(使用阻塞IO的时候,Java调用会一直阻塞到读写完成才返回。)
非阻塞:
柜台取款,取个号,然后坐在椅子上做其他事,等广播通知,没到你的号你就不能去,但你可以不断的问大堂经理
排到了没有。(使用非阻塞IO时,如果不能读写Java调用会马上返回,当IO事件分发器会通知可读写时再继续进行
读写,不断循环直到读写完成)

例子:

老张煮开水。 老张,水壶两把(普通水壶,简称水壶;会响的水壶,简称响水壶)。
1 老张把水壶放到火上,站立着等水开。(同步阻塞)
2 老张把水壶放到火上,去客厅看电视,时不时去厨房看看水开没有。(同步非阻塞)
3 老张把响水壶放到火上,立等水开。(异步阻塞)
4 老张把响水壶放到火上,去客厅看电视,水壶响之前不再去看它了,响了再去拿壶。(异步非阻塞)

BIO

同步阻塞IO,B代表blocking
服务器实现模式为一个连接一个线程,即客户端有链接请求时服务器端就需要启动一个县城进行处理,如果哈这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。
适用场景:java1,4之前唯一的选择,简单易用但资源开销太高

在这里插入图片描述

NIO

同步非阻塞IO (non-blocking IO / new io)是指JDK 1.4 及以上版本

服务器端实现模式为一个请求一个通道,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有IO请求时才启动一个线程进行处理
通道(channels)
NIO新引入的最重要的抽象是通道的概念。Channel数据连接的通道。数据可以从Channel读到Buffer中,也可以从Buffer写到Channel中
缓冲区(Buffers)
通道channel可以向缓冲区Buffer中写数据,也可以像Buffer中存数据
选择器(Selector)
使用选择器,借助单一线程,就可对数量庞大的活动 I/O 通道实时监控和维护

在这里插入图片描述
2.NIO的特点

当一个连接创建后,不会需要对应一个线程,这个连接会被注册到多路复用器。

所以一个连接只需要一个线程即可,所有的连接需要一个线程就可以操作,该线程的多路复用器会轮训,发现连接有请求时,才开启一个线程处理。
如上图所示,IO模型中,一个连接来了,会创建一个线程,对应一个while死循环。

死循环的目的就是不断监测这条连接上是否有数据可以读,大多数情况下,1w个连接里面同一时刻只有少量的连接有数据可读。

因此,很多个while死循环都白白浪费掉了,因为读不出啥数据。

而在NIO模型中,他把这么多while死循环变成一个死循环,这个死循环由一个线程控制,那么他又是如何做到一个线程,一个while死循环就能监测1w个连接是否有数据可读的呢? 

这就是NIO模型中selector的作用,一条连接来了之后,现在不创建一个while死循环去监听是否有数据可读了,而是直接把这条连接注册到selector上。

然后,通过检查这个selector,就可以批量监测出有数据可读的连接,进而读取数据。

下面我再举个非常简单的生活中的例子说明IO与NIO的区别

在一家幼儿园里,小朋友有上厕所的需求,小朋友都太小以至于你要问他要不要上厕所,他才会告诉你。

幼儿园一共有100个小朋友,有两种方案可以解决小朋友上厕所的问题
1. 每个小朋友配一个老师。每个老师隔段时间询问小朋友是否要上厕所,如果要上,就领他去厕所,100个小朋友就需要
100个老师来询问,并且每个小朋友上厕所的时候都需要一个老师领着他去上,这就是IO模型,一个连接对应一个线程。

2. 所有的小朋友都配同一个老师。这个老师隔段时间询问所有的小朋友是否有人要上厕所。
然后每一时刻把所有要上厕所的小朋友批量领到厕所,这就是NIO模型,所有小朋友都注册到同一个老师,对应的就是所有的连接都注册到一个线程,然
后批量轮询

AIO

异步非阻塞IO。A代表asynchronize

当有流可以读时,操作系统会将可以读的流传入read方法的缓冲区,并通知应用程序。

对于写操作,OS将write方法的流写入完毕是操作系统会主动通知应用程序。因此read和write都是异步 的,完成后会调用回调函数。

使用场景:连接数目多且连接比较长(重操作)的架构,比如相册服务器。重点调用了OS参与并发操作,编程比较复杂。Java7开始支持
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酆都小菜鬼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值