首页 > 其他分享 >零拷贝

零拷贝

时间:2022-10-26 22:44:35浏览次数:34  
标签:区中 缓存 切换 拷贝 cpu 内核

#DMA技术
由CPU读取数据到内存中,每次都有占用CPU的时间,且没什么意义,CPU应该处理大量的计算,不应该把时间花费到这里,效率不高,于是有了DMA芯片,cpu通知DMA从硬盘读取数据到内存中,这时候cpu可以做别的事,提高了cpu利用率

零拷贝实现

传统的读写方式:

为了安全,磁盘读写只能由内核完成,所以首先需要将用户态切换为内核态,然后cpu通知dma将磁盘数据读取到内核缓存区中,将系统态切换为用户态并将cpu将内核缓存区中的数据读取到应用程序缓存区中读取完毕之后需要写到网卡中,要将用户态切换为内核态并将应用程序缓存区中的数据读取到socket缓存区中,之后cpu通知dma将socket缓存区中的数据写入到网卡中发到对端,之后再将内核态切换用户态。开始发送数据时将状态切换为内核态,读完毕之后将内核态切换为用户态,写数据时将用户态切换为内核态,写完之后将内核态切换为用户态共四次上下文切换磁盘拷贝到内核缓存区,内核缓存区拷贝到应用缓存区,应用缓存区拷贝到socket缓存区,socket缓存区拷贝到网卡共四次拷贝
数据并没有被修改过最上方的两次拷贝并需要
如下图所示
image

mmap内存映射

通过mmap将磁盘中的数据建立映射关系,建立映射关系完毕后写数据时直接根据映射关系拿到原有数据,可以减少一次拷贝。
dma拷贝2次 cpu拷贝一次
内核切换还是四次
如下图所示
image

sendfile

DMA直接在内核中从磁盘读取到内核缓存区中,读取完毕后直接使用cpu拷贝到套接字缓冲区,如果DMA芯片支持直接从磁盘缓冲区读取数据,那么还能再少一次cpu读写
dma拷贝2(3)次,cpu拷贝1(0)次
从应用切换到内核 从内核切换回应用 一共两次上下问切换
如下图所示
image

splice

在文件缓冲区与套接字缓存区中建立一个通道,通过通道传输数据
经过两次内核切换
2 次DMA拷贝 0次cpu拷贝
image

标签:区中,缓存,切换,拷贝,cpu,内核
From: https://www.cnblogs.com/lyraHeartstrings/p/16830453.html

相关文章