BIO,NIO,AIO 介绍

  • 一、背景
    • 1.1 说明
    • 1.2 通信技术整体解决的问题
  • 二、Java的I/O演进之路
    • 2.1 I/O 模型基本说明
    • 2.2 I/O模型
      • Java BIO
      • Java NIO
      • Java AIO
    • 2.3 BIO、NIO、AIO 适用场景分析
  • 三、BIO,NIO,AIO总结

一、背景

1.1 说明

​ 在Java的软件设计开发中,通信架构是不可避免的,我们在进行不同系统或者不同进程之间的数据交互,或者在高并发下的通信场景下都需要用到网络通信相关的技术,对于一些经验丰富的程序员来说,Java早期的网络通信架构存在一些缺陷,其中最令人恼火的是基于性能低下的同步阻塞式的I/O通信(BIO),随着互联网开发下通信性能的高要求,Java在2002年开始支持了非阻塞式的I/O通信技术(NIO)。大多数读者在学习网络通信相关技术的时候,都只是接触到零碎的通信技术点,没有完整的技术体系架构,以至于对于Java的通信场景总是没有清晰的解决方案。本次课程将通过大量清晰直接的案例从最基础的BIO式通信开始介绍到NIO , AIO,读者可以清晰的了解到阻塞、同步、异步的现象、概念和特征以及优缺点。本课程结合了大量的案例让读者可以快速了解每种通信架构的使用。

1.2 通信技术整体解决的问题

  • 局域网内的通信要求。
  • 多系统间的底层消息传递机制。
  • 高并发下,大数据量的通信场景需要。
  • 游戏行业。无论是手游服务端,还是大型的网络游戏,Java语言都得到越来越广泛的应用。

二、Java的I/O演进之路

2.1 I/O 模型基本说明

I/O 模型:就是用什么样的通道或者说是通信模式和架构进行数据的传输和接收,很大程度上决定了程序通信的性能,Java 共支持 3 种网络编程的/IO 模型:BIO、NIO、AIO实际通信需求下,要根据不同的业务场景和性能需求决定选择不同的I/O模型

2.2 I/O模型

Java BIO

同步并阻塞(传统阻塞型),服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销。
详细介绍见

Java NIO

Java NIO : 同步非阻塞,服务器实现模式为一个线程处理多个请求(连接),即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有 I/O 请求就进行处理。
详细介绍见

Java AIO

Java AIO(NIO.2) : 异步 异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理,一般适用于连接数较
多且连接时间较长的应用
详细介绍见

2.3 BIO、NIO、AIO 适用场景分析

  1. BIO 方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中。
    JDK1.4以前的唯一选择,但程序简单易理解。
  2. NIO 方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,弹幕系统,服务器间通讯等。
    编程比较复杂,JDK1.4 开始支持。
  3. AIO 方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用 OS 参与并发操作,
    编程比较复杂,JDK7 开始支持。

三、BIO,NIO,AIO总结

BIO、NIO、AIO:

  • Java BIO : 同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。
  • Java NIO : 同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。
  • Java AIO(NIO.2) : 异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理。

BIO、NIO、AIO适用场景分析:

  • BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。
  • NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。
  • AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。Netty!

BIO,NIO,AIO相关推荐

  1. 关于BIO | NIO | AIO的讨论

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

  2. Netty序章之BIO NIO AIO演变

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

  3. 【面试】迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章(快快珍藏)...

    网上有很多讲同步/异步/阻塞/非阻塞/BIO/NIO/AIO的文章,但是都没有达到我的心里预期,于是自己写一篇出来. 常规的误区 假设有一个展示用户详情的需求,分两步,先调用一个HTTP接口拿到详情数 ...

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

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

  5. 迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章

    来源:编程新说 网上有很多讲同步/异步/阻塞/非阻塞/BIO/NIO/AIO的文章,但是都没有达到我的心里预期,于是自己写一篇出来. 常规的误区 假设有一个展示用户详情的需求,分两步,先调用一个HTT ...

  6. IO: BIO ? NIO ? AIO?

    IO的方式通常分为几种,同步阻塞的BIO.同步非阻塞的NIO.异步非阻塞的AIO. 一.BIO 在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSock ...

  7. 内核aio_今天来说说令人让人傻傻分不清的BIO,NIO,AIO

    | 作者:新一. | 简书:https://www.jianshu.com/u/b3263fc54bce | 知乎:https://www.zhihu.com/people/qing-ni-chi-y ...

  8. bio阻塞的缺点_java 中的 BIO/NIO/AIO 详解

    java 的 IO 演进之路 我们在前面学习了 linux 的 5 种 I/O 模型详解 下面我们一起来学习下如何使用 java 实现 BIO/NIO/AIO 这 3 种不同的网络 IO 模型编程. ...

  9. Java的IO:BIO | NIO | AIO

    原文: http://my.oschina.net/bluesky0leon/blog/132361 BIO | NIO | AIO,本身的描述都是在Java语言的基础上的.而描述IO,我们需要从两个 ...

  10. Java IO(BIO, NIO, AIO) 总结

    文章转载自:JavaGuide 目录 BIO,NIO,AIO 总结 同步与异步 阻塞和非阻塞 1. BIO (Blocking I/O) 1.1 传统 BIO 1.2 伪异步 IO 1.3 代码示例 ...

最新文章

  1. 撒花!机器学习圣经 PRML 出 Python 复现代码了!
  2. strlen与sizeof区别
  3. Redis Cluster 介绍与搭建
  4. T端音乐盒子-NPC脚本
  5. 一个简单的运算表达式解释器例子
  6. Vue 视频播放插件vue-video-player
  7. 强化学习(part1)--概述
  8. 全球顶级开源大神们现身 COSCon'20
  9. linux下哪些软件能跑pin,Linux下4款常见远程工具比较
  10. 【转】MySQL双主一致性架构优化
  11. [Es] Rejecting mapping update to [xxx] as the final mapping would have more than 1 type [xxx xxx]
  12. java 最接近_Java在集合中查找最接近(或相等)的值
  13. POJ 3360 H-Cow Contest
  14. 迭代器 生成器 列表推导式 生成器表达式的一些总结
  15. 用Java发起HTTP请求与获取状态码(含状态码列表)
  16. 数据类型、变量和数组
  17. erp系统包括哪些模块
  18. NSIS静默安装VC运行库插件
  19. Lombok之@Cleanup使用
  20. NoteExpress的使用方法

热门文章

  1. Android中的5种数据存储方式
  2. 我和蓝牙BT,BLE有一腿
  3. 每日一题(52)—— 进程
  4. 嵌入式OS入门笔记-以RTX为案例:四.简单的时间管理
  5. vs2015无法打开包括文件:“winapifamily.h”
  6. python将数组写入文件_python – 将numpy数组的大小写入二进制文件
  7. LeetCode 587. 安装栅栏 / LintCode 1152. 安装栅栏(凸包检测:排序+叉积正负判断+正反扫描+去重)
  8. LeetCode 1625. 执行操作后字典序最小的字符串(BFS)
  9. LeetCode 1129. 颜色交替的最短路径(BFS)
  10. LeetCode 1470. 重新排列数组