为什么NIO比BIO效率高

企业级应用SQL注入漏洞挖掘:从原理到批量检测POC实现 SQL注入作为Web安全领域的经典漏洞,其原理在于应用程序未对用户输入进行充分验证和过滤,直接将用户可控数据拼接至数据库查询语句中执行,导致攻击者可构造恶意输入操纵原始查询逻辑。这种漏洞的技术价值在于它往往能直接威胁到数据库的机密性、完整性和可用性,是数据泄露和系统沦陷的高危入口。在应用场景上,SQL注入尤其常见于遗留系统、采用传统开发范式的企业应用(如基于.NET Web Service的ERP、OA系统)中,这些系统在处理薪资核算、用户管理等核心业务接口时,若未采用参数化查询等安全编码实践,风险极高。本 阅读详情

原文地址:https://blog.youkuaiyun.com/wy0123/article/details/79382761

NIO比BIO效率高,主要原因是什么呢? 

网上大多给出了两者的区别,可是具体效率高在哪里呢。

首先我们看一下各自的特点 
BIO:

  1. socketServer的accept方法是阻塞的。
  2. 当有连接请求时,socketServer通过accept方法获取一个socket
  3. 取得socket后,将这个socket分给一个线程去处理。此时socket需要等待有效的请求数据到来后,才可以真正开始处理请求。
  4. socket交给线程后,这时socketServer才可以接收下一个连接请求。
  5. 获得连接的顺序是和客户端请求到达服务器的先后顺序相关。

NIO:

  1. 基于事件驱动,当有连接请求,会将此连接注册到多路复用器上(selector)。
  2. 在多路复用器上可以注册监听事件,比如监听accept、read
  3. 通过监听,当真正有请求数据时,才来处理数据。
  4. 不会阻塞,会不停的轮询是否有就绪的事件,所以处理顺序和连接请求先后顺序无关,与请求数据到来的先后顺序有关

主要对比

  • BIO一个连接,一个线程,非http请求,有可能只连接不发请求数据,此时线程是无用浪费的。
  • BIO处理依赖于连接建立;NIO处理依赖于请求数据的到来。导致执行顺序不同。

    1. 一个线程处理一个请求 
      BIO:连接请求来,建立socket,等待请求数据到来(t1),处理时间(t2) 
      NIO:连接请求来,注册到selector,设置读监听,等待请求数据(t1),处理时间(t2) 
      此时,两者用时皆为t1+t2,没有区别
    2. 一个线程处理两个请求 
      第一个请求,等待请求数据(10),处理时间(1) 
      第二个请求,等待请求数据(1),处理时间(2) 
      BIO:用时 10+1+1+2=14,第1个执行完用时10+1,等待第一个执行完处理第2个,用时1+2 
      NIO:用时 1+2+7+1=11, 第二个数据先到,时间 1+2,此时第一个需要等时为10秒,还没到,还需等待7秒,时间为7+1
    3. 两个线程处理两个请求 
      第一个请求,等待请求数据(10),处理时间(1) 
      第二个请求,等待请求数据(1),处理时间(2) 
      BIO:用时 10+1+2=13,等待第1个请求10,交给工作线程一处理,此时同时接受第2个,等待1秒,处理时间2秒,此间线程一处理时间为一秒,在线程二结束之前就已经结束 
      NIO:用时 1+2+7+1=11,第二个数据先到,时间 1+2,此时第一个还没到,还需等待7秒,时间为7+1 
      如果两个请求顺序相反,则bio和nio一样,都是11秒 
      由此可见由于阻塞等待机制的不同,导致效率不同,主要优化点为,不必排队等待,先到先处理,就有可能效率高一点。
  • BIO如果想要处理并发请求,则必须使用多线程,一般后端会用线程池来支持 
    NIO可以使用单线程,可以减少线程切换上下文的消耗。 
    但是虽然单线程减少了线程切换的消耗,但是处理也变为线性的,也就是处理完一个请求,才能处理第二个。 
    这时,有这么两个场景:

    1. 后端是密集型的计算,没有大量的IO操作,比如读些文件、数据库等
    2. 后端是有大量的IO操作。

    当为第一种场景时: 
    NIO单线程则比较有优势, 理由是虽然是单线程,但是由于线程的计算是并发计算,不是并行计算,说到底,计算压力还是在CPU上,一个线程计算,没有线程的多余消耗,显然比NIO多线程要高效。BIO则必为多线程,否则将阻塞到天荒地老,但多线程是并发,不是并行,主要还是依靠CPU的线性计算,另外还有处理大量的线程上下文。 
    如果为第二种场景,多线程将有一定优势,多个线程把等待IO的时间能平均开。此时两者区别主要取决于以上分析的处理顺序了,显然NIO要更胜一筹。

