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完全基于系统层面的事件通知,不需要主动去轮询,效率上来说更加高效。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 有人问过,你觉得旅行的意义是什么? 这应该是一个很广泛的议题吧。有些人把旅行当成了一种常态,有些人当作一种人生经历...
    蜂蜜柚子爆米花sasa阅读 201评论 0 2
  • 副标题:《如何阅读一本书》---分析阅读规则 作者:青梅温酒 摘要:关于读书方法,古今中外,不少人都对此提出过自己...
    一个人的朝圣远行阅读 1,180评论 1 1
  • 抄底时是站在强者的逻辑上,把最悲观的逻辑列出来,当觉得最悲观的逻辑成立时也不怕时,才可以抄底。 用下跌的逻辑来证明...
    七色黑白阅读 259评论 0 0
  • 什么是深度工作?深度工作是指:在无干扰的状态下专注进行职业活动,使个人的认知能力达到极限,这种努力能够创造新价值,...
    Holmew阅读 304评论 0 0