程序员技术干货

『IO』BIO,NIO和AIO以及相关名词解析

2017-09-19  本文已影响129人  dejunz

网络通信中经常用到IO操作,IO操作主要有BIO,NIO以及AIO等几种模式,要弄清这几种IO模式,又需要弄懂阻塞/非阻塞,同步/异步概念。网上对这几种概念的解释各不相同,我在本文中记录下我自己的理解。

一次IO请求操作,主要有数据准备数据拷贝两个阶段。

这是因为"用户内存"并不能使用“系统内存”中的数据,需要将数据从内核拷贝到应用的内存中。

BIO(Blocking IO)指的是同步阻塞IO操作。
NIO(Non-Blocking IO)指的是同步非阻塞IO操作。
AIO(Asynchronous I/O)指的是异步非阻塞IO操作。

首先要弄清同步/异步以及阻塞/非阻塞是两个层次上的概念

同步/异步指的是消息通信机制,一种全局的概念。

阻塞/非阻塞指的是进程在等待请求结果时的状态

明白了以上概念,再看几种通信模式:

一.BIO

在BIO通信模式下,服务端每收到一个连接(socket),就会创建专门的线程(serversocket)响应该连接,这个连接会一直存在等待读取发来的数据,这个过程会阻塞所在线程,不能做别的事,直到操作结束返回结果值,因此这是同步阻塞。
BIO模式下,服务端连接多个客户端时,会开启多个线程响应连接。

二.NIO

NIO则不会对每个连接都开启单独线程,NIO主要由BufferChannelSelector三部分组成。

相比于BIO,NIO不需要为每个连接开启一个线程,而是统一由Selector管理,当连接没有IO操作时,不需要阻塞线程等待数据,只有当Selector检测到哪个Channel有有效的IO请求时,再为其开启操作线程,节省线程的开销,操作结束后返回结果值,故为同步非阻塞。

三.AIO

AIO则是特殊的API,与BIO和NIO不同,当应用程序访问内核请求数据后,会直接返回,此时操作系统会完成第一第二阶段,当数据准备完毕后再通知应用程序,此过程应用程序可做任意事情,在这一阶段,和NIO不同的是NIO会主动轮询操作系统数据是否准备完毕,而AIO则是等待系统主动通知,再去取数据。这个过程中AIO仅仅向内核发送了请求,直接返回了函数,所谓异步,整个过程由系统完成数据装配,更没有线程阻塞了。

文章内容为个人理解,如有错误欢迎指出。

邮箱:CodingDjz@126.com

上一篇 下一篇

猜你喜欢

热点阅读