原文:https://www.jianshu.com/p/ff29e028af07

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

作者:ohzyo
链接:https://www.jianshu.com/p/ff29e028af07
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

[转]BIO/NIO/AIO的几个思考的更多相关文章

  1. IO回忆录之怎样过目不忘(BIO/NIO/AIO/Netty)

    有热心的网友加我微信,时不时问我一些技术的或者学习技术的问题.有时候我回微信的时候都是半夜了.但是我很乐意解答他们的问题.因为这些年轻人都是很有上进心的,所以在我心里他们就是很优秀的,我愿意多和努力的 ...

  2. 对于BIO/NIO/AIO,你还只停留在烧开水的水平吗?

    1.发发牢骚 相信大家在网上看过不少讲解 BIO/NIO/AIO 的文章,文章中举起栗子来更是夯吃夯吃一大堆,我是越看越觉得 What are you 你讲啥嘞? 本文将针对 BIO/NIO/AIO ...

  3. [转]对于BIO/NIO/AIO,你还只停留在烧开水的水平吗

    原文:https://www.javazhiyin.com/40106.html https://coding.imooc.com/class/381.html ------------------- ...

  4. (转)也谈BIO | NIO | AIO (Java版)

    原文地址: https://my.oschina.net/bluesky0leon/blog/132361 关于BIO | NIO | AIO的讨论一直存在,有时候也很容易让人混淆,就我的理解,给出一 ...

  5. 拿搬东西来解释udp tcpip bio nio aio aio异步

     [群主]雷欧纳德简单理解 tcpip是有通信确认的面对面通信   有打招呼的过程  有建立通道的过程 有保持通道的确认    有具体传输udp是看到对面的人好像在对面等你 就往对面扔东西[群主]雷欧 ...

  6. 也谈BIO | NIO | AIO (Java版--转)

    关于BIO | NIO | AIO的讨论一直存在,有时候也很容易让人混淆,就我的理解,给出一个解释: BIO | NIO | AIO,本身的描述都是在Java语言的基础上的.而描述IO,我们需要从两个 ...

  7. Netty5序章之BIO NIO AIO演变

    Netty5序章之BIO NIO AIO演变 Netty是一个提供异步事件驱动的网络应用框架,用以快速开发高性能.高可靠的网络服务器和客户端程序.Netty简化了网络程序的开发,是很多框架和公司都在使 ...

  8. I/O模型系列之三:IO通信模型BIO NIO AIO

    一.传统的BIO 网络编程的基本模型是Client/Server模型,也就是两个进程之间进行相互通信,其中服务端提供位置信息(绑定的IP地址和监听端口),客户端通过连接操作向服务端监听的地址发起连接请 ...

  9. 【netty】(1)---BIO NIO AIO演变

    BIO NIO AIO演变 Netty是一个提供异步事件驱动的网络应用框架,用以快速开发高性能.高可靠的网络服务器和客户端程序.Netty简化了网络程序的开发,是很多框架和公司都在使用的技术. Net ...

随机推荐

  1. Spring Boot 初学避免犯不必要的错误

    创建项目时的目录问题: 新包体(例如controller)必须和启动文件 DemoApplication.java 在同一级目录下,如下 spring boot 初步使用创建新的项目:https:// ...

  2. feign学习笔记

    使用:

  3. gensim中word2vec

    from gensim.models import Word2Vec Word2Vec(self, sentences=None, size=100, alpha=0.025, window=5, m ...

  4. 017 Android 获取手机SIM卡序列号和读取联系人

    1.获取手机SIM卡序列号 //5.存储sim卡系列号 //5.1获取sim卡系列号 TelephonyManager manager = (TelephonyManager) getSystemSe ...

  5. [转帖]一文尽懂 USB4

    一文尽懂 USB4 https://www.ithome.com/0/451/062.htm 今年 3 月份,USB Promoter Group(领导小组)首次发布了 USB4 规范,即下一代 US ...

  6. PAT(B) 1043 输出PATest(Java)统计

    题目链接:1043 输出PATest (20 point(s)) 题目描述 给定一个长度不超过 10​4​​ 的.仅由英文字母构成的字符串.请将字符重新调整顺序,按 PATestPATest- 这样的 ...

  7. 整合MyBatis

    配置数据源相关属性(见前一章节 DataSource配置) 引入依赖 <dependency> <groupId>org.mybatis.spring.boot</gro ...

  8. VS.NET(C#-2.5)_简单例子(所有控件都转换成HTML控件)

    简单例子 UI设计视图  UI代码视图 <% @PageLanguage="C#" AutoEventWireup="true"CodeFile=&quo ...

  9. python数据统计出海品牌

    当国内市场处于红海之中时,市场全球化已成为大势所趋.越来越多的国产品牌远走高飞,纷纷将品牌拿出来. 2019年,中国品牌十大品牌中,华为品牌力指数同比增长22%,阿里巴巴品牌力指数增长48%,小米品牌 ...

  10. JacksonJson的使用

    JacksonJson是SpringMVC内置的json处理工具,其中有一个ObjectMapper类,可以方便的实现对json的处理: //对象转字符串 // json处理工具 private Ob ...