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 文件夹中。 以管理员身份运行命令提示符,输入以下命令并回车: …...

地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...

C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...

Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...