BIO/NIO/AIO的几个思考

BIO/NIO/AIO中的IO指的是什么?为什么网上一讲到BIO/NIO/AIO就是Socket编程、网络编程blabla一堆?NIO是不是就是java nio库?

其实这是笔者的一大疑问,我们最常接触的IO不应该是文件IO么,怎么一上来就是Socket编程、网络编程blabla一大堆。这大概要从IO的概念和发展历史来理解了(以下观点包含大量个人理解):
广义上来讲,IO(Input/Output)可以指任何系统or设备之间的数据输入输出操作,我们这边讨论的是应用程序与其他应用程序or IO设备之间的数据传输,而这个数据传输的过程抽象就叫IO,BIO/NIO/AIO只是IO过程的不同模型,全称分别是blocking-io阻塞式的IO,non-blocking-io非阻塞式的IO,asynchronized-io异步式的IO,概念上来说BIO/NIO/AIO适用于文件IO、网络IO等所有的IO,具体看是否有相关的实现罢了。至于网上为什么都是Socket编程、网络编程,主要是因为NIO/AIO的出现本身就是因为BIO模型的效率不足以适应高并发的网络环境,为了提高网络IO并发处理效率而产生的,在文件IO系统中应用好处并不是非常大,所以慢慢地提到NIO/AIO默认视为网络IO了。讲到这,应该也能清楚NIO≠java.nio,NIO是一种IO模型,java.nio只是一个实现库,而且全称是new io,区别有原来的io库罢了,里面不仅包含NIO的实现,还包含AIO的实现。

BIO vs NIO,Blocking到底指的啥?为啥NIO能提高并发效率?

首先,我们需要理解网络IO的整个过程,网络IO主要分为两个部分or状态:网卡可读、应用程序可读(真正可读)。这两个部分其实很好理解,当一个网络请求过来时,都是先经由网卡接收数据,然后再把数据从网卡读入内存中,这样才完成了整个IO操作。BlO和NIO的区别在于在应用程序可读之前,BIO会阻塞线程,NIO则是会立即返回结果。至于这样为什么会提高并发效率,举个例子:
假设网卡读写时间为2s,应用程度读写时间为1s
BIO模型下每个连接的耗时为3s,处理能力为20个/分钟;
而NIO模型下,应用程序无需等待那些处于网卡可读状态的连接,所以每个连接耗时为1s,处理能力为60个/分钟!

除此之外,NIO还支持同时监听多个IO渠道,面向缓冲区支持双向操作,这些也是其优点。

有了NIO还不够?AIO又是干嘛的?

AIO模型的定义是缓冲区与底层IO系统之间的数据读写操作都是由操作系统完成的,上层应用程序都是通过回调函数的方式去操作缓冲区的数据,对于上层应用程序来说只关心缓冲区数据读写好了的结果,并不关心数据从哪里来到哪里去的过程。至于为什么AIO会出现,这个笔者也未完全理解,主流的说法是NIO Selector检查通道是否可读/写时采用是轮询操作,效率上仍存在改进的空间,而AIO完全基于系统层面的事件通知,不需要主动去轮询,效率上来说更加高效。

你可能感兴趣的:(BIO/NIO/AIO的几个思考)