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 文件夹中。 以管理员身份运行命令提示符,输入以下命令并回车: …...
5分钟精通英雄联盟信息修改:LeaguePrank新手完全使用指南
5分钟精通英雄联盟信息修改:LeaguePrank新手完全使用指南 【免费下载链接】LeaguePrank 项目地址: https://gitcode.com/gh_mirrors/le/LeaguePrank 你是否曾在英雄联盟中羡慕别人的华丽段位边框,却苦于自己的段位不够理想?你是否想要…...
obamify跨平台兼容性解决方案:从桌面到Web的完美迁移指南
obamify跨平台兼容性解决方案:从桌面到Web的完美迁移指南 【免费下载链接】obamify revolutionary new technology that turns any image into obama 项目地址: https://gitcode.com/gh_mirrors/ob/obamify 想要在任何设备上将图片转换为奥巴马风格吗&#x…...
LRC Maker终极指南:3分钟学会制作专业滚动歌词的免费神器
LRC Maker终极指南:3分钟学会制作专业滚动歌词的免费神器 【免费下载链接】lrc-maker 歌词滚动姬|可能是你所能见到的最好用的歌词制作工具 项目地址: https://gitcode.com/gh_mirrors/lr/lrc-maker 还在为歌词与音乐不同步而烦恼吗?想…...
项目介绍 基于java+vue的校园舆情监测与预警系统设计与实现(含模型描述及部分示例代码)专栏近期有大量优惠 还请多多点一下关注 加油 谢谢 你的鼓励是我前行的动力 谢谢支持 加油 谢谢
基于javavue的校园舆情监测与预警系统设计与实现的详细项目实例 请注意此篇内容只是一个项目介绍 更多详细内容可直接联系博主本人 或者访问对应标题的完整博客或者文档下载页面(含完整的程序,GUI设计和代码详解) 校园舆情监测与预警系统…...
别再只认Revit了!盘点7种主流BIM数据格式(RVT/IFC/FBX...)的优缺点与选型指南
建筑数字化进阶指南:7大BIM数据格式深度解析与实战选型策略 在建筑信息模型(BIM)与地理信息系统(GIS)加速融合的今天,数据格式的选择直接影响着项目协同效率与成果交付质量。当设计院的Revit模型需要与施工…...
别再只调API了!深入XXL-Job时间轮源码,手把手带你搞懂任务触发与调度过期的那些坑
深入XXL-Job时间轮:从源码解析任务调度与过期处理的实战指南 在分布式任务调度领域,XXL-Job以其轻量级、易扩展的特性成为众多Java项目的首选方案。但当我们从简单的API调用者转变为架构设计者时,仅满足于配置层面的理解显然不够。本文将带您…...
RISC-V Coremark 移植与性能调优实战
1. Coremark基准测试与RISC-V的适配基础 Coremark作为嵌入式处理器性能评估的黄金标准,其设计初衷就是为了解决传统Dhrystone测试的局限性。我第一次在RISC-V平台上移植Coremark时,发现它确实比Dhrystone更适合现代处理器架构评估。Coremark测试包含三个…...
运动数据解读总卡壳?用NotebookLM自动提炼文献+生成假设,3天完成1篇SCI初稿
更多请点击: https://codechina.net 第一章:运动数据解读的瓶颈与AI赋能新范式 传统运动数据分析长期受限于人工标注成本高、多源异构信号对齐困难、时序模式泛化能力弱三大瓶颈。可穿戴设备每秒采集的加速度、陀螺仪、心率变异性(HRV&#…...
实测Taotoken聚合端点在高峰时段的响应延迟与稳定性
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 实测Taotoken聚合端点在高峰时段的响应延迟与稳定性 在构建依赖大模型能力的应用时,服务的响应延迟与稳定性是开发者关…...
告别卡顿!用NoMachine在Win10上丝滑远程Ubuntu Gnome桌面的保姆级教程
告别卡顿!用NoMachine在Win10上丝滑远程Ubuntu Gnome桌面的保姆级教程 远程办公和跨平台协作已成为现代开发者的日常刚需。当你在咖啡馆用Windows笔记本调试云端Ubuntu服务器上的图形界面应用时,是否经历过VNC的模糊卡顿或RDP的兼容性问题?本…...
