NIO(New IO)和BIO(Blocking IO)的区别

Java中的NIO(New IO)和BIO(Blocking IO)的区别及NIO的核心组件

Java中的NIO(New IO)和BIO(Blocking IO)是两种不同的网络通信模型,各自具有独特的特性和适用场景。下面将详细探讨它们之间的区别以及NIO的核心组件。

BIO(Blocking IO)

BIO是Java最早的I/O模型,也是最简单的一种。在BIO模型中,每个I/O操作都会阻塞当前线程,直到数据准备就绪或者超时,才会继续执行下一步操作。这意味着如果有大量的并发连接,就需要创建大量的线程来处理这些连接,会造成资源浪费和性能下降。

BIO通常采用的是一对一的客户端-服务器模型,即每个客户端连接都需要对应一个服务器端的线程来处理。这样的模型适用于连接数较少且连接持续时间较长的场景,但不适合高并发、短连接的场景。例如,传统的Web服务器在处理HTTP请求时,如果采用BIO模型,那么每个客户端连接都需要一个独立的线程来处理,当并发连接数增加时,服务器的线程资源会迅速耗尽,性能会急剧下降。

BIO的优点是简单易懂,编程复杂度较低,适用于连接数较少且连接持续时间较长的场景。然而,在高并发情况下,BIO的性能较差,资源消耗大,因此在实际应用中逐渐被NIO等更高效的模型所取代。

NIO(New IO)

NIO是Java在JDK 1.4引入的新的I/O模型,相比于BIO,它提供了更为灵活和高效的网络编程方式。NIO的核心组件包括通道(Channel)、缓冲区(Buffer)和选择器(Selector)。

  1. 通道(Channel)

通道是Java NIO中用于数据读写的对象,类似于传统I/O中的流。但与传统I/O的流不同,通道支持非阻塞I/O操作,并且可以同时进行读写操作。这意味着线程在等待数据完全传输过来后才能处理数据,从而提高了系统的并发性。

通道是全双工的,即它可以同时用于读和写操作。常见的通道类型包括FileChannel(用于文件读写)、DatagramChannel(用于UDP网络读写)、SocketChannel(用于TCP网络读写)和ServerSocketChannel(用于监听TCP连接)。

  1. 缓冲区(Buffer)

缓冲区是NIO中用于在通道和应用程序之间传输数据的中介。它是一个对象,包含一些要写入或者读出的数据。在面向流的I/O中,可以将数据直接写入或读到Stream对象中,而在NIO中,所有的数据都是用缓冲区处理的。

缓冲区实质是一个数组,通常是一个字节数组(ByteBuffer),也可以使用其他类型的数组。除了ByteBuffer,还有其他类型的缓冲区,如CharBuffer(字符缓冲区)、ShortBuffer(短整型缓冲区)、IntBuffer(整型缓冲区)、LongBuffer(长整型缓冲区)、FloatBuffer(浮点型缓冲区)和DoubleBuffer(双精度浮点型缓冲区)。

缓冲区提供了对数据的结构化访问以及维护读写位置(limit)等信息。在数据读写过程中,需要不断切换缓冲区的读写模式,如flip()方法用于将缓冲区从写模式切换到读模式,clear()方法用于清空缓冲区以便下次使用。

  1. 选择器(Selector)

选择器是NIO中用于监听多个通道的事件的机制。它可以同时监听多个通道(Channel)的I/O事件,如读事件、写事件、连接事件等,使得一个单独的线程可以管理多个通道,进一步提高了系统的并发性。

选择器只能管理非阻塞的通道。当通道发生感兴趣的事件时,选择器会通知对应的线程进行处理。这样,一个线程就可以同时处理多个连接,避免了BIO模型中为每个连接创建一个线程的资源浪费。

NIO模型中的关键是非阻塞通道和选择器。通过使用单线程或少量线程配合选择器,可以实现同时处理多个连接,从而提高了系统的并发处理能力。NIO模型适用于高并发、短连接的场景,如Web服务器、游戏服务器等。它的设计理念是通过少量线程处理大量并发连接,避免了线程资源的浪费和上下文切换的开销,从而提高了系统的性能和吞吐量。

NIO的线程模型