总结

NIO在接收请求方式上,无疑是要高效于BIO,原因并非是不阻塞,我认为NIO一样是阻塞的,只是方式不同,先来的有效请求先处理,先阻塞时间短的。此时间可用于等待等待时间长的。 
在处理请求上,NIO和BIO并没有什么不同,主要看线程池规划是否和理。NIO相对BIO在密集型计算的模型下,可以用更少的线程,甚至单线程。

以太网物理层协议整理(2)-万兆以太网 在万兆以太网标准化过程中,IEEE和10GEA(万兆以太网联盟)是两个最重要的组织。 万兆以太网标准和规范都比较繁多,在标准方面,首先有2002年的IEEE 802.3ae,后来也不断有新的万兆以太网规范推出,如2006年的IEEE 802.3an标准(10GBase-T)就推出了基于双绞铜线的万兆以太网规范,同样的IEEE 802.3aq标准推出了基于光纤的10GBase-LRM;2007年的 阅读详情

相关推荐

Altera Cyclone4 EP4CE15F17C8核心板硬件设计避坑指南(附AD09工程文件)

本文深入解析Altera Cyclone4 EP4CE15F17C8核心板硬件设计中的关键问题与解决方案,涵盖电源架构优化、信号完整性处理、热设计及生产调试要点。特别提供经过验证的AD09工程文件,帮助开发者规避常见设计陷阱,提升FPGA项目的成功率与可靠性。

weixin_29159441的博客 297

NIO和BIO比较

1.BIO 以流的方式处理数据,而 NIO 以块的方式处理数据,块 I/O 的效率比流 I/O 高很多 2.BIO 是阻塞的,NIO 则是非阻塞的 3.BIO基于字节流和字符流进行操作,而 NIO 基于 Channel(通道)和 Buffer(缓冲区)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。Selector(选择器)用于监听多个通道的事件(比如:连接请求,数据到达等),因此使用单个线程就可以监听多个客户端通道 ...

程序员劝退师的博客 408

WRF后处理避坑指南:从namelist配置到降水计算的全流程解析

本文提供了一份详尽的WRF模式后处理避坑指南,涵盖从理解wrfout文件结构、核心变量解析到累计降水计算与专业气象图绘制的全流程。重点解析了RAINC与RAINNC的正确处理方法,并分享了使用wrf-python库高效绘制位势高度叠加风场图、累计降水图等专业图表的实战技巧与代码,旨在帮助用户规避常见错误,提升后处理效率与图表质量。

weixin_29200485的博客 362

为什么说NIO比IO效率要高

个人理解: 1、io是面向流的,字节流和字符流,其读与写是频繁与磁盘交互,是用户态和内核态频繁切换,也就是io是用户态,不能直接操作内核,需要 操作系统调用内核来读写磁盘,切换本身就耗时; nio是面向缓冲区的,使用内存映射,直接操作内存中数据(类似于c语言中allocateMemery等方法,这一点类似cas直接操作内存),避免了用户态和内核态的频繁奇切换 2、io是线程阻塞的,一个连接或者说一个线程读取,在没有数据之后进入阻塞,等待; nio是线程非阻塞,其使用的buffer和channel(通道),当

qq_21223653的博客 1163

ArcGIS新手必看:5分钟搞定等高线转DEM栅格(附完整操作截图)

本文详细介绍了在ArcGIS中将等高线转换为DEM栅格的完整流程,包括CAD数据预处理、TIN转栅格和直接插值法两种核心方法,以及常见问题排查与优化技巧。通过实战案例和操作截图,帮助GIS新手快速掌握这一测绘数据处理的核心技能,提升地形分析和三维可视化效率。

dapp9builder的博客 287

从CentOS迁移到openEuler 24.03 LTS:手把手教你部署Java+MySQL+Redis+Nginx全栈环境

本文详细指导如何从CentOS迁移到openEuler 24.03 LTS,并部署Java+MySQL+Redis+Nginx全栈环境。涵盖系统配置、软件安装、性能优化及环境验证,助力企业级用户高效完成服务器迁移与部署。

weixin_26938645的博客 389

为什么Java NIO就是比BIO高效呢?【内含对比代码】

为什么 Java NIO 比 Java BIO 高效?非阻塞 I/O:BIO:每个 I/O 操作都会阻塞线程,导致大量线程处于空闲状态,增加了线程管理和上下文切换的开销。NIO:I/O 操作是非阻塞的,线程可以在等待 I/O 完成的同时执行其他任务,减少了线程阻塞的时间,提高了资源利用率。多路复用(Multiplexing):BIO:每个连接对应一个线程,随着连接数的增加,线程数量也线性增长,资源...

