为什么NIO比BIO效率高

3 篇文章 0 订阅

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

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
NIO(New Input/Output)是Java提供的一种基于通道和缓冲区的IO操作方式,相对于传统的BIO(Blocking I/O)具有更高的效率和可扩展性。下面是关于NIOBIO的一些常见面试题: 1. 什么是BIO(Blocking I/O)? BIO是一种同步阻塞的I/O模型,它的特点是当一个线程在执行I/O操作时,会被阻塞,直到数据准备好或者超时。 2. 什么是NIO(New Input/Output)? NIO是一种基于通道和缓冲区的I/O模型,它的特点是可以通过一个线程处理多个连接,提高了系统的并发处理能力。 3. NIO相对于BIO有哪些优势? NIO相对于BIO的优势主要有: - 非阻塞:NIO采用了非阻塞的方式,可以在等待数据时同时做其他事情,提高了系统的并发性能。 - 选择器(Selector):NIO提供了选择器机制,可以通过一个线程管理多个通道,减少了线程的开销。 - 缓冲区(Buffer):NIO使用缓冲区来存储数据,可以提高读写效率。 4. NIO的核心组件有哪些? NIO的核心组件包括通道(Channel)、缓冲区(Buffer)和选择器(Selector)。 - 通道(Channel):负责读写数据,可以是文件、网络连接等。 - 缓冲区(Buffer):负责存储数据,提供了读写数据的方法。 - 选择器(Selector):负责管理多个通道,可以通过一个线程处理多个通道的事件。 5. NIO的工作原理是什么? NIO的工作原理主要包括以下几个步骤: - 创建通道(Channel):通过打开一个通道来连接数据源。 - 创建缓冲区(Buffer):为读写数据提供缓冲区。 - 将数据写入缓冲区:将数据写入缓冲区中。 - 切换缓冲区为读模式:将缓冲区切换为读模式,准备读取数据。 - 从缓冲区读取数据:从缓冲区中读取数据。 - 处理数据:对读取到的数据进行处理。 - 关闭通道:关闭通道释放资源。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值