1.前言

什么是 BIO、NIO、AIO  ,不难看出,都是共同的字符IO ,

IO的意思是input output  ,即输入输出 ,

那么 B 、 N 、A 分别指不同的io模型 ,而io又分为 文件io、socket通信io 等

2.什么意思?

BIO 是同步阻塞io模型,

NIO是同步非阻塞io模型,

AIO是异步非阻塞io模型。

3.该怎么理解?

(1)BIO ,同步阻塞io模型, 每当发起一个io操作,系统就会生成一个单独的线程来对其处理,此时需要等该线程处理结束返回结果后才可以做其他操作,

期间会卡在哪里;缺点是高并发操作会导致线程创建暴增,当线程数上涨到极限,会导致系统崩溃。

  于是出现了一个叫做伪异步BIO的东西 ,也被称为M:N客户服务模型,其实就是在里面使用了线程池和任务队列,而减少线程的创建数量,提高线程利用率,增加服务器的处理能力。底层其实仍然是1对1的处理同步阻塞模式,只是增加了线程池,后来的请求需要等待进入任务队列排队,等待活跃线程来处理。

(2)NIO,同步非阻塞io模型 ,增加了管道【channel】和选择器[selector]的概念 , 需要做io操作时,对管道进行操作,内存于管道之间需要一个缓冲区buffer作为中间容器操作,一般是 字节buffer 【ByteBuffer】 ,然后管道对buffer进行读【read(buffer)】或写【write(buffer)】操作,

文件管道【FileChannel】不使用选择器,只有在socket io 才使用选择器 。

  选择器其实是使用一个线程,做多路复用机制 ,其实就是一直循环,做轮询操作。

  与管道做完io操作后,会将这个管道注册到选择器里面,并设置该管道的属性会对某个事件感兴趣,

一共有4种事件【

//
//SelectionKey.OP_CONNECT ——连接就绪事件,表示客户与服务器的连接已经建立成功,同通知服务端回应我
channel.register(selector, SelectionKey.OP_CONNECT);
//
//SelectionKey.OP_READ —— 读就绪事件,表示通道中已经有了可读的数据,可以执行读操作了(通道目前有数据,可以进行读操作了

channel.register(selector, SelectionKey.OP_READ);
//
//SelectionKey.OP_WRITE —— 写就绪事件,表示已经可以向通道写数据了(通道目前可以用于写操作,通知自己的选择器触发写事件)
channel.register(selector, SelectionKey.OP_WRITE);
//
//SelectionKey.OP_ACCEPT—— 接收连接就绪事件,表示准备好接收客户端的连接请求啦
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);

nio虽然是同步,但不是阻塞,也就是说,由通道向选择器注册一个事件后,就可以去干其他事情了,不会卡死,但是还需要时不时的看一下有没有结果返回来

【也就是客户端的选择器遍历操作】

(3)AIO,是异步非阻塞io模型,当客户端发出请求时,系统接收请求后完全由系统处理,客户端可以去干其他事,同时也不需要关系结果是什么时候处理好,

等系统把结果处理好后,由系统通知客户端获取结果即可。类似于前端Ajax请求。

【猜测websocket就是使用 AIO模型做的,因为没有轮询操作,轮询操作是BIO的典型特征】

