零拷贝

  • 零拷贝主要用作性能优化
  • 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区别

零拷贝


 

相关文章: