java的bio、nio、aio 以及操作系统的select、poll、epoll
在 Java 和其他编程语言中,I/O 模型的选择对网络应用的性能和可扩展性有着重要影响。以下是 BIO(Blocking I/O)、NIO(Non-blocking I/O)、AIO(Asynchronous I/O),以及操作系统级别的 I/O 多路复用机制(select、poll、epoll)的详细介绍。
1. BIO (Blocking I/O)
-
引入版本:JDK 1.0
-
特点:同步阻塞 I/O 模型。每个连接都需要一个独立的线程来处理请求,在读写操作完成之前,该线程会被阻塞。
-
优点:实现简单,代码直观易懂。
-
缺点:不适合高并发场景,因为需要为每个连接分配一个线程,资源消耗大且难以管理大量连接。
-
适用场景:低并发量的应用程序,如小型企业内部服务或简单的客户端应用。
// 示例:BIO 服务器端代码片段
ServerSocket server = new ServerSocket(port);
while (true) {Socket socket = server.accept(); // 阻塞等待连接new Thread(() -> handle(socket)).start();
}
2. NIO (Non-blocking I/O)
-
引入版本:JDK 1.4
-
特点:同步非阻塞 I/O 模型,并引入了诸如
Buffer、Channel和Selector等新概念。可以使用少量线程来处理大量连接,通过多路复用器(Selector)监控多个 Channel 的状态变化。 -
优点:提高了并发处理能力,减少了线程创建和销毁的成本。
-
缺点:相对复杂,需要开发者自己管理事件循环和回调逻辑。
-
适用场景:适用于高并发网络应用程序,如 Web 服务器、聊天室等。
// 示例:NIO 服务器端代码片段
Selector selector = Selector.open();
ServerSocketChannel serverChannel = ServerSocketChannel.open();
serverChannel.configureBlocking(false);
serverChannel.bind(new InetSocketAddress(port));
serverChannel.register(selector, SelectionKey.OP_ACCEPT);while (true) {selector.select(); // 阻塞直到有事件发生Set<SelectionKey> selectedKeys = selector.selectedKeys();Iterator<SelectionKey> it = selectedKeys.iterator();while (it.hasNext()) {SelectionKey key = it.next();it.remove();if (key.isAcceptable()) {// 处理新连接} else if (key.isReadable()) {// 处理读事件}}
}
3. AIO (Asynchronous I/O)
-
引入版本:JDK 7
-
特点:异步非阻塞 I/O 模型。AIO,也称为 NIO.2,在 JDK 7 中作为对原有 NIO 的扩展而引入。它提供了一种真正异步的 I/O 模型,其中所有的 I/O 操作都是异步执行,并通过
CompletionHandler或者Future来接收操作结果。AIO 的设计目的是为了进一步简化并发编程模型并提高性能。 -
优点:提供了真正的异步特性,进一步简化了并发编程模型。
-
缺点:Java 实现依赖于底层操作系统的支持,不同平台上的行为可能有所差异;生态不如 NIO 成熟。
-
适用场景:适合对延迟敏感的应用,或者那些希望尽可能减少线程使用的场合。
// 示例:AIO 服务器端代码片段
AsynchronousServerSocketChannel serverChannel = AsynchronousServerSocketChannel.open();
serverChannel.bind(new InetSocketAddress(port));
serverChannel.accept(null, new CompletionHandler<AsynchronousSocketChannel, Void>() {@Overridepublic void completed(AsynchronousSocketChannel clientChannel, Void attachment) {// 处理新连接serverChannel.accept(null, this); // 继续接受更多连接}@Overridepublic void failed(Throwable exc, Void attachment) {// 处理连接失败的情况}
});
4. Select、Poll 和 Epoll
这些是操作系统级别的 I/O 多路复用机制,用于提高 I/O 操作的效率,特别是在处理大量文件描述符时:
- Select:
- 特点:最早出现的多路复用技术,可以在单个线程中监视多个文件描述符的状态变化。
- 局限性:存在最大文件描述符数量限制(通常为 1024),并且每次调用
select都会遍历所有文件描述符,效率较低。
- Poll:
- 特点:类似于
select,但没有文件描述符数量的限制,结构体设计更灵活。 - 局限性:与
select类似,每次调用都会扫描整个列表,对于大量文件描述符效率不高。
- 特点:类似于
- Epoll:
- 特点:Linux 特有的高效 I/O 多路复用机制,基于事件驱动模型,只返回已经准备好的文件描述符,避免了不必要的扫描。
- 优点:相比于
select和poll,epoll在处理大量文件描述符时表现出色,具有更高的性能和更低的 CPU 占用率。 - 适用场景:特别适合 Linux 平台上的高性能网络服务器开发。
总结
选择哪种 I/O 模型取决于具体的应用需求和技术栈:
- 对于小规模、低并发的应用,BIO 可能是最简单直接的选择。
- 当你需要处理大量并发连接时,NIO 提供了一个很好的折衷方案,它既有较好的性能又有较成熟的生态系统。
- 如果你追求极致的异步特性和高效的资源利用,AIO 或者结合操作系统级别的
epoll(在 Linux 上)可能是更好的选择,尤其是在构建高性能网络服务器时。
相关文章:
java的bio、nio、aio 以及操作系统的select、poll、epoll
在 Java 和其他编程语言中,I/O 模型的选择对网络应用的性能和可扩展性有着重要影响。以下是 BIO(Blocking I/O)、NIO(Non-blocking I/O)、AIO(Asynchronous I/O),以及操作系统级别的…...
2024 年发布的 Android AI 手机都有什么功能?
大家好,我是拭心。 2024 年是 AI 快速发展的一年,这一年 AI 再获诺贝尔奖,微软/苹果/谷歌等巨头纷纷拥抱 AI,多款强大的 AI 手机进入我们的生活。 今年全球 16% 的智能手机出货量为 AI 手机,到 2028 年,这…...
RLHF,LM模型
LLM(Large Language Model) RLHF(Reinforcement Learning from Human Feedback),即以强化学习方式依据人类反馈优化语言模型。 RLHF思想:使用强化学习的方式直接优化带有人类反馈的语言模型。RLHF使得在一般文本数据语料库上训练的语言模型能与复杂的人类价值观对齐。 R…...
【机器学习】工业 4.0 下机器学习如何驱动智能制造升级
我的个人主页 我的领域:人工智能篇,希望能帮助到大家!!!👍点赞 收藏❤ 随着科技的飞速发展,工业 4.0 浪潮正席卷全球制造业,而机器学习作为这一变革中的关键技术,正以前…...
REST与RPC的对比:从性能到扩展性的全面分析
在微服务架构中,服务间通信是核心问题之一。常见的两种通信方式是REST(Representational State Transfer)和RPC(Remote Procedure Call)。它们各有优缺点,适用于不同场景。本文将从性能、扩展性、兼容性和开…...
MATLAB中将MAT文件转换为Excel文件
MATLAB中将MAT文件转换为Excel文件 MATLAB提供了多种方法将MAT文件中的数据导出到Excel文件中。下面介绍几种常用的方法: 1. 使用 writetable 函数 优点: 功能强大,可以灵活控制输出格式。用法: data load(your_data.mat); …...
leetcode hot 100 跳跃游戏2
45. 跳跃游戏 II 已解答 中等 相关标签 相关企业 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i j] 处: 0 < j…...
【Cesium】八、Cesium 默认地图不显示,不加载默认Bing地图
文章目录 前言实现方法App.vue 前言 Cesium 默认加载的地图是bing地图,个人认为请求bing地图会收到网络限制,导致地图资源下载很慢,所以设置默认不加载bing地图(后续我使用的是天地图) 参考文章: cesium …...
【新方法】通过清华镜像源加速 PyTorch GPU 2.5安装及 CUDA 版本选择指南
下面详细介绍所提到的两条命令,它们的作用及如何在你的 Python 环境中加速 PyTorch 等库的安装。 1. 设置清华镜像源 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple这条命令的作用是将 pip (Python 的包管理工具…...
MySQL的sql操作有哪些
MySQL 的 SQL 操作可以分为几个主要类别,每个类别包含了一系列的语句,用于执行不同的数据库操作: 数据查询语言(DQL) SELECT:用于从一个或多个表中检索数据。可以使用 WHERE 子句进行条件筛选,…...
ArcGIS计算矢量要素集中每一个面的遥感影像平均值、最大值等统计指标
本文介绍在ArcMap软件中,基于矢量面要素集,计算在其中每一个面区域内,遥感影像的像元个数、平均值、总和等统计值,并将统计信息附加到矢量图层的属性表中的方法。 首先,明确一下本文的需求。现在有一个矢量面要素集&am…...
EasyExcel(环境搭建以及常用写入操作)
文章目录 EasyExcel环境搭建1.创建模块 easyexcel-demo2.引入依赖3.启动类创建 EasyExcel写1.最简单的写入1.模板2.方法3.结果 Write01.xlsx 2.指定字段不写入Excel1.模板2.方法3.结果 Write02.xlsx 3.指定字段写入excel1.模板2.方法3.结果 Write03.xlsx 4.按照index顺序写入ex…...
探索Milvus数据库:新手入门指南(tencent云)
开启向量数据库的奇妙之旅 在数据科学和机器学习领域,Milvus是一个专为向量数据设计的开源数据库。它以其高性能和易于使用的特点,成为了处理大规模向量搜索任务的理想选择。如果你是Milvus的新手,这篇文章将带你一步步了解如何开始你的Milv…...
MySQL:一文弄懂时区time_zone
你还在被以下问题困扰吗: MySQL 的安装规范中应该设置什么时区? JAVA 应用读取到的时间和北京时间差了 14 个小时,为什么?怎么解决? 已经运行一段时间的业务,修改 MySQL 的时区会影响已经存储的时间类型数据…...
基于python的天气可视化系统
目 录 1绪论 1.1研究背景 1.2研究意义 1.3当前研究现状 1.4研究内容 第2章 相关基础理论 2.1 爬虫技术基础 2.2 Python 在爬虫中的应用 2.3 爬虫系统的设计要点 第3章 天气网数据可视化系统设计 3.1 系统概述及主要内容 3.1.1 系统架构 3.1.2 工具选择…...
STM32 高级 WIFi案例1:测试AT指令
需求描述 测试AT指令是否能够正常控制ESP32的wifi,比如重启、读取设备信息等。 思路: stm32通过串口usart2向ESP32发布命令。ESP32通过串口1返回信息。 配置: 第一步:对ESP32芯片烧录可以读取stm32命令的固件(fac…...
SpringCloud微服务架构
文章目录 认识微服务:SpringCloud 服务拆分及远程调用实现夸远程服务调用使用RestTemplateEureka注册中心 搭建EruekaServer注册服务服务发现 Ribbon负载均衡 修改负载均衡规则解饿加载 Nacos注册中心(nacos一部分功能) 服务注册到nacosnacos…...
WebSocket封装
提示:记录工作中遇到的需求及解决办法 文章目录 前言二、背景三、WebSocket3.1 什么是 WebSocket ?为什么使用他?四、封装 WebSocket4.1 Javascript 版本4.2 Typescript 版本4.3 如何使用?五、我的痛点如何处理前言 本文将介绍 WebSocket 的封装,比如:心跳机制,重连和一…...
基于Flask后端框架的均值填充
Flask可以在Jupyter上运行,首先需要安装这两个库: !pip install Flask-CORS !pip install Flask 引入依赖: from flask import Flask, request, jsonify, send_file import os import pandas as pd import io from flask import Flask fr…...
SQL-Server链接服务器访问Oracle数据
SQL Server 链接服务器访问 Oracle 离线安装 .NET Framework 3.5 方法一:使用 NetFx3.cab 文件 下载 NetFx3.cab 文件,并将其放置在 Windows 10 系统盘的 C:Windows 文件夹中。 以管理员身份运行命令提示符,输入以下命令并回车: …...
PhotoMaker行业应用报告:广告、影视与游戏领域的案例分析
PhotoMaker行业应用报告:广告、影视与游戏领域的案例分析 【免费下载链接】PhotoMaker 项目地址: https://ai.gitcode.com/hf_mirrors/TencentARC/PhotoMaker PhotoMaker是一款通过堆叠ID嵌入技术实现逼真人物照片定制的AI工具,能够帮助创作者快…...
如何在5分钟内免费激活Windows和Office?KMS_VL_ALL_AIO智能脚本终极指南
如何在5分钟内免费激活Windows和Office?KMS_VL_ALL_AIO智能脚本终极指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统激活和Office办公软件激活而烦恼吗&#x…...
3步掌握PinWin效率工具:让窗口置顶操作效率提升10倍
3步掌握PinWin效率工具:让窗口置顶操作效率提升10倍 【免费下载链接】PinWin Pin any window to be always on top of the screen 项目地址: https://gitcode.com/gh_mirrors/pin/PinWin 你是否曾在视频会议时手忙脚乱地寻找被覆盖的会议窗口?在多…...
RePKG工具深度解析:Wallpaper Engine资源处理的技术方案
RePKG工具深度解析:Wallpaper Engine资源处理的技术方案 【免费下载链接】repkg Wallpaper engine PKG extractor/TEX to image converter 项目地址: https://gitcode.com/gh_mirrors/re/repkg 现实痛点层:破解资源处理的三重技术困境 游戏美术师…...
一个防止GPT“降智”的简单方法
GPT客户端容易“降智”?教你一个简单解决办法 正文 最近一直感觉 GPT 手机客户端有点“降智”,回答质量不太稳定。 后来我拿同一账号做了对比,发现用手机浏览器登录网页版时,整体会正常不少,所以来给大家分享一下。 我…...
[特殊字符]️ VibeVoice: 开源前沿语音AI,让沟通更高效!
🎙️ VibeVoice: 开源前沿语音AI VibeVoice是一个开源前沿语音AI模型家族,涵盖文本转语音(TTS)和自动语音识别(ASR)模型。这一项目旨在通过持续的创新,推动语音合成和识别领域的发展。 创新亮点 VibeVoice的核心创新在于采用了持续语音标记…...
MarkEdit 文本编码处理技术深度解析
MarkEdit 文本编码处理技术深度解析 【免费下载链接】MarkEdit Just like TextEdit on Mac but dedicated to Markdown. 项目地址: https://gitcode.com/gh_mirrors/ma/MarkEdit MarkEdit 是一款专为 Markdown 设计的文本编辑器,如同 Mac 上的 TextEdit 但专…...
Windows系统优化终极指南:用Win11Debloat免费快速提升性能
Windows系统优化终极指南:用Win11Debloat免费快速提升性能 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter an…...
雪花算法:分布式世界的“身份证号”
嘿,朋友!想象一下,你是一家拥有几千台服务器的互联网大厂架构师。现在有个小麻烦:你的订单系统每秒钟要生成几万个订单号。如果让数据库自己搞(自增ID),几台数据库凑在一起,肯定会出…...
数据自主权:WeChatMsg让微信聊天记录回归用户掌控
数据自主权:WeChatMsg让微信聊天记录回归用户掌控 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeChatMsg…...
