零拷贝

 零拷贝 不是指的不拷贝,而是0次cpu 拷贝

 

 

 

 

传统拷贝一个文件并且通过网络IO发送一个文件的发送端文件拷贝过程需要经过

   DMA(Direct Memory Access,依赖的是主板上别的DMA芯片而不是CPU)拷贝->cpu拷贝->cpu拷贝-DMA拷贝  第一次 DAM拷贝是磁盘到内核buffer,第二次是内核buffer到用户buffer,第三次是用户buffer到socket buffer ,第4次是 socketbuffer 到 协议引擎(通过网卡传输出去)

  MMAP 可以减少 内核buffer 到 用户buffer 的 CPU拷贝,直接是内核buffer->socket buffer(Java 里面 MappedByteBuffer 映射部分 物理磁盘文件到内核台然后直接可以修改,也减少了到 user buffer 的过程也是同样的原理)

  sendFile(linux2.4) 可以减少 内核buffer->socket buffer 的过程,只做一些简单信息的CPU 拷贝,实现了0次 CPU 拷贝。相对传统IO模型减少了1次上下文状态切换,和2次CPU拷贝,提高了效率。

 

NIO 的  Java里面 transferTo,transferFrom 都是调用的操作系统零拷贝的相关函数(sendFile),在linux 里面没有限制,在window上面有8M每次的限制超过8次需要分段拷贝

 

posted on 2022-09-25 20:00  zhangyukun  阅读(55)  评论(0编辑  收藏  举报

导航