零拷贝
- 零拷贝主要用作性能优化
- java中常用的零拷贝有 mmap(内存映射) 和 sendFile
传统IO读写

传统IO模型:四次上下文切换、四次拷贝、内核空间经过两次

mmap优化(比传统IO少了一次拷贝)
- 内存映射
- 将文件映射到内核缓冲区,用户共享内核空间数据
-
减少一次内核空间到用户空间的拷贝次数(kernel -> user -> kernel 变成了 kernel -> kernel)

sendFile优化(与传统IO相比,上下文切换-1、copy-1)
- 数据根本不经过用户态,与用户态完全无关
-
数据直接从内存缓冲区 -> Socket Buffer(kernel -> kernel)

零拷贝改进(相比传统IO、上下文切换-1、copy-2)
- 零拷贝从OS的角度讲,是没有CPU拷贝
- Linux在2.4版本中,做了一些修改,避免了从内核缓冲区copy到Socket buffer的操作,直接拷贝到协议栈,从而再一次减少了数据拷贝
- 看似没有CPU拷贝,其实存在kernel buffer -> socket buffer拷贝,只是拷贝的信息很少,比如length、offset,消耗低,可忽略

- 零拷贝,是从操作系统的讲,因为内核缓冲区内,没有重复数据(kernel buffer一份数据)
- 零拷贝有更少的上下文切换、更少的CPU缓存伪共享、无CPU校验和计算
mmap和sendFile区别

相关文章: