为什么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在密集型计算的模型下,可以用更少的线程,甚至单线程。

11、基于多阵列电极的表面肌电信号运动估计 本文介绍了一种基于多阵列电极的表面肌电信号运动估计技术,旨在实现对手腕和手指运动的高精度估计,解决传统人机接口在操控多自由度机器人时的局限性。通过多阵列电极系统采集前臂肌肉活动信号,结合独立成分分析(ICA)和非负矩阵分解(NMF)等信号处理方法,提取肌肉协同作用,进而生成运动指令以控制机器人或假肢手。文章对比了多阵列电极与传统电极的优势,展示了运动估计算法的整体流程,并以假肢手控制为例说明其实际应用。最后探讨了该技术在测量精度、应用拓展、智能化和便携化等方面的未来发展方向。该技术为假肢控制、康复训练和人机 阅读详情

相关推荐

Java实现双色球&大乐透随机选号算法——原理详解与代码实战

掌握核心语法:集合操作、随机数生成、排序。贴近实际场景:将编程知识应用于生活问题的解决。

wangchl0932的博客 4986

NIO和BIO比较

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

程序员劝退师的博客 408

3D视觉引导技术在机器人焊接中的应用

通过对比传统的2D视觉和3D视觉技术在焊接领域的应用差异,探讨了3D视觉引导技术在提高焊接精度、适应不规则工件形状和增强自适应能力方面的优势。本文对3D视觉引导技术在机器人焊接中的应用进行了深入探讨,总结了其在提高焊接精度、适应不规则工件形状和增强自适应能力方面的优势,并通过应用案例展示了其在焊接路径规划、焊缝检测和焊接质量控制等方面的重要作用。1. 提高焊接精度:3D视觉引导技术能够精确测量焊接工件的三维形状和位置,为机器人提供精准的焊接路径规划和跟踪,从而提高焊接精度。三、3D视觉引导技术概述。

2302_79273122的博客 1836

为什么说NIO比IO效率要高

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

qq_21223653的博客 1163

从亚稳态到流片失败:SpyGlass CDC在5G芯片设计中的避坑指南

本文深入探讨了在复杂5G芯片设计中,如何利用SpyGlass CDC工具构建高效的时钟域交叉验证流程,以避免因亚稳态问题导致的流片失败。文章结合实战经验,详细解析了从约束编写、时钟复位完整性检查到层次化验证和特殊场景处理的全过程,并强调了精准的检查约束是确保验证有效性的基石,旨在帮助设计团队安全跨越异步时钟域的雷区。

weixin_29168153的博客 446

零代码做游戏:AI辅助开发HTML5网页小游戏从创意到发布全流程

在软件开发领域,自然语言编程正成为一种新兴的人机协作方式,而AI辅助开发则是其最典型的落地形态。它让开发者无需精通语法,只需用清晰的语言描述游戏规则与交互逻辑,AI便能自动生成可运行的代码。这种模式大幅降低了编程门槛,尤其适合快速验证创意、制作原型。对于HTML5网页游戏而言,借助AI生成单个HTML文件,配合在线运行环境,即可在浏览器中直接试玩、迭代与分享。无论是产品经理验证玩法、运营人员制作互动小游戏,还是教育者设计课堂闯关,都能通过自然语言描述需求,让AI完成代码实现与报错修复。本文完整记录了一个“接

weixin_31497453的博客 334

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

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

qq_18244417的博客 805

基于YOLOv5的仪表读数识别系统:从检测到识别的完整解决方案

随着工业自动化水平的不断提高,仪表读数识别技术在电力系统、石油化工、智能制造等领域发挥着越来越重要的作用。本文提出了一种基于YOLOv5的仪表自动读数识别系统,该系统能够有效区分指针式和数字式仪表,并实现高精度的读数识别。我们详细介绍了系统的整体架构、数据集构建、模型训练策略以及用户界面设计,并提供了完整的代码实现。实验结果表明,本系统在仪表检测和读数识别任务上均取得了优异的表现,为工业现场的自动化监控提供了可靠的技术支持。关键词:仪表读数识别;YOLOv5;目标检测;深度学习;工业自动化。

YOLO 678

BIO、NIO和AIO的区别

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

张花生的博客 634

2、MOSFET基本物理效应及其BSIM4模型解析

本文深入探讨了MOSFET的基本物理效应及其在BSIM4模型中的数学表述,涵盖门和沟道的几何结构、温度依赖性、材料模型选项、阈值电压计算、以及其他关键物理效应如LDD电阻、有限电荷厚度、有效迁移率等。同时解析了机械应力、邻近效应及布局依赖效应对MOSFET性能的影响,并通过参数表和建模流程提供了精确建模的指导,旨在帮助读者优化MOSFET器件性能与可靠性。

purple的博客 566

基于Cesium实现,动态水面+大坝排水动画

一、绘制面状水域,使用水波纹理,进行渲染,水体透明,可以看到底色。三、使用粒子系统,将喷泉改变方向,加上重力设置,实现排水动画。二、绘制线状三维体,用作模拟大坝拦截效果。四、最后,模拟水位上升,进行淹没分析,

一醉千秋的专栏 1420

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

Python 爬虫实战:科研数据库学术论文数据抓取

在科研工作中,学术论文是获取前沿知识和研究方法的重要资源。然而,手动从科研数据库中查找和整理论文信息往往耗时费力。幸运的是,Python 爬虫技术可以自动化这一过程,帮助我们高效地抓取和管理学术论文数据。本文将详细介绍如何使用 Python 爬虫技术抓取科研数据库中的学术论文数据,并进行全字段提取和文献管理,助力科研工作。

u014481728的博客 946

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

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

未来可期的博客 5713

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【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

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

BIO、NIO、AIO区别

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

qq_38639813的博客 1882

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

彻底搞懂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、付费专栏及课程。

余额充值