qq_18244417的博客 805

GIS小白也能看懂的实战:5步教你将ArcGIS里的等高线和水系完美导入CAD做规划图

本文详细介绍了如何将ArcGIS中的等高线和水系数据高效导入CAD,制作专业规划底图的5个关键步骤。从数据准备、ArcGIS处理到CAD优化,涵盖坐标系设置、数据裁剪、格式转换等实用技巧,特别适合设计规划领域的新手快速掌握GIS与CAD协同工作流程。

weixin_27966471的博客 426

BIO、NIO和AIO的区别

BIO:同步阻塞:排队等买小龙虾 NIO:同步非阻塞:预定了小龙虾后去干其他事情,期间自己回来看小龙虾做好没 AIO:异步非阻塞:预定了小龙虾后去干其实事情,小龙虾做好了通知我 NIO:同步非阻塞 NIO即New IO,这个库是在JDK1.4中才引入的。NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多。在Java API中提供...

张花生的博客 634

C#上位机开发:西门子/三菱PLC通信,新手直接上手

对着西门子S7协议文档看半天,连“DB块地址怎么写”都搞不懂;写三菱PLC代码时,分不清MC协议和Modbus的区别,代码改来改去连不上;好不容易跑通代码,换个PLC型号又报错,不知道哪里出问题;后来发现,新手学PLC通信根本不用先啃协议文档——先跑通“能通信”的代码,再慢慢理解底层逻辑,效率至少提升3倍。西门子PLC:用S7NetPlus库(新手最友好),实现以太网通信,支持S7-200 SMART/1200/1500;

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 880

【异常】XXL-job触发调度:address:http://192.168.x.x:x/ code:500 msg:xxl-rpc remoting error(connect timed out)

XXL-JOB调度任务失败分析:调度中心(10.254.234.80)与执行器(192.168.x.x)连接超时,返回500错误。主要原因是网络不通或执行器异常:1.网络不通可能由防火墙或网段隔离导致;2.执行器未启动或端口未监听;3.地址配置错误。解决方案:1.关闭代理使用内网;2.测试网络连通性和端口可用性;3.检查执行器进程状态和端口监听情况;4.核对执行器地址配置;5.必要时配置防火墙规则放行端口。

奶爸的编程之路,也就一周冷个三天 414

AIO,BIO,NIO,同步,异步,阻塞和非阻塞 的区别

声明,本文的建立在 https://www.cnblogs.com/aspirant/p/6877350.html?utm_source=itdadao&utm_medium=referral 之上的,为加深个人的理解,才梳理一下 1.什么是i/o操作 在unix(like)世界里,一切皆文件,而文件就是一串二进制流,不管socket,还是管道、终端,对我们来说是文件,一切都是流 ...

weixin_42739473的博客 506

【微信小程序-uniapp】CustomPicker 自定义单项选择器组件

自定义底部弹出框单项选择器组件,适用于uniapp小程序

Komorebi_00的博客 1533

java中的三种IO(BIO、NIO、AIO)

IO 阻塞和非阻塞主要指的是访问 IO 的线程是否会阻塞(或者说是等待) 线程访问资源,该资源是否准备就绪的一种处理方式 BIO(传统的IO) BIO是同步阻塞式的IO,以流的方式处理数据(效率低) Socket编程就是BIO,一个socket连接处理一个线程。当多个socket请求与服务端建立连接时,服务端不能提供相应数量的处理线程,没有分配到处理线程的连接自然就会阻塞或者是被拒绝了。 ...

未来可期的博客 5713

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【Java基础】BIO 与 NIO 的区别

文章目录1. 基础概念1.1 阻塞与非阻塞1.2 同步与异步2. BIO 与 NIO2.1 BIO2.1.1概念2.1.2 实现机制2.1.3 工作原理2.2 NIO2.2.1 概念2.2.1 实现机制2.2.2 为什么使用NIO2.2.3 三大主要组件2.2.3.1 通道 Channel2.2.3.2 选择器 Selector2.2.3.3 缓冲区 Buffer2.2.4 有关缓冲的一些概念...

王如霜 783

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

BIO、NIO、AIO区别

