nio和bio的原理_NIO、BIO、AIO的区别,及NIO的应用和框架选型

2023-10-28

AIO、BIO、NIO的区别

IO模型主要分类:

同步(synchronous) IO和异步(asynchronous) IO

阻塞(blocking) IO和非阻塞(non-blocking)IO

同步阻塞(blocking-IO)简称BIO

同步非阻塞(non-blocking-IO)简称NIO

异步非阻塞(synchronous-non-blocking-IO)简称AIO

1.BIO (同步阻塞I/O模式)

数据的读取写入必须阻塞在一个线程内等待其完成。

这里使用那个经典的烧开水例子,这里假设一个烧开水的场景,有一排水壶在烧开水,BIO的工作模式就是, 叫一个线程停留在一个水壶那,直到这个水壶烧开,才去处理下一个水壶。但是实际上线程在等待水壶烧开的时间段什么都没有做。

2.NIO(同步非阻塞)

同时支持阻塞与非阻塞模式,但这里我们以其同步非阻塞I/O模式来说明,那么什么叫做同步非阻塞?如果还拿烧开水来说,NIO的做法是叫一个线程不断的轮询每个水壶的状态,看看是否有水壶的状态发生了改变,从而进行下一步的操作。

3.AIO (异步非阻塞I/O模型)

异步非阻塞与同步非阻塞的区别在哪里?异步非阻塞无需一个线程去轮询所有IO操作的状态改变,在相应的状态改变后,系统会通知对应的线程来处理。对应到烧开水中就是,为每个水壶上面装了一个开关,水烧开之后,水壶会自动通知我水烧开了。

4.IO与NIO区别:

5.同步与异步的区别:

同步:发送一个请求,等待返回,再发送下一个请求,同步可以避免出现死锁,脏读的发生。

异步:发送一个请求,不等待返回,随时可以再发送下一个请求,可以提高效率,保证并发。

6.阻塞和非阻塞

阻塞:传统的IO流都是阻塞式的。也就是说,当一个线程调用read()或者write()方法时,该线程将被阻塞,直到有一些数据读读取或者被写入,在此期间,该线程不能执行其他任何任务。在完成网络通信进行IO操作时,由于线程会阻塞,所以服务器端必须为每个客户端都提供一个独立的线程进行处理,当服务器端需要处理大量的客户端时,性能急剧下降。

非阻塞:Java

NIO是非阻塞式的。当线程从某通道进行读写数据时,若没有数据可用时,该线程会去执行其他任务。线程通常将非阻塞IO的空闲时间用于在其他通道上执行IO操作,所以单独的线程可以管理多个输入和输出通道。因此NIO可以让服务器端使用一个或有限几个线程来同时处理连接到服务器端的所有客户端。

7.BIO、NIO、AIO适用场景

BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择。

NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂。

AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。

NIO的3个核心概念

NIO重点是把Channel(通道),Buffer(缓冲区),**Selector(选择器)**三个类之间的关系弄清楚。

1.缓冲区Buffer

Buffer是一个对象。它包含一些要写入或者读出的数据。在面向流的I/O中,可以将数据写入或者将数据直接读到Stream对象中。

在NIO中,所有的数据都是用缓冲区处理。这也就本文上面谈到的IO是面向流的,NIO是面向缓冲区的。

缓冲区实质是一个数组,通常它是一个字节数组(ByteBuffer),也可以使用其他类的数组。但是一个缓冲区不仅仅是一个数组,缓冲区提供了对数据的结构化访问以及维护读写位置(limit)等信息。

最常用的缓冲区是ByteBuffer,一个ByteBuffer提供了一组功能于操作byte数组。除了ByteBuffer,还有其他的一些缓冲区,事实上,每一种Java基本类型(除了Boolean)都对应一种缓冲区,具体如下:

ByteBuffer:字节缓冲区

CharBuffer:字符缓冲区

