为什么NIO比BIO效率高
NIO比BIO效率高,主要原因是什么呢?
网上大多给出了两者的区别,可是具体效率高在哪里呢。
首先我们看一下各自的特点
BIO:
- socketServer的accept方法是阻塞的。
- 当有连接请求时,socketServer通过accept方法获取一个socket
- 取得socket后,将这个socket分给一个线程去处理。此时socket需要等待有效的请求数据到来后,才可以真正开始处理请求。
- socket交给线程后,这时socketServer才可以接收下一个连接请求。
- 获得连接的顺序是和客户端请求到达服务器的先后顺序相关。
NIO:
- 基于事件驱动,当有连接请求,会将此连接注册到多路复用器上(selector)。
- 在多路复用器上可以注册监听事件,比如监听accept、read
- 通过监听,当真正有请求数据时,才来处理数据。
- 不会阻塞,会不停的轮询是否有就绪的事件,所以处理顺序和连接请求先后顺序无关,与请求数据到来的先后顺序有关
主要对比
- BIO一个连接,一个线程,非http请求,有可能只连接不发请求数据,此时线程是无用浪费的。
BIO处理依赖于连接建立;NIO处理依赖于请求数据的到来。导致执行顺序不同。
- 一个线程处理一个请求
BIO:连接请求来,建立socket,等待请求数据到来(t1),处理时间(t2)
NIO:连接请求来,注册到selector,设置读监听,等待请求数据(t1),处理时间(t2)
此时,两者用时皆为t1+t2,没有区别 - 一个线程处理两个请求
第一个请求,等待请求数据(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 - 两个线程处理两个请求
第一个请求,等待请求数据(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可以使用单线程,可以减少线程切换上下文的消耗。
但是虽然单线程减少了线程切换的消耗,但是处理也变为线性的,也就是处理完一个请求,才能处理第二个。
这时,有这么两个场景:- 后端是密集型的计算,没有大量的IO操作,比如读些文件、数据库等
- 后端是有大量的IO操作。
当为第一种场景时:
NIO单线程则比较有优势, 理由是虽然是单线程,但是由于线程的计算是并发计算,不是并行计算,说到底,计算压力还是在CPU上,一个线程计算,没有线程的多余消耗,显然比NIO多线程要高效。BIO则必为多线程,否则将阻塞到天荒地老,但多线程是并发,不是并行,主要还是依靠CPU的线性计算,另外还有处理大量的线程上下文。
如果为第二种场景,多线程将有一定优势,多个线程把等待IO的时间能平均开。此时两者区别主要取决于以上分析的处理顺序了,显然NIO要更胜一筹。
总结
NIO在接收请求方式上,无疑是要高效于BIO,原因并非是不阻塞,我认为NIO一样是阻塞的,只是方式不同,先来的有效请求先处理,先阻塞时间短的。此时间可用于等待等待时间长的。
在处理请求上,NIO和BIO并没有什么不同,主要看线程池规划是否和理。NIO相对BIO在密集型计算的模型下,可以用更少的线程,甚至单线程。
为什么NIO比BIO效率高相关推荐
- 高并发编程系列:NIO、BIO、AIO的区别,及NIO的应用和框架选型
谈到并发编程就不得不提到NIO,以及相关的Java NIO框架Netty等,并且在很多面试中也经常提到NIO和AIO.同步和异步.阻塞和非阻塞等的区别.我先简短介绍下几个NIO相关的概念,然后再谈NI ...
- NIO效率高的原理之零拷贝与直接内存映射
前言 在笔者上一篇博客,详解了NIO,并总结NIO相比BIO的效率要高的三个原因,点击查看. 这篇博客将针对第三个原因,进行更详细的讲解. 首先澄清,零拷贝与内存直接映射并不是Java中独有的概念,并 ...
- NIO 拷贝文件真的比 IO 效率高 ?
本文是基于单线程的NIO和IO拷贝文件比较, 并未对并发做测试, 请勿过度纠结场景! 今天发现项目中有个FileUtils.copy的工具方法, 打开后发现是基于io的, 我给改成了基于NIO的, 突 ...
- linux 文件拷贝io,NIO拷贝文件真的比IO拷贝文件效率高?
今天发现项目中有个FileUtils.copy的工具方法, 打开后发现是基于io的, 我给改成了基于NIO的, 突然疑虑NIO拷贝文件真的如其他人说的那样比IO效率高很多么? 以下是我的工具方法: / ...
- 深入浅出在NIO技术中,如何理解直接缓冲区要比非直接缓冲区效率高?
如何理解两者之间的效率高,主要是从allocate()方法和allocateDirect()这两个方法的源码进行分析 文章目录 1.直接缓冲区的底层创建源码 2.非直接缓冲区的底层创建源码 3.非直接 ...
- jvm 堆外内存_NIO效率高的原理之零拷贝与直接内存映射
更多内容,欢迎关注微信公众号:全菜工程师小辉~ 前言 在笔者上一篇博客,详解了NIO,并总结NIO相比BIO的效率要高的三个原因,彻底搞懂NIO效率高的原理. 这篇博客将针对第三个原因,进行更详细的讲 ...
- nio和bio的原理_Java的BIO,NIO和AIO的区别于演进
前言 Java里面的IO模型种类较多,主要包括BIO,NIO和AIO,每个IO模型都有不一样的地方,那么这些IO模型是如何演变呢,底层的原理又是怎样的呢? 本文我们就来聊聊. BIO BIO全称是Bl ...
- NIO和BIO和AIO区别
这里写目录标题 tcp/ip协议: 三次握手和四次分手名词解释: http与tcp/ip协议的区别: NIO和BIO和AIO区别: NIO的三大核心组件关系 Channel Buffer buffer ...
- Java中nio、bio和aio的区别
前言:IO的方式通常分为几种,同步阻塞的BIO.同步非阻塞的NIO.异步非阻塞的AIO.现在使用NIO的场景越来越多,很多网上的技术框架或多或少用到了NIO技术,譬如Tomcat.Jetty,还有基于 ...
- java mysql aio_Java中的NIO,BIO,AIO分别是什么
Java中的NIO,BIO,AIO分别是什么 BIO:同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开 ...
最新文章
- 原来这才是游戏上瘾的机制 如果把它用到生活中的话
- C# 构造函数中调用虚函数
- 笔记本html连接电视机,WinXP系统的笔记本如何连接电视?笔记本连接液晶电视方法...
- Android应用的Tab键,来回反复点击会报ANR,是空指针导致的,判空就可以解决
- 【Ogre-windows】旋转矩阵及位置解析
- 【每日一题】5月7日题目精讲 「火」皇家烈焰
- SpringBoot项目中,获取配置文件信息
- 当Tomcat配置安装都成功端口号也没问题时网页输入http://localhost:8080/打不开如何解决
- MySQL 之事务 及 其隔离级别
- PPDE三星私有协议
- Word字体样式及样式库的使用
- ubuntu 14.04 ADSL 上网失败之解决
- 大数据认定奖补条件2022年安徽省部分地市大数据企业认定奖补条件办法政策
- Base64的编码(Encode)与解码(Decode)
- 2022电工(初级)考题及答案
- seaborn散点图_Seaborn散点图–终极指南
- html图片怎么装修到店铺,PS店铺装修和HTML基本操作
- 如何制作没用的电脑操作系统
- 共享网络电子商刊(iebook)营销盛宴
- 【高级算法】遗传算法解决3SAT问题(C++实现)