如何理解BIO、NIO、AIO?

Connor 币安交易所app下载 2022-07-21 112 0

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

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

如何理解BIO、NIO、AIO<strong></p>
<p>Bitonic</strong>?

阻塞IO

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

如何理解BIO、NIO、AIO<strong></p>
<p>Bitonic</strong>?

非阻塞IO

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

如何理解BIO、NIO、AIO<strong></p>
<p>Bitonic</strong>?

IO复用

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

如何理解BIO、NIO、AIO<strong></p>
<p>Bitonic</strong>?

异步IO

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

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

BIO

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

如何理解BIO、NIO、AIO<strong></p>
<p>Bitonic</strong>?

ServerSocket

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

NIO

如何理解BIO、NIO、AIO<strong></p>
<p>Bitonic</strong>?

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

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

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

Buffer

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

Buffer 三个重要属性:position、limit、capacityBitonic

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

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

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

Channel

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

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

评论