所有栏目 | 云社区 美国云服务器[国内云主机商]
你的位置:首页 > 云社区 » 正文

如何理解BIO、NIO、AIO?

发布时间:2020-04-12 01:27:44

资讯分类:nio  aio  bio  理解  阻塞  数据  调用
如何理解BIO、NIO、AIO?

这里先回答你下BIO和NIO是什么。

首先需要明白阻塞 非阻塞 同步 异步的概念,这里引用下史蒂文斯的《UNIX网络编程》中的几张图。



阻塞IO

图中可以看到阻塞IO,一直阻塞在recvfrom方法调用上,直接数据复制完成



非阻塞IO

图中可以看到非阻塞IO调用的recvfrom方法如果无数据直接返回,应用进程可以不断轮询是否有数据



IO复用

图中可以看到IO复用,进程不再去轮询获取数据了,而是有select去查看数据是否准备好,准备好了,你再调用recvfrom方法去读取数据



异步IO

异步IO,你发起系统调用,连数据都不用自己去读取,而是操作系统直接给你复制到用户空间,再回调你。

所以说同步和异步是针对用户空间和内核空间交互而言的,而阻塞和非阻塞是针对用户进程访问数据而言的。强烈推荐下《UNIX网络编程》。

BIO

java中的BIO是同步阻塞的。先看下服务端的例子



ServerSocket

这里实例下ServerSocket的使用方法,可以看出一个连接过来就需要创建一个线程来处理连接,这里可以使用线程池进行优化。

NIO



NIO的使用和注意的地方我都写图里了。

NIO就是同步非阻塞,连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才进行处理,还是需要用户自己去读取数据,所以是同步的,但是不用阻塞在IO线程上,所以是非阻塞的。

学习NIO,还需要学习下 Buffer、Channel的使用。

Buffer

Buffer 可以理解为一个数组,可以进行数据的读写。在使用NIO的时候,我们的数据必须通过buffer和Channel进行交互。

Buffer 三个重要属性:position、limit、capacity。

capacity:它代表这个缓冲区的容量,一旦设定就不可以更改。

position :初始值是 0,每写入一个值,position 就自动加 1。读也是类似的,每读一个值,position 就自动加 1。写操作切换读操作的时候,可以调用flip,position 会归零,这样就可以从头开始读写了。

limit:初始状态下,limit 代表的是最大能写入的数据,这个时候 limit 等于 capacity。调用flip后limit 等于 Buffer 中实际的数据大小,可以小于capacity。

Channel

Channel 通道,用于进行读写操作。一般使用channel.read(buffer) 和 channel.write(buffer)来读写数据。和流类似,但流是单向的,Channel是双向的。

希望对你有所帮助,有帮助记得点赞哦!可以关注下,后面持续分享架构和Java的文章,谢谢!

如何理解BIO、NIO、AIO?

先需要了解几个概念:同步和异步,阻塞和非阻塞。

同步和异步

  • 同步:进程触发IO操作的时候,必须亲自处理;你必须亲自去银行取钱。

  • 异步:进程触发IO操作的时候,可以不亲自处理,它把操作委托给OS处理,委托的时候需要告知数据的地址和大小,然后自己去做别的事情,当IO操作结束后会得到通知;你把银行卡给我,让我帮你去银行取钱,你需要告诉我银行卡密码和取多少钱,我取完了之后把钱给你。

总结:自己干就是同步,别人干就是异步。

阻塞和非阻塞

  • 阻塞:进程触发IO操作的时候,如果此时此时没办法读或者写,那么进程就一直等待,直到读写结束;比如你去银行ATM取钱,前面有人在排队,那么就要一直等待,直到你取完钱;

  • 非阻塞:进程触发IO操作的时候,如果此时此时没办法读或者写,那么就先去做别的,等到有通知后,再继续读写;比如你去银行柜台取钱,人比较多,那就先领一个号,等着叫到号再去对应的窗口办理业务;这里不太恰当的是,我们等待的过程中,还得听着叫号。

总结:我要等着不能做其他事就是阻塞,我不用等可以做其他事就是异步。

BIO、NIO、AIO

  • BIO:同步阻塞;一个请求过来,应用程序开了一个线程,等IO准备好,读写IO也是自己干;但是为一个请求就启动一个线程,开销是比较大的,因为启动和销毁线程开销很大,每个线程都要占用内存,所以可以引入线程池,可以在一定程度上减少这些开销;

  • NIO:同步非阻塞;不用等待IO准备,准备好了会通知,不过IO操作还是要自己干;NIO是一种多路复用机制,利用单线程轮询事件,Channel来决定做什么,避免连接数多的时候,频繁进行线程切换导致性能问题(Select阶段阻塞)。

  • AIO:异步非阻塞;因为事情不是自己做,其实也没有阻塞一说(都是非阻塞);AIO是在NIO的基础上,引入异步通道的概念;NIO是采用轮询的方式,不停地询问stream中数据是否准备好了,准备好了就处理;AIO是向操作系统注册IO监听,操作系统完成IO操作了之后,主动通知,触发响应的函数。

我将持续分享Java开发、架构设计、程序员职业发展等方面的见解,希望能得到你的关注。

如何理解BIO、NIO、AIO?

BIO是一个连接一个线程。

NIO是一个请求一个线程。

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

留言与评论(共有 0 条评论)
   
验证码:
Top