BIO、NIO、AIO --- 个人理解的更多相关文章

  1. JAVA 中BIO,NIO,AIO的理解

    [转自]http://qindongliang.iteye.com/blog/2018539 ?????????????????????在高性能的IO体系设计中,有几个名词概念常常会使我们感到迷惑不解 ...

  2. BIO,NIO,AIO的理解

    在高性能的IO体系设计中,有几个名词概念常常会使我们感到迷惑不解.具体如下: 序号 问题 1 什么是同步? 2 什么是异步? 3 什么是阻塞? 4 什么是非阻塞? 5 什么是同步阻塞? 6 什么是同步 ...

  3. JAVA 中BIO,NIO,AIO的理解以及 同步 异步 阻塞 非阻塞

    在高性能的IO体系设计中,有几个名词概念常常会使我们感到迷惑不解.具体如下: 序号 问题 1 什么是同步? 2 什么是异步? 3 什么是阻塞? 4 什么是非阻塞? 5 什么是同步阻塞? 6 什么是同步 ...

  4. JAVA 中BIO,NIO,AIO的理解 (转)

    转自: http://qindongliang.iteye.com/blog/2018539 另外类似可参考资料 :http://www.360doc.com/content/13/1029/20/9 ...

  5. Java中BIO,NIO,AIO的理解

    在高性能的IO体系设计中,有几个名词概念常常会使我们感到迷惑不解.具体如下: 1 什么是同步? 2 什么是异步? 3 什么是阻塞? 4 什么是非阻塞? 5 什么是同步阻塞? 6 什么是同步非阻塞? 7 ...

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

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

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

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

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

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

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

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

  10. Netty5序章之BIO NIO AIO演变

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

随机推荐

  1. ASP.NET Web API路由解析

    前言 本篇文章比较长,仔细思考阅读下来大约需要15分钟,涉及类图有可能在手机显示不完整,可以切换电脑版阅读. 做.Net有好几年时间了从ASP.NET WebForm到ASP.NET MVC再到ASP ...

  2. 一行配置搞定 Spring Boot项目的 log4j2 核弹漏洞!

    相信昨天,很多小伙伴都因为Log4j2的史诗级漏洞忙翻了吧? 看到群里还有小伙伴说公司里还特别建了800+人的群在处理... 好在很快就有了缓解措施和解决方案.同时,log4j2官方也是速度影响发布了 ...

  3. pipeline 结构设计

    目录 一.pipeline步骤 二.案例 pipeline详解 只生成一次制品 不同环境部署 系统集成测试 指定版本部署 一.pipeline步骤 当团队开始设计第一个pipeline时,该如何下手呢 ...

  4. Linux进程操作

    查看进程启动时间 ps -eo pid,lstart | grep PID 查看进程的运行多久 ps -eo pid,etime |grep PID 查看进程中启动了哪些线程 top -H -p pi ...

  5. 【教程】OBS直播推流教程(Windows & macOS)

    OBS Open Broadcaster Software | OBS (obsproject.com) Windows直播推流教程 Windows下OBS直播推流非常简单,本教程将会介绍,具体步骤如 ...

  6. 使用批处理文件(.bat)启动多个CMD窗口并执行命令

    由于每次启动本机的kafka都需要打开2个cmd窗口,分别启动zookeeper服务和kafka服务,操作相对繁琐,于是想起了批处理来帮忙一键启动. 在桌面新建一个txt文件,改后缀名为.bat,并加 ...

  7. JDK ThreadPoolExecutor核心原理与实践

    一.内容概括 本文内容主要围绕JDK中的ThreadPoolExecutor展开,首先描述了ThreadPoolExecutor的构造流程以及内部状态管理的机理,随后用大量篇幅深入源码探究了Threa ...

  8. CF984B Minesweeper 题解

    Content 有一个 \(n\times m\) 的扫雷地图,请判断这个地图是否合法,即对于所有格子,是否满足: 对应点的数字周围必须有对应数字个雷 空的地方周围没有雷 数据范围:\(1\leqsl ...

  9. java 多线程:线程安全问题,示例DateFormat多线程执行冲突解决方案ThreadLocal、方法内变量

    SimpleDateFormat多线程中执行报错 java.lang.NumberFormatException: For input string: ""   import ja ...

  10. java 集合Collections 工具类:排序,查找替换。Set、List、Map 的of方法创建不可变集合

    Collections 工具类 Java 提供1个操作 Set List Map 等集合的工具类 Collections ,该工具类里提供了大量方法对集合元素进行排序.查询和修改等操作,还提供了将集合 ...