零拷贝
#DMA技术
由CPU读取数据到内存中,每次都有占用CPU的时间,且没什么意义,CPU应该处理大量的计算,不应该把时间花费到这里,效率不高,于是有了DMA芯片,cpu通知DMA从硬盘读取数据到内存中,这时候cpu可以做别的事,提高了cpu利用率
零拷贝实现
传统的读写方式:
为了安全,磁盘读写只能由内核完成,所以首先需要将用户态切换为内核态,然后cpu通知dma将磁盘数据读取到内核缓存区中,将系统态切换为用户态并将cpu将内核缓存区中的数据读取到应用程序缓存区中读取完毕之后需要写到网卡中,要将用户态切换为内核态并将应用程序缓存区中的数据读取到socket缓存区中,之后cpu通知dma将socket缓存区中的数据写入到网卡中发到对端,之后再将内核态切换用户态。开始发送数据时将状态切换为内核态,读完毕之后将内核态切换为用户态,写数据时将用户态切换为内核态,写完之后将内核态切换为用户态共四次上下文切换磁盘拷贝到内核缓存区,内核缓存区拷贝到应用缓存区,应用缓存区拷贝到socket缓存区,socket缓存区拷贝到网卡共四次拷贝
数据并没有被修改过最上方的两次拷贝并需要
如下图所示
mmap内存映射
通过mmap将磁盘中的数据建立映射关系,建立映射关系完毕后写数据时直接根据映射关系拿到原有数据,可以减少一次拷贝。
dma拷贝2次 cpu拷贝一次
内核切换还是四次
如下图所示
sendfile
DMA直接在内核中从磁盘读取到内核缓存区中,读取完毕后直接使用cpu拷贝到套接字缓冲区,如果DMA芯片支持直接从磁盘缓冲区读取数据,那么还能再少一次cpu读写
dma拷贝2(3)次,cpu拷贝1(0)次
从应用切换到内核 从内核切换回应用 一共两次上下问切换
如下图所示
splice
在文件缓冲区与套接字缓存区中建立一个通道,通过通道传输数据
经过两次内核切换
2 次DMA拷贝 0次cpu拷贝
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
2021-10-26 vue
2021-10-26 后端项目创建