三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

第一章Netty,NIO零拷贝详解

第一章Netty,NIO零拷贝详解

一,NIO零拷贝

结合前文对 ‌NIO 核心组件(Channel/Buffer)‌、‌I/O 多路复用‌及‌高并发场景‌的讨论,‌零拷贝(Zero-Copy)‌ 是 NIO 提升高性能的关键技术之一。它旨在减少数据在‌内核空间‌与‌用户空间‌之间的冗余拷贝次数,以及上下文切换开销。

一、 传统 I/O vs 零拷贝:数据流向对比

  1. 传统 I/O(4 次拷贝,4 次上下文切换)
    当应用程序通过 read() 和 write() 传输文件数据时:

DMA 拷贝‌:磁盘数据 -> ‌内核缓冲区‌(Page Cache)。
CPU 拷贝‌:内核缓冲区 -> ‌用户缓冲区‌(Application Buffer)。
CPU 拷贝‌:用户缓冲区 -> ‌Socket 缓冲区‌(Kernel Socket Buffer)。
DMA 拷贝‌:Socket 缓冲区 -> ‌网卡协议引擎‌(NIC)。
痛点‌:数据在内核和用户态之间来回拷贝,消耗 CPU 和内存带宽。
2. NIO 零拷贝(2 次拷贝,2 次上下文切换)
利用 FileChannel.transferTo() 或 sendfile 系统调用:

DMA 拷贝‌:磁盘数据 -> ‌内核缓冲区‌(Page Cache)。
CPU 拷贝‌:内核缓冲区 -> ‌Socket 缓冲区‌(仅拷贝描述符信息,非数据本身,或通过 gather 操作)。
DMA 拷贝‌:Socket 缓冲区 -> ‌网卡协议引擎‌。
优势‌:数

← 返回列表