零拷贝
零拷贝 不是指的不拷贝,而是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) 编辑 收藏 举报