Java的BIO/NIO/AIO

news/2024/5/20 12:05:20

1. Java中的BIO、NIO和AIO的基本概念及其主要区别

BIO (Blocking I/O): 传统的同步阻塞I/O模型。每个连接创建成功后都需要一个线程来处理,如果连接没有数据可读,则线程会阻塞在读操作上。这种模型简单易理解,但在高并发环境下会消耗大量系统资源,因为每个连接都需要一个线程。
NIO (Non-blocking I/O): 同步非阻塞I/O模型。NIO基于Channel(通道)、Buffer(缓冲区)和Selector(选择器)进行操作,支持一个线程从多个通道读写数据。NIO可以让线程在没有数据可读时不会被阻塞,而是可以去处理其他任务。
AIO (Asynchronous I/O): 异步非阻塞I/O模型。AIO是Java 7中引入的,它不需要使用多路复用器来轮询准备好的通道,而是采用了异步任务的方式。当数据准备好后,系统会通知应用程序,应用程序再启动线程去读取或写入数据。

2. BIO模型在何种场景下使用较为合适?其主要缺点是什么?

适用场景:BIO模型适合连接数目比较小且固定的架构,这种情况下资源消耗可控,管理简单。例如,某些客户端服务器应用程序,如文件服务器、小型数据库应用等。
缺点:主要缺点是扩展性差,不适合处理高并发、连接数非常多的应用场景,因为每个连接都需要一个线程来处理,线程数过多会导致系统频繁进行上下文切换,严重影响性能。

3. 描述NIO如何实现非阻塞模式的I/O操作。提及其中的关键组件,如Channel和Selector。

非阻塞实现:NIO通过使用Channel(通道)和Buffer(缓冲区)进行数据的读写,而Selector(选择器)用于监听多个通道上的事件(如:连接、数据到达、数据准备好读写等)。这使得单个线程可以管理多个输入和输出通道。
关键组件:
Channel:类似于传统I/O中的流,但可以进行双向数据传输,且可以异步读写。
Buffer:缓冲区,数据在Channel和应用程序之间传输时必须经过Buffer。
Selector:可以监控多个Channel的状态,如数据是否可读写,避免了使用多个线程。

4. AIO是如何在Java中实现的?与NIO的主要区别是什么?

实现方式:AIO引入了异步通道的概念,允许直接将异步处理的请求提交给操作系统,当请求完成时,操作系统会通知相应的程序进行后续处理。
区别:与NIO的最大区别在于,NIO虽然是非阻塞的,但仍然是基于轮询的方式检查数据状态(即需要程序不断查询数据是否可用),而AIO则是完全异步的,当操作完成时会主动调用回调函数,应用程序无需查询即可继续处理。

5. 在高并发的网络服务器实现中,选择NIO相比BIO会带来哪些好处?

高并发处理能力:NIO可以使单个线程同时管理多个网络连接的I/O,这样就可以减少线程的创建和切换成本,大大提高系统的可伸缩性。
资源使用优化:由于使用了非阻塞模式,线程可以在没有数据处理时去完成其他任务,这样可以更合理地使用系统资源,提高应用程序的效率。
更好的性能:减少了线程数目,降低了系统对资源的需求,同时也减少了线程上下文切换的开销,这对于高性能服务器应用是非常重要的。

6. NIO模型讲解NIO模型

每个客户端连连接本质上对应着一个Channel通道,每个通道都有自己的Buffer缓冲区来进行读写,这些Channel被Selector选择器管理调度Selector负责轮询所有已注册的Channel,监听到有事件发生,才提交给服务端线程处理,服务端线程不需要做任何阻塞等待,直接在Buffer里处理Channel事件的数据即可,处理完马上结束,或返回线程池供其他客户端事件继续使用。通过Selector,服务端的一个Thread就可以处理多个客户端的请求。

参考1


http://www.mrgr.cn/p/26681353

相关文章

软件系统安全设计规范(word原件)

1.1安全建设原则 1.2 安全管理体系 1.3 安全管理规范 1.4 数据安全保障措施 1.4.1 数据库安全保障 1.4.2 操作系统安全保障 1.4.3 病毒防治 1.5安全保障措施 1.5.1实名认证保障 1.5.2 接口安全保障 1.5.3 加密传输保障 1.5.4终端安全保障 软件资料清单列表部分文档…

locust:Python 分布式压力测试(带WebUI)

Locust 介绍 它采用纯 Python 实现,是一个分布式用户负载测试的工具。 使用基于 Requests 库的客户端发起请求,使编写脚本大大简化; 在模拟并发方面摒弃进程和线程,完全基于时间驱动,采用协程(gevent)提供的非阻塞 IO 和 coroutine 来实现网络层的并发请求。因此单台压力…

android基础-多线程

多线程: 创建子线程,子线程不允许直接更新UI,试想下如果多个线程去更新UI,则会造成资源错乱,如果枷锁就会使得代码冗余复杂。 android异步处理: 另一种异步多线程方法 doInBackground是在子线程中。

中电金信:看 “咨询+技术”如何引领数字化变革新风向

当前,新一轮创新技术和产业变革正在重塑全球的经济格局。日本政府及社会各界也从各个领域着手推进数字化。2021年,日本政府成立了“数字厅”,通过一系列举措推动数字化升级,希望将日本加速转型为数字经济的区域领导者,日本企业也积极开展数字化转型为业务创造价值。中电金…

吴恩达机器学习-第三课-第三周