NIO主要包含三种线程模型:Reactor单线程模型、Reactor多线程模型和主从Reactor多线程模型。

  1. Reactor单线程模型

在单线程模型中,单个线程完成所有事情,包括接收客户端的TCP连接请求、读取和写入套接字数据等。这种模型适用于一些小容量应用场景,但对于高负载、大并发的应用却不合适。因为单个NIO线程同时处理成百上千的链路,性能上无法支撑,即便NIO线程的CPU负荷达到100%,也无法满足海量消息的编码、解码、读取和发送。

  1. Reactor多线程模型

Reactor多线程模型与单线程模型最大的区别就是有一组NIO线程处理真实的I/O操作。该模型的特点是:

  • 有一个专门的NIO线程(Acceptor线程)用于监听服务端,接收客户端的TCP连接请求。
  • 网络I/O操作(读、写等)由一个NIO线程池负责。线程池可以采用标准的JDK线程池实现,它包含一个任务队列和N个可用的线程。由这些NIO线程负责消息的读取、解码、编码和发送。
  • 一个NIO线程可以同时处理N条链路,但是一个链路只对应一个NIO线程,防止发生并发操作问题。

在绝大多数场景下,Reactor多线程模型都可以满足性能需求。但是,在极特殊应用场景中,一个NIO线程负责监听和处理所有的客户端连接可能会存在性能问题。例如,百万客户端并发连接,或者服务端需要对客户端的握手消息进行安全认证,认证本身非常损耗性能。在这些场景下,单独一个Acceptor线程可能会存在性能不足问题,为了解决性能问题,产生了第三种Reactor线程模型——主从Reactor多线程模型。

  1. 主从Reactor多线程模型

主从Reactor多线程模型与Reactor多线程模型的最大区别就是有一组NIO线程处理连接、读写事件。该模型的特点是:

  • 服务端用于接收客户端连接的不再是一个单独的NIO线程,而是一个独立的NIO线程池(Acceptor线程池)。
  • Acceptor接收到客户端TCP连接请求处理完成后(可能包含接入认证等),将新创建的SocketChannel注册到I/O线程池(sub reactor线程池)的某个I/O线程上,由它负责SocketChannel的读写和编解码工作。
  • Acceptor线程池仅仅只用于客户端的登陆、握手和安全认证。一旦链路建立成功,就将链路注册到后端subReactor线程池的I/O线程上,由I/O线程负责后续的I/O操作。

即从多线程模型中由一个线程来监听连接事件和数据读写事件,拆分为一个线程监听连接事件,线程池的多个线程监听已经建立连接的套接字的数据读写事件。另外和多线程模型一样,有专门的线程池处理真正的I/O操作。

NIO与BIO的比较

NIO和BIO各有优缺点,适用于不同的应用场景。

  1. 编程复杂度

BIO编程简单易懂,适用于连接数较少且连接持续时间较长的场景。而NIO提供了非阻塞、多路复用的网络编程方式,编程复杂度较高,但适用于高并发、短连接的场景。

  1. 性能

BIO在高并发情况下性能较差,因为每个连接都需要一个独立的线程来处理,线程资源消耗大。而NIO通过非阻塞通道和选择器,可以实现同时处理多个连接,提高了系统的并发处理能力,性能优于BIO。

  1. 资源消耗

BIO在大量并发连接时,会创建大量的线程,造成资源浪费和性能下降。而NIO通过少量线程处理大量并发连接,避免了线程资源的浪费和上下文切换的开销,从而提高了系统的性能和吞吐量。

  1. 适用场景

BIO适用于连接数较少且连接持续时间较长的场景,如传统的Web服务器在处理HTTP请求时。而NIO适用于高并发、短连接的场景,如现代的Web服务器、游戏服务器等。

应用场景示例

在Java生态系统中,许多中间件和框架都涉及到了NIO和BIO的使用,以实现高性能的网络通信。以下是一些常见的中间件和框架的示例:

  1. Netty

Netty是一个高性能的异步事件驱动的网络应用框架,它基于NIO实现了网络通信的高性能和可扩展性。Netty广泛应用于分布式系统、即时通信系统等领域。

  1. Apache MINA

Apache MINA是一个基于Java的网络应用框架,提供了可扩展的高性能的基于NIO的网络通信。它与Netty类似,但有一些不同的设计理念和API。

  1. Tomcat

