当前位置: 首页 > news >正文

IO杂记I


IO 杂记

一、Selector 与 select()

  • selector.select()不会创建新线程,而是让当前线程阻塞等待,直到有 I/O 事件就绪。
    比喻:一个人站在门口,不来客人就不动。
  • selector.selectNow()是非阻塞版本:瞥一眼门口,没人就立刻返回。
  • Selector 底层会调用操作系统的多路复用 API(如 Linux 的epoll_wait),而非自己轮询。

二、I/O 复用(I/O Multiplexing)

核心思想:用一个线程 + 一个多路复用器(Selector)同时监控多个通道(Socket)的 I/O 事件。

典型步骤

  1. Selector.open()创建多路复用器。
  2. serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT)注册服务端通道,关注ACCEPT事件。
  3. selector.select()阻塞等待就绪事件(底层调用epoll_wait/select/kqueue)。
  4. 遍历selectedKeys集合,根据事件类型(isAcceptableisReadableisWritable)分别处理。

三、三种 I/O 模型对比

模型线程模型特点
BIO(阻塞 I/O)一连接一线程read()/write()阻塞线程,多连接需多线程或线程池
NIO(I/O 复用)单线程管理成千上万连接通过 Selector + 非阻塞通道,轮询就绪事件
AIO(异步 I/O)少量线程(如 CPU 核心数)+ 回调发起读写立即返回,OS 完成数据拷贝后回调CompletionHandler

四、零拷贝(Zero-Copy)

1. 核心概念

  • CPU 拷贝:CPU 逐字节搬运数据,占用 CPU 时间。
  • DMA 拷贝:DMA 控制器独立搬运数据,不占用 CPU。

2. 传统read+write流程

FileInputStreamfis=newFileInputStream("file.txt");Socketsocket=...;byte[]buffer=newbyte[1024];intlen=fis.read(buffer);socket.getOutputStream().write(buffer,0,len);