吴恩达机器学习 学习视频参考b站:吴恩达机器学习 本文是参照视频学习的随手笔记,便于后续回顾。 强化学习(reinforce learning) 什么是强化学习 示例:如何让遥控飞机学会倒飞? 监督学习并不适用,因为很难有好的数据集 奖励函数,告诉飞机什么时候是表现好什么时候是表现…

蓝桥杯-地宫取宝

X 国王有一个地宫宝库,是 nm 个格子的矩阵,每个格子放一件宝贝,每个宝贝贴着价值标签。 地宫的入口在左上角,出口在右下角。 小明被带到地宫的入口,国王要求他只能向右或向下行走。 走过某个格子时,如果那个格子中的宝贝价值比小明手中任意宝贝价值都大,小明就可以拿起它…

Nginx负载均衡、动静分离Tomcat案例实战

一、前言 1)Tomcat是一款开源的、免费的WEB软件服务器,是隶属于Apache基金会旗下的,主要是用于去发布网站代码、提供网页信息服务的。用户通过浏览器可以实现网站页面的访问。 2)Tomcat WEB软件默认可以处理静态网页(Apache、Nginx),同时也可以处理动态网页,主要是处理…

【全开源】Java v7淘宝客APP源码-自营商城任务墙源码美团外卖CPS广告联

一、淘宝客源码 特色功能: 商品搜索与推荐:基于用户的搜索关键词,推荐优质商品,帮助用户快速找到符合需求的商品。商品详情展示:展示商品图片、描述、价格等信息,帮助用户更好地了解商品的各项特性。下单…

vue 语法2

【5】条件渲染和列表渲染 (1)条件渲染v-if v-else-if v-else 条件渲染根据表达式的真假值来渲染不同的元素或组件。 v-if:当表达式的值为真时,渲染该元素或组件。 v-else-if:当前面的 v-if 或 v-else-if 的表达式为假…

three.js基础之小案例

静态场景 <canvas id="mainCanvas"></canvas> <script type="importmap">{"imports": {"three": "./js/build/three.module.js","three/addons/": "./js/jsm/"}} </script> &l…

国密算法SM2-java实现

Maven依赖<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.56</version> </dependency>工具类import java.math.BigInteger;public class Util {/*** 整形转换成网络传输…

黑客精神和白帽子

在当今数字化的世界里,黑客精神和白帽子的角色变得愈发重要。本文将探讨黑客精神的本质,介绍白帽子的概念和职责。 1、黑客精神 所谓的“黑客精神”,主要指的是一种探索计算机软件和硬件极限,追求技术创新和完善的文化态度和哲学理念。 黑客精神强调的是对知识的渴求,对于…

NFS工作原理(重要)

NFS工作流程 1.NFS服务端启动后、将自己的端口信息,注册到rpcbind服务中 2.NFS客户端通过TCP/IP的方式,连接到NFS服务端提供的rpcbind服务,并且从该服务中获取具体的端口信息 3.NFS客户端拿到具体端口信息后,将自己需要执行的函数,通过网络发给NFS服务端对应的端口 4.NFS服…

怎么用git在暂存区(stage)中移除不需要提交(commit)的文件?

2024年5月9日&#xff0c;周四上午 非常简单&#xff0c;用下面这条命令就可以了 git rm --cached <file>注&#xff1a;这条命令不会把文件从文件夹中删除&#xff0c;只会把文件从暂存区中移除出去 实战

text-generation-webui 推理模型Qwen1.5-7B-Chat相关报错问题解决

推理代码 text-generation-webui 推理模型 Qwen1.5-7B-Chat sys info nvcc --versioncuda 11.8 import torch >>> print(torch.__version__) 1 路径错误2 依赖没安装 ImportError: This modeling file requires the following packages that were not found in your …

论文分享[cvpr2018]Non-local Neural Networks非局部神经网络

论文 https://arxiv.org/abs/1711.07971 代码https://github.com/facebookresearch/video-nonlocal-net 非局部神经网络 motivation:受计算机视觉中经典的非局部均值方法[4]的启发&#xff0c;非局部操作将位置的响应计算为所有位置的特征的加权和。 非局部均值方法 NLM&#…

Vue响应式特性

响应式特性 什么是响应式&#xff1f; 简单理解就是数据变&#xff0c;视图对应变。 如何访问 和 修改 data中的数据 data中的数据, 最终会被添加到实例上 ① 访问数据&#xff1a; “实例.属性名” ② 修改数据&#xff1a; “实例.属性名” “值” <body><di…

linux上go项目打包与部署

1.第一步把项目打包 1.确保本地goland的操作系统为linux go env找到GOOS如果为window就修改为Linux 修改命令为 go env -w GOOSlinux2.打包 在项目根目录下输入 go build main.go然后项目根目录下会出现一个mian的二进制文件 3.上传包 将 main 程序包放到服务的目录下&…

通过 pip 安装自己的代码包

以前通过 pip 安装的时候总是很羡慕,别人的代码使用起来好方便啊,那时候觉得代码要提交到 pip 平台去管理肯定需要审核吧? 后来了解到自己的代码要可以 pip 安装不需要审核,只需要遵循几个步骤就能轻松实现:准备代码包 通过 setuptools 打包 通过 twine 上传 (需要 pypi …

微信小程序使用微信云托管添加自定义域名并转发到pexels.com

背景:我要在小程序上显示pexels.com上的图片,然后我得先把pexels.com的域名添加到小程序的request合法域名中,但是pexels.com是国外的,在国内没有备案所以添加不了。解决方案就是:用一个已经备案好的域名进行转发,转发的服务器我选择的是微信云托管,备案好的域名还需要s…