服务端创建ServerSocket对象,绑定地址和端口。进入循环等待被链接(没有链接则一直阻塞在ss.accept()这),一旦有客户端连接上了,通过ss.accept()方法,重启线程去执行(之所以重启线程因为为了高并发着想)当客户端比较少时可以用,因为写法简单服务端主线程中有个selector(选择器)一共干两件事:一件事是每隔一段时间看看有没有新的客户端要连上来,如果有则把客户端连到服务器。二是看看已经连上服务器的客户端与服务端之间有没有读写操作,如果有进行处理。也就是一个线程把所有事都干了 1、ss

qq_38639813的博客 1882

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

彻底搞懂NIO效率高的原理

前言 这篇文章读不懂的没关系,可以先收藏一下。笔者准备介绍完epoll和NIO等知识点,然后写一篇Java网络IO模型的介绍,这样可以使Java网络IO的知识体系更加地完整和严谨。初学者也可以等看完IO模型介绍的博客之后,再回头看这些博客,会更加有收获。 NIO相比BIO的优势 NIO(Non-blocking I/O,在Java领域,也称为New I/O),是一种同步非阻塞的I/O模型,也...

全菜工程师小辉的博客 5948

NIO的流程以及与BIO的差别

NIO: 同步非阻塞,服务器实现模式为一个线程处理多个请求,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有IO请求就进行处理。 连接数目多,且连接比较短,用于聊天室,弹幕系统 NIO是JDK1.4 JAVA提供了一系列改进的输入/输出的新特性,被统称为NIO,同步非阻塞IO,相关的类都在java.nio包内 NIO的特性: NIO有三个核心部分: Channel(管道),Bu...

jym的博客 9860

BIO、NIO、Netty

IO与NIO IO NIO 面向流(Stream Oriented) 面向缓冲区(Buffer Oriented) 单线传输 双向传输 阻塞IO(Blocking IO) 非阻塞IO(Non Blocking IO) – 选择器(Selectors) 传统IO中,“流”就是一个用于数据传输的管道,是一个单向管道,即读取加载磁盘\网络数据时,需要建立一个输入流,将数据...

IT_10的博客 779

Netty学习笔记 3.2 NIO和BIO比较及原理示意图

Netty学习笔记 3.2 NIO和BIO比较及原理示意图 NIO 和 BIO 的比较 BIO 以流的方式处理数据,而 NIO 以块的方式处理数据,块 I/O 的效率比流 I/O 高很多 BIO 是阻塞的,NIO 则是非阻塞的 BIO基于字节流和字符流进行操作,而 NIO 基于 **Channel(通道)和 Buffer(缓冲区)**进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。Selector(选择器)用于监听多个通道的事件(比如:连接请求,数据到达等),因此使用单个线程就可以监听多个

zyzy123321的博客 774

肝了一夜,一文说清BIO、NIO、AIO不同IO模型演进之路_bio,nio,aio的发展史

本文主要从计算机IO交互出发,分别给大家介绍了什么是IO模型以及常见的五种IO模型,介绍了这几种IO模型的优缺点,从系统优化演进的角度分析了Java BIONIO以及AIO演化之路。从设计者的角度分析Java BIO存在的不足。我们再来回顾下整个演进过程的脉络。在后续的文章中,笔者将继续带大家深入研究的Netty作为高性能网络通信框架的奇妙之处,敬请期待哦。真正的大师永远怀着一颗学徒的心。

weixin_45933550的博客 1026

IO的类型(BIO、NIO、AIO)

首先,我们需要明白什么是IO?IO从字面意思可以理解为输入输出,对于Java进程来讲,输入就是将数据输入到Java内存的缓存区,供Java读取使用,输出就是Java进程将数据写入到缓存区,进而输出到文件或网络数据流。IO有两种:File IO和Stream IO,其中File IO缓存区图如下: I/O就是对缓存区的读写,可以看出InputStream.read()实际就是调用底层的“read()",将内核缓冲区的数据写入到Java进程的缓冲区,而OutputStream.write()就是

积水成多,水到渠成 2166

一篇文章搞懂NIO效率高的原理

在传统的文件IO操作中,我们都是调用操作系统提供的底层标准IO系统调用函数read()、write() ,此时调用此函数的进程(在JAVA中即java进程)由当前的用户态切换到内核态,然后OS的内核代码负责将相应的文件数据读取到内核的IO缓冲区,然后再把数据从内核IO缓冲区拷贝到进程的私有地址空间中去,这样便完成了一次IO操作。服务端监测到新的连接之后,不再创建一个新的线程,而是直接将新连接绑定到clientSelector上,这样就不用BIO模型中1w 个while循环在阻塞,参见(1)

他很懒,但也在努力的生活着 161
上一篇: BIO、AIO与NIO的区别
下一篇: Java垃圾回收(GC)机制详解
Mask_V
博客等级 码龄9年 7粉丝 3原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值