底层步骤

  1. DMA 拷贝:磁盘 → 内核缓冲区(PageCache)
  2. CPU 拷贝:内核缓冲区 → 用户缓冲区(byte[]
  3. CPU 拷贝:用户缓冲区 → Socket 内核缓冲区
  4. DMA 拷贝:Socket 内核缓冲区 → 网卡
  • CPU 拷贝次数:2
  • DMA 拷贝次数:2
  • 系统调用次数:2(read+write
  • 上下文切换次数:4

3.mmap+write

FileChannelfileChannel=FileChannel.open(Paths.get("file.txt"));MappedByteBuffermappedBuffer=fileChannel.map(MapMode.READ_ONLY,0,fileSize);socketChannel.write(mappedBuffer);

原理mmap将磁盘文件映射到进程地址空间,用户直接访问内核缓冲区,省去“内核→用户”的 CPU 拷贝。

步骤

  1. DMA 拷贝:磁盘 → 内核缓冲区(PageCache)
  2. CPU 拷贝:内核缓冲区 → Socket 内核缓冲区(仍有一次)
  3. DMA 拷贝:Socket 内核缓冲区 → 网卡
  • CPU 拷贝次数:1
  • DMA 拷贝次数:2
  • 系统调用次数:2(mmap+write
  • 上下文切换次数:4

4.sendfile(基础)

sendfile是专门在两个文件描述符之间直接传输数据的系统调用,无用户空间拷贝

流程

  1. DMA 拷贝:磁盘 → 内核缓冲区
  2. CPU 拷贝:内核缓冲区 → Socket 缓冲区
  3. DMA 拷贝:Socket 缓冲区 → 网卡
  • CPU 拷贝次数:1
  • DMA 拷贝次数:2
  • 系统调用次数:1
  • 上下文切换次数:2

5.sendfile+ DMA Gather

若网卡支持Scatter/Gather DMA,则 CPU 无需再将数据从内核文件缓冲区复制到 Socket 缓冲区,网卡直接从 PageCache 中抓取分散的数据。

  • CPU 拷贝次数:0(真正的 CPU 零拷贝)
  • DMA 拷贝次数:2
  • 系统调用次数:1
  • 上下文切换次数:2

6. 对比总表

方式CPU 拷贝DMA 拷贝系统调用上下文切换
传统 read+write2224
mmap+write1224
sendfile(基础)1212
sendfile + DMA gather copy0212

7. DMA Gather 详解

  • 普通 DMA:只能传输连续内存块,若数据分散,需 CPU 先复制到连续缓冲区。
  • DMA Gather:DMA 控制器维护描述符列表(地址+长度),直接从不连续的多个内存区域抓取数据,组合后发送给设备。

比喻

  • 普通 DMA:快递员必须从整箱取货 → 你先将散货装进箱子(CPU 拷贝)
  • DMA Gather:快递员拿着清单上门自取 → 你无需动手

8. Java 中的transferTo

FileChannel.transferTo()底层会优先使用零拷贝(如 Linux 的sendfile),条件不满足时优雅降级为传统拷贝。

实现逻辑(伪代码)

if(满足零拷贝条件){if(sendfile(...)>=0||transmitFile(...)>=0)returnbytes_transferred;}returntransferToViaTemporaryBuffer(src,target);// 用户态兜底

内部检查

  • 源通道是否为普通本地文件
  • 目标通道是否为SocketChannel或同一文件系统上的FileChannel
  • 操作系统是否支持零拷贝系统调用

局限性(零拷贝失效场景)

  • 目标为普通FileChannel且与源不在同一个文件系统(如跨分区 C: → D:)
  • Windows 上transferTo不是真正的零拷贝
  • 数据需 SSL/TLS 加密
  • 部分平台(如 macOS)对FileChannelFileChannel不支持零拷贝

最佳实践

  • 分段传输(单次不超过 2GB)
  • 检查返回值,循环传输
  • 使用 try-with-resources 关闭通道
  • 加密场景避免使用零拷贝

五、零拷贝的目标总结

  • 减少/消除 CPU 拷贝
  • 减少上下文切换次数
  • 两次 DMA 拷贝(磁盘→内核、内核→网卡)无法避免,因为它们由硬件高效完成

http://www.jsqmd.com/news/845441/

相关文章:

  • 2026年沃尔玛购物卡回收平台深度评测报告 - 速递信息
  • 在WSL2上5分钟搞定Kafka 3.6.0伪集群:从单实例到三节点保姆级配置
  • 量化分析师开始用 Claude Code 挖 Alpha 了,而且出了一篇 arXiv 论文
  • 2026性价比之选阜阳黄金回收铂金回收白银回收靠谱诚信店铺推荐_转自TXT - 亦辰小黄鸭
  • 2026年全国仓库货架厂家哪家好 聚焦智能仓储 覆盖多区域 技术过硬售后及时 - 深度智识库
  • 实用指南:5分钟搞定Minecraft MASA模组中文汉化
  • 保姆级教程:在Ubuntu 20.04 ROS Noetic下,从零搭建UR5机械臂的Gazebo仿真环境
  • 智慧铁路轨道缺陷识别 铁路相关计算机视觉数据集 铁轨裂缝识别 铁轨剥落识别 铁轨沟槽识别 铁轨凹陷图像识别数据集 图像识别10189期
  • 别再只用ARIMA了!用Python+statsmodels搞定SARIMA预测电商销量(附完整代码)
  • 2026性价比之选赣州黄金回收铂金回收白银回收靠谱诚信店铺推荐_转自TXT - 亦辰小黄鸭
  • 2026年贵州高考志愿填报与学业规划全链条服务深度指南:如何用150亿参数AI破解滑档困局 - 精选优质企业推荐官
  • 2026性价比之选河池黄金回收铂金回收白银回收靠谱诚信店铺推荐_转自TXT - 亦辰小黄鸭
  • 如何设计 Agent Harness 的默认行为与异常处理
  • RKNN Model Zoo实战:MobileSAM图像分割在瑞芯微平台的完整部署指南
  • Windows文件元数据管理终极指南:解锁任意文件类型的标签与属性编辑能力
  • 拯救者笔记本性能调优神器:Lenovo Legion Toolkit提升30%游戏体验的完整指南
  • 1路Cameralink Base图像采集卡丨AD 采集丨 FMC 子卡丨数据采集卡丨青翼科技多功能FMC采集卡
  • 3个技巧让你彻底掌控ThinkPad双风扇:告别噪音与高温的两难抉择
  • 2026性价比之选固原黄金回收铂金回收白银回收靠谱诚信店铺推荐_转自TXT - 亦辰小黄鸭
  • 9-检索增强生成RAG详解
  • 3分钟掌握Winhance:Windows系统优化与个性化工具全攻略
  • 钢厂的为什么标签都用“套打”标签?
  • 3步掌握Windows 11任务栏自定义神器:Taskbar11完全指南
  • 书成紫微动,律定凤凰驯:大道破圈层垄断,凰标给草根创作尊严
  • 从实验室到生产线:Chinese-CLIP推理优化的三大实战策略
  • 完全掌握Path of Building:从装备制作小白到大师的终极指南
  • 别再为CISP-PTE靶机网络发愁了!手把手教你配置CentOS 6静态IP,一步到位
  • 告别手动操作!用Matlab脚本批量控制STK Astrogator,实现轨道数据自动化处理
  • Whisky完整指南:在macOS上无缝运行Windows程序的免费开源方案
  • 终极指南:3步解锁B站缓存视频播放自由