ShortBuffer:短整型缓冲区

IntBuffer:整型缓冲区

LongBuffer:长整型缓冲区

FloatBuffer:浮点型缓冲区

DoubleBuffer:双精度浮点型缓冲区

2.通道Channel

Channel是一个通道,可以通过它读取和写入数据,他就像自来水管一样,网络数据通过Channel读取和写入。

通道和流不同之处在于通道是双向的,流只是在一个方向移动,而且通道可以用于读,写或者同时用于读写。

因为Channel是全双工的,所以它比流更好地映射底层操作系统的API,特别是在UNIX网络编程中,底层操作系统的通道都是全双工的,同时支持读和写。

Channel有四种实现:

FileChannel:是从文件中读取数据。

DatagramChannel:从UDP网络中读取或者写入数据。

SocketChannel:从TCP网络中读取或者写入数据。

ServerSocketChannel:允许你监听来自TCP的连接,就像服务器一样。每一个连接都会有一个SocketChannel产生。

3.多路复用器Selector

Selector选择器可以监听多个Channel通道感兴趣的事情(read、write、accept(服务端接收)、connect,实现一个线程管理多个Channel,节省线程切换上下文的资源消耗。Selector只能管理非阻塞的通道,FileChannel是阻塞的,无法管理。

关键对象

Selector:选择器对象,通道注册、通道监听对象和Selector相关。

SelectorKey:通道监听关键字,通过它来监听通道状态。

监听注册

监听注册在Selector

监听的事件有

OP_ACCEPT: 接收就绪,serviceSocketChannel使用的

OP_READ: 读取就绪,socketChannel使用

OP_WRITE: 写入就绪,socketChannel使用

OP_CONNECT: 连接就绪,socketChannel使用

NIO的应用和框架

1.NIO的应用

Java NIO成功的应用在了各种分布式、即时通信和中间件Java系统中,充分的证明了基于NIO构建的通信基础,是一种高效,且扩展性很强的通信架构。

例如:Dubbo(服务框架),就默认使用Netty作为基础通信组件,用于实现各进程节点之间的内部通信。

Jetty、Mina、Netty、Dubbo、ZooKeeper等都是基于NIO方式实现。

Mina出身于开源界的大牛Apache组织

Netty出身于商业开源大亨Jboss

Dubbo阿里分布式服务框架

2.NIO框架

特别是Netty是目前最流行的一个Java开源框架NIO框架,Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。

相比JDK原生NIO,Netty提供了相对十分简单易用的API,非常适合网络编程。

Mina和Netty这两个NIO框架的创作者是同一个人Trustin Lee 。Netty从某种程度上讲是Mina的延伸和扩展,解决了一些Mina上的设计缺陷,也优化了一下Mina上面的设计理念。

另一方面Netty相比较Mina的优势:

更容易学习

API更简单

详细的范例源码和API文档

更活跃的论坛和社区

更高的代码更新维护速度

Netty无疑是NIO框架的首选,它的健壮性、功能、性能、可定制性和可扩展性在同类框架都是首屈一指的,后续将重点详细谈Netty的实现原理以及实战场景。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

nio和bio的原理_NIO、BIO、AIO的区别,及NIO的应用和框架选型 的相关文章

  • windows server 2012 防火墙 安全策略 限制ip远程及访问mysql

    今天在服务器上设置安全策略 有个奇葩的设置试了很多次 仍然不太理解 但按照以下方法是起作用的 目标 开启防火墙 限制服务器A上的MySQL数据库只能通过B访问 实现 1 首先设置A上的入站规则 添加更改后远程端口可访问 然后开启防火墙 如果
  • uniapp表单数据为“多级结构”,如何做校验

    开发项目的时候使用uniapp的表单 表单数据为多级结构 也就是对象里面嵌套对象 如何做校验 其实针对 多级结构数据 可以使用 动态表单校验 给单个uni forms item添加rule 给name绑定数组形式 代码如下
  • 四大坐标系转换和相机标定以及结果评估

    四大坐标系转换和相机标定以及结果评估 四大坐标系 坐标系转换 相机标定 matlab和python 标定结果评估 相机成像过程涉及坐标变换 包含世界坐标系 Xw Yw Zw 相机坐标 Xc Yc Zc 平面坐标 x y 像素坐标 u v 一
  • spring cloud config 中的application.yml 和 bootstrap.yml

    bootstrap yml 在 application yml 之前加载 bootstrap yml可以理解成系统级别的一些参数配置 这些参数一般是不会变动的 一般使用bootstrap yml是由于有远程配置需要load到本地 一般它会包
  • 基于cubemx的stm32f103指纹模块(AS608)

    寒假这段时间自己做了个指纹锁玩 在这里写一下指纹模块的用法 一 测试 新到手的AS608模块 可以在软件中测试一下功能是否正常 在使用这个配套软件的时候 注意要搭配TTL转串口使用 连接电源线和串口线四根就可以了 注意在测试的时候 要找对C
  • OSPF矢量图及不规则区域设计理论

    任何一台路由器勾画出一个区域的连接 都是通过矢量图的方式来表示 在根据树型结构算法 来计算去往非直连网络的路径信息 路由在勾画连接只包含三个参数 两类节点和节点之间的链路 节点 路由器节点 stub节点 pc所在的网络 环回口连接的网络 网
  • 规则引擎调研报告

    背景 我们公司由于业务的极具扩大 每天经过系统的金额也达到了20亿美金左右 这个时候对资金的管控就不能像以前那样分散在不同的系统 由不同的部门负责了 所以说 我们成立了风控部门 必须成立了专门的研发团队负责风控需求 要开始做风控了 我受命去
  • JS 防抖与节流

    防抖与节流 1 防抖 debounce 1 1 定义 在连续的多次触发同一事件的情况下 给定一个固定的时间间隔 假设 300 ms 该时间间隔内若存在新的触发 则清除之前的定时器并重新计时 重新计时 300 ms 表现为在短时间多次触发同一
  • OnNotify与OnChildNotify以及CStatic的DrawItem实现源代码

    OnNotify是用于子控件向父窗口发送消息用的 该消息的接收对象是父窗口 OnChildNotify是子控件向父窗口发送消息后 父窗口反射消息给子窗口用的 该消息的接收对象是子窗口 如 CDialog上有一个CStatic 在CStati
  • Could not determine which ”make“ command to run. Check the ”make“ step in the build configuration.报错

    一般情况下 工具 gt 选项 gt 构建和运行 gt 构建套件 Kit 在编译器里选择一个合适的编译器即可 but 可能由于我下载了很多次qt 文件夹位置被我搞坏了 可以检查一下项目里的构建设置 构建目录里是否在红色部分构建目录下有所示文件
  • linux查询java进程的指令,查询内存的指令,查看JVM参数

    参看所有java进程占内存 CPU使用情况 top b n 1 grep java awk print PID 1 mem 6 CPU percent 9 mem percent 10 查看java中的进程 这个指令可以查到PID和包名字
  • 系统故障-asp.net环境有误

    外播要用电子分call系统 所以他们要安装电子分call系统 去了一看 他们的系统有些问题问题现象 1 所有的toolbar控件 所有的客户端都无法显示这个控件 但只有两个客户端可以显示 经分析是asp组件有问题 所以重新安装asp net
  • 在Vue中使用QRCode生成二维码

    首先安装依赖包 npm cnpm install save qrcode 下面是qrcode vue文件 在script标签导入qrcode import QRCode from qrcode 我一般是写在mounted里面 如果需要什么条
  • 解决springboot使用logback日志出现LOG_PATH_IS_UNDEFINED文件夹的问题

    application properties 加入以下配置 logback home logging path D logs esb producer logback xml
  • SQL server 数据类型转换

    在 SQL Server 中 CONVERT 和 PARSE 函数可以用于将一个数据值从一种数据类型转换为另一种数据类型 它们与 CAST 函数一样是 SQL Server 中常见的数据类型转换函数 CONVERT 函数 CONVERT 函
  • Scala学习(三)---函数式编程

    文章目录 1 面向对象编程 2 函数式编程是什么 3 函数定义 4 函数参数的特殊用法 5 函数至简原则 6 匿名函数 6 1 匿名函数化简原则 7 高阶函数 7 1 函数可以作为值进行传递 7 2 函数可以作为参数进行传递 7 3 函数可
  • Received fatal alert:handshake_failure 异常解决方法

    目录 1 背景 2 报错信息 3 问题分析 4 解决方法 1 背景 PCI认证 要求安全传输层协议由之前的TLS v1 0 TLS v1 1升级到TLS v1 2 2 报错信息 java lang Exception 接口调用失败 at c
  • 配置Tomcat成为系统服务

    配置Tomcat成为系统服务 这里已tomcat6为例 下载Zip版Tomcat 选择 32 bit Windows zip pgp md5 下载解压文件到指定目录 如 D ProgramFiles Tomcat6 进入D ProgramF
  • Python 微信公众号文章爬取

    Python 微信公众号文章爬取 一 思路 二 接口分析 三 实现 第一步 第二步 1 请求获取对应公众号接口 取到我们需要的fakeid 2 请求获取微信公众号文章接口 取到我们需要的文章数据 四 总结 一 思路 我们通过网页版的微信公众

随机推荐

  • Docker搭建私有仓库

    Docker搭建私有仓库 一 私有仓库搭建 1 拉取私有仓库镜像 docker pull registry 2 启动私有仓库容器 docker run name registry p 5000 5000 registry 3 打开浏览器输入
  • Python判断一个整数是否是回文数的三种方法

    方法一 逐位判断 原理 用一个while循环 将一个数每次都取出首位和末位 判断是否相等 只要有一次不相等退出即可 回文数的判断条件 加入一个变量位数 如果这个数是奇数 位数为1时 即最中间那一位数 此时退出即可 同理 偶数 位数为0时 退
  • LIN诊断实现MCU本地OTA升级

    一 目标 通过PC端上位机实现MCU本地的OTA升级 本篇文章对实现的目的 需要用到的第三方工具 LIN诊断帧 升级协议 MCU端升级过程以及PC端升级过程做详细说明 二 目的 最近在做MCU项目时需要将样机寄给客户进行验证 在客户的验证过
  • 二叉树 level order 遍历问题汇总

    一 如何确定层结束 1 维护一个levelEnd 如果当前结点等于level end 更新levelEnd 为queue back 注意先判断queue是否empty 最后一层结束后 queue就空了 2 维护一个curLevelNum 和
  • 【Kubernetes】Kubernetes的yaml文件中command的使用

    command就是将命令在创建的容器中执行 有这些命令去完成一些工作 command用法和dockerfile中的cmd差不多 command可以单独写 也可以分成command和参数args 可以参考之前的CMD去理解 例如下面的写法都可
  • 超分辨率重建——(一)何为超分和分类

    图像超分辨重建 图像超分辨率 SR 是计算机视觉中提高图像和视频分辨率的一类重要技术 图像超分辨率重建 Super resolution Reconstruction SR 是由一张或多张低分辨率图像得到高分辨率图像的过程 存在问题 传统图
  • 刷脸支付营销广告一站式便捷的应用

    刷脸支付收银系统的应用让消费者自助购物 正规购物过程更加便捷了 同时对于商户来说 还可以通过收银系统的会员管理 会员管理 营销 会员加广告以及服务 为商户提供了收银 店铺管理 营销加广告等一站式便捷的闭环应用 刷脸支付 智慧医疗 智慧校园
  • ETL与ELT理解

    ETL ETL Extract Transform Load 用来描述将数据从来源端经过抽取 Extract 转换 Transform 加载 Load 至目的端的过程 ETL模式适用于小数据量集 如果在转换过程中需要处理的数据量达到千万上亿
  • yum使用报错:Cannot find a valid baseurl for repo: base/$releasever/x86_64

    转自 https www cnblogs com qa freeroad p 13888980 html 背景 项目有几台机器 centos7 时间不准 为了让时间能够定时同步 需要安装ntpdate 然而 我在使用yum安装ntpdate
  • Call From hadoop102/192.168.10.102 to hadoop102:8020 failed on connection exception: java.net.Connec

    错误 which no hbase in opt modules jdk1 8 0 212 bin opt modules jdk1 8 0 212 bin usr local bin usr bin usr local sbin usr
  • STM32 电机教程 24 - ST MCLIB实战之无感变绝对式位置传感器

    前言 上一节给大讲演示了如何用ST MotorControl Workbench创建基本STM32F103C8T6芯片的FOC工程并根据实际电路成功创建了工程 但是实际电路使用的是绝对式磁编码器作为电机位置及速度检测传感器 而ST Moto
  • 学习笔记 JavaScript ES6 箭头函数

    学习内容 this指向定义时所在的对象 而不是调用时所在的对象 不可以当作构造函数 不可以使用arguments对象 1 this指向定义时所在的对象 而不是调用时所在的对象 先来回顾一下ES5当中如何定义函数 function sum x
  • SQL Server是什么?SQL Server详细介绍

    一 SQL Server数据库简介 SQL Server数据库是Microsoft开发设计的一个关系数据库智能管理系统 RDBMS 现在是全世界主流数据库之一 SQL Server数据库具备方便使用 可伸缩性好 相关软件集成程度高等优势 能
  • centos7修改服务器密码忘记,Centos7忘记root密码怎么修改

    Centos7忘记root密码怎么修改 一 reboot重启机器 当出现引导界面时 按e进入内核编辑界面 二 往下翻 到LANG zh CN UTF 8后面添加 rd break 别忘了空格 三 修改完成后 按下Ctrl X组合键来运行这个
  • gcc,pkg-config,libyaml and etc..

    order of lib imports in gcc lib are importants the order of lib imports in gcc lib are importants I used to have this co
  • Java并发编程实战——你真的了解final吗?

    文章目录 final的简介 平时使用的final final修饰变量 final修饰方法 final修饰类 多线程中你真的了解final吗 final域基本数据类型的重排序规则 写final域的重排序规则 读final域的重排序规则 fin
  • AV1:为互联网提供开放、免费的视频编解码工具

    从学术研究到进入工业界 Zoe Liu一直在算法和音视频领域 目前在谷歌编解码团队为编解码器AV1做开发支持 Zoe畅谈了评定编解码器的标准 以及AV1的最新进度 本文是 下一代编码器 系列采访之一 欢迎自荐或推荐技术人加入 下一代编码器
  • 每日一题【day2】

    题目链接 思路 对于两门课之间的约束关系 很容易联想到图 我们可以将课抽象为节点 将约束抽象为一条有向边 可以用有向图的相关算法解决问题 拓扑排序正好可以解决这一问题 算法 拓扑排序 一个合法的选课序列就是一个拓扑序 拓扑序是指一个满足有向
  • 【交点】直线与多边形相交显示

    every blog every motto You can do more than you think https blog csdn net weixin 39190382 type blog 0 前言 python 求直线与多边形交
  • nio和bio的原理_NIO、BIO、AIO的区别,及NIO的应用和框架选型

    AIO BIO NIO的区别 IO模型主要分类 同步 synchronous IO和异步 asynchronous IO 阻塞 blocking IO和非阻塞 non blocking IO 同步阻塞 blocking IO 简称BIO 同