Netty应用第二篇:什么是NIO?传统网络开发和NIO的区别

目录

本文须知

前言

什么是NIO?

非阻塞的概念

非阻塞和异步

传统网络开发和NIO开发

传统网络开发

NIO开发

总结


本文须知

        本文内容来自于B站孙帅suns的netty应用视频,由本人根据视频学习整理而成。然而,由于个人理解和整理的差异,可能存在部分地方的误差或讲解不够明确的情况。

        为了获得更详细的课程内容和准确的解释,请您移步至B站,搜索孙帅suns获取详细课程视频内容,以便深入了解和学习。孙帅suns的视频将为您提供更全面、详细的知识和解释,帮助您更好地理解netty应用的相关内容。

        在阅读本文时,请注意本文的目的是为了提供一个概述和个人整理的观点,而不是取代原始视频课程的内容。如有任何疑问或不明之处,建议您参考原始视频课程以获取更准确的信息。

        感谢您的理解和支持!

        在此附上B站孙帅suns个人主页链接:孙帅suns个人主页

前言

在上一篇开篇对Netty的介绍当中,我们介绍了,Netty是一个NIO客户服务器框架。那么什么是NIO呢?我将带大家先了解NIO的开发,后面再逐渐从NIO的角度去深入了解Netty。

什么是NIO?

        NIO全称:None Blocking IO (非阻塞IO

        NIO是Java编程语言中的一种输入/输出(I/O)模型,用于处理非阻塞I/O操作。它是Java标准库中java.nio包的一部分。

        NIO提供了一种更高效的I/O处理方式,特别适用于需要处理大量并发连接或大量数据传输的应用程序,如网络服务器或文件处理工具。

非阻塞的概念

        非阻塞I/O是一种I/O操作模型,其中程序在进行I/O操作时不会被阻塞,而是可以继续执行其他任务。这与传统的阻塞I/O(Blocking I/O)模型相对立

非阻塞IO和阻塞IO

  • 阻塞I/O模型中,当程序执行一个I/O操作(如读取文件或从网络套接字读取数据)时,如果数据没有准备好或尚未到达,程序会一直等待,直到数据准备好或超时。这期间,程序不能做其他事情。
  • 非阻塞I/O模型允许程序执行一个I/O操作,但如果数据尚未准备好,它不会一直等待。程序可以立即返回,继续执行其他任务,之后再来检查数据是否已经准备好。

        在了解玩非阻塞IO之后,是不是有一种既视感,非阻塞IO好像和上一篇的异步有些相像,那么非阻塞和异步之间又有什么相同点和不同点呢?

非阻塞和异步

非阻塞:

  • 非阻塞是一种I/O操作模型,其中程序在进行I/O操作时不会被阻塞,并可以立即返回并继续执行其他任务。
  • 非阻塞I/O通常涉及轮询或查询来检查I/O操作是否已经完成或数据是否已经就绪。
  • 在非阻塞模型中,程序需要主动轮询或查询状态,以确定是否可以继续进行I/O操作,这可能需要占用一定的CPU时间。

异步:

  • 异步是一种I/O操作模型,其中程序可以启动一个操作,然后继续执行其他任务,而不必等待操作完成。
  • 异步I/O通常涉及回调函数或事件驱动的机制,以通知程序操作的完成或数据的就绪。
  • 在异步模型中,程序不需要主动轮询或查询状态,而是通过回调函数或事件来处理操作完成的通知。

        所以,经过上面的了解,我们可以知道:非阻塞和异步都可以用于处理并发I/O操作,但异步通常更高效,因为它避免了轮询和主动查询的开销。

传统网络开发和NIO开发

传统网络开发

多线程版的网络编程: 每个客户端连接,都有一个独立的线程来处理。

存在的问题:

  • 线程创建开销大;
  • 内存占用高,不能无限制的创建线程
  • CPU使用率高

线程池版的网络编程:通过线程池管理连接,以减少线程创建和销毁的开销。

  1. 创建线程池:服务器会创建一个线程池,该线程池包含一定数量的线程。
  2. 客户端请求连接:每当有客户端的连接请求到达的时候,服务器就会接收连接请求并将连接任务交给线程池。
  3. 线程池处理连接任务:线程池就会分配线程来处理客户端连接,每个线程负责与一个客户端通信
  4. 关闭连接:当客户端断开连接或者服务器决定关闭连接时,线程就会释放资源,并关闭与客户端的连接。

优点:

  • 线程管理优化:有效管理线程的生命周期,避免了频繁创建和销毁线程的开销。提高性能,减少系统资源消耗。
  • 资源控制:线程池允许您控制并发度,限制同时处理的连接数量。这有助于防止过多的连接导致系统资源耗尽,提高了应用程序的稳定性。
  • 响应性提高:在高负载情况下,服务器仍然能够响应新的连接请求,不会因为线程不足而导致客户端等待过长的时间。
  • 资源共享:线程池中的线程可以共享资源,从而减少了资源竞争和冲突。

缺点:

  • 复杂性:实现较复杂,需要处理线程同步、线程安全和错误处理等问题,增加了代码复杂性。
  • 资源消耗: 线程池本身也需要一定的系统资源(内存和CPU),特别是在维护大型线程池时。
  • 因为阻塞而浪费资源:线程池中的线程可能会阻塞等待I/O操作,浪费了一些资源。

NIO开发

上面介绍的传统网络开发当中,最明显的两个问题就是:

  • 多线程版会一直新建线程开销太大(已经通过池化的方式解决)。
  • 线程池版如果出现阻塞问题的话,为数不多的几个线程也会被浪费掉。(还未解决)

        第二个问题的核心原因是我们的服务端只是接收任务,建立连接,但是不能监控那些线程当前处于什么状态,所以如果当任务阻塞的时候他并不能获取到任务状态。而NIO便解决了这个问题。

        如上图所示,NIO的客户端不再依赖inputstream或者outputstream,而是通过Channel(即通道)。

        同时,服务器通过Selector来管理连接,Selector是NIO的核心组件,可以监听Channel各种IO事件(如连接、读取、写入等)。可以在选择器(Selector)的select()方法中设置超时时间,如果在指定的超时时间内没有通道就绪,select()方法就会返回,并且可以根据返回值进行相应的处理。

        这只是其中的一种方法,后续我会再慢慢的和大家一起了解。

总结

        这篇文章主要介绍了什么是NIO,什么是非阻塞,以及传统网络开发和NIO开发的区别。

        下一篇我将与大家一起见识NIO当中的通信机制以及简单开发。敬请期待!

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ikwil

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值