Tomcat是一个流行的Java Servlet容器,它在处理HTTP请求时可以选择使用NIO或BIO。通过配置Connector的协议,可以选择不同的I/O模型来处理请求,以满足应用程序的性能和需求。

  1. Jetty

Jetty是另一个流行的Java Servlet容器和Web服务器,它也支持使用NIO或BIO来处理网络连接。

  1. Apache HTTP Server

Apache HTTP Server是世界上最流行的Web服务器之一,它在处理HTTP请求时可以使用NIO或者传统的多线程模型。

  1. Redis

Redis是一个内存数据库,它的网络通信层使用了NIO来实现高性能的异步I/O。

  1. MySQL Connector/J

MySQL的Java连接器,它可以使用NIO来实现异步的数据库访问。

  1. Spring Framework

Spring Framework是一个全面的Java开发框架,其中的Spring Web模块在处理HTTP请求时可以选择使用NIO或者传统的阻塞I/O。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/496248.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jmeter下载安装配置教程(多版本)

目录 一、介绍 JMeter的主要特点: 使用场景: 二、下载 (一)下载最新版本 (二)下载历史版本 (三)配置环境变量 ​(四)查看版本 (五)启动方式 一、介绍 Apache JMeter 是一款开源的性能测试工具,主要用于对各种服务进行负载测试和性…

PTA数据结构编程题7-1最大子列和问题

我参考的B站up的思路 题目 题目链接 给定K个整数组成的序列{ N 1 ​ , N 2 ​ , …, N K ​ },“连续子列”被定义为{ N i ​ , N i1 ​ , …, N j ​ },其中 1≤i≤j≤K。“最大子列和”则被定义为所有连续子列元素的和中最大者。例如给定序列{ -2, 1…

【路径规划】原理及实现

路径规划(Path Planning)是指在给定地图、起始点和目标点的情况下,确定应该采取的最佳路径。常见的路径规划算法包括A* 算法、Dijkstra 算法、RRT(Rapidly-exploring Random Tree)等。 目录 一.A* 1.算法原理 2.实…

在 Vue3 项目中实现计时器组件的使用(Vite+Vue3+Node+npm+Element-plus,附测试代码)

一、概述 记录时间 [2024-12-26] 本文讲述如何在 Vue3 项目中使用计时器组件。具体包括开发环境的配置,ViteVue 项目的创建,Element Plus 插件的使用,以及计时器组件的创建和使用。 想要直接实现计时器组件,查看文章的第四部分。…

简单园区网拓扑实验

1.实验拓扑 2.实验要求 1、按照图示的VLAN及IP地址需求,完成相关配置 2、要求SW1为VLAN 2/3的主根及主网关 SW2为vlan 20/30的主根及主网关 SW1和SW2互为备份 3、可以使用super vlan 4、上层通过静态路由协议完成数据通信过程 5、AR1为企业出口路由器 6、要求全网可…

jetson Orin nx + yolov8 TensorRT 加速量化 环境配置

参考【Jetson】Jetson Orin NX纯系统配置环境-CSDN博客 一 系统环境配置: 1.更换源: sudo vi /etc/apt/sources.list.d/nvidia-l4t-apt-source.list2.更新源: sudo apt upgradesudo apt updatesudo apt dist-upgrade sudo apt-get updat…

音视频入门基础:MPEG2-TS专题(22)——FFmpeg源码中,获取TS流的音频信息的实现

音视频入门基础:MPEG2-TS专题系列文章: 音视频入门基础:MPEG2-TS专题(1)——MPEG2-TS官方文档下载 音视频入门基础:MPEG2-TS专题(2)——使用FFmpeg命令生成ts文件 音视频入门基础…

MySQL45讲 第三十六讲 为什么临时表可以重名?——阅读总结

文章目录 MySQL45讲 第三十六讲 为什么临时表可以重名?——阅读总结一、引言二、临时表与内存表的区别(一)内存表(二)临时表 三、临时表的特性(一)可见性与生命周期(二)与…

MATLAB符号计算-符号表达式基础运算操作

1.1.2符号变量取值域的限定 默认复数域 【例1-1-2】解不等式 1.1.3创建符号表达式 对符号对象进行各种运算(算术运算、关系运算、逻辑运算),即可创建符号表达式。 1.算术运算与转置 【例1-1-3】 f5是f4的共轭转置 f6是f4的转置 2.关系…

深度学习-78-大模型量化之Quantization Aware Training量化感知训练QAT

文章目录 1 量化感知训练1.1 QAT的核心思想1.2 QAT的工作原理1.2.1 第一个维度1.2.2 第二个维度2 大模型的1-bits时代BitNet2.1 BitLinear层2.2 权重量化2.3 激活量化2.4 反量化3 大模型处于1.58Bits状态3.1 零值的作用3.2 量化3.3 效果4 参考附录1 量化感知训练 PTQ方法的一个…

(亲测)frp对外提供简单的文件访问服务-frp静态文件效果

话说有一天,希望将软件安装包放到网上,希望类似如下效果,正好在调试frp docker版,看到frp有个【对外提供简单的文件访问服务】功能,网上搜索也没相关效果图,所以顺手测试一下,截了几张图&#x…

基于YOLOV5+Flask安全帽RTSP视频流实时目标检测

1、背景 在现代工业和建筑行业中,安全始终是首要考虑的因素之一。特别是在施工现场,工人佩戴安全帽是确保人身安全的基本要求。然而,人工监督难免会有疏漏,尤其是在大型工地或复杂环境中,确保每个人都佩戴安全帽变得非…

LabVIEW数字式气压计自动检定系统

开发了一个基于LabVIEW开发的数字式气压计自动检定系统。在自动化检定PTB220和PTB210系列数字气压计,通过优化硬件组成和软件设计,实现高效率和高准确度的检定工作,有效降低人力成本并提升操作准确性。 项目背景 随着自动气象站的广泛部署&a…

FPGA的DMA应用——pcileech

硬件通过pcie总线,访存本机的内存,并进行修改,可以进行很多操作。 学习视频:乱讲DMA及TLP 1-pcileech项目简介和自定义模块介绍_哔哩哔哩_bilibili vivado2024.1的下载文章链接和地址:AMD-Xilinx Vivado™ 2024.1 现…

【漫话机器学习系列】022.微积分中的链式求导法则(chain rule of Calculus)

链式求导法则(Chain Rule of Calculus) 链式求导法则是微积分中的重要工具,用于处理复合函数的求导。它描述了如何计算一个函数的函数(复合函数)的导数。 1. 链式法则的定义 假设有一个复合函数 y f(g(x))&#xff…

TP5 动态渲染多个Layui表格并批量打印所有表格

记录: TP5 动态渲染多个Layui表格每个表格设置有2行表头,并且第一行表头在页面完成后动态渲染显示内容每个表格下面显示统计信息可点击字段排序一次打印页面上的所有表格打印页面上多个table时,让每个table单独一页 后端代码示例: /*** Nod…

开发微信小程序的过程与心得

起因 作为家长,我近期参与了学校的护学岗工作。在这个过程中,我发现需要使用水印相机来记录护学活动,但市面上大多数水印相机应用都要求开通会员才能使用完整功能。作为一名程序员,我决定利用自己的技术背景,开发一个…

新建一个springboot项目

注意版本注意版本注意版本!!! 参考: 我的IDEA 2022.2.3 是通过IDEA内嵌的功能来完成该项目的创建的。 一、创建 其实按截图走就够了,别弄的太麻烦了。 注意版本 注意,springboot的版本要是最新的&…

机器视觉检测相机基础知识 | 颜色 | 光源 | 镜头 | 分辨率 / 精度 / 公差

注:本文为 “keyence 视觉沙龙中机器视觉检测基础知识” 文章合辑。 机器视觉检测基础知识(一)颜色篇 视觉检测硬件构成的基本部分包括:处理器、相机、镜头、光源。 其中,和光源相关的最重要的两个参数就是光源颜色和…

7. petalinux 根文件系统配置(package group)

根文件系统配置(Petalinux package group) 当使能某个软件包组的时候,依赖的包也会相应被使能,解决依赖问题,在配置页面的help选项可以查看需要安装的包 每个软件包组的功能: packagegroup-petalinux-audio包含与音…