零拷贝(zero copy)

系统调用

在这里插入图片描述
读文件时,应用层调用内核抽象层对外提供的接口即为系统调用,用户态切换到内核态

read 和 write

在这里插入图片描述

// 从文件(用fd表示)中读取len长度的内容,放到buffer中
read(fd, buffer, len);  
// 把buffer中长度为len 的内容写入到socket中(用sockfd表示)
write(sockfd, buffer, len);
//注: read和write 应该是sys_read和sys_write的“包裹”函数,这里简化

1、从文件中读取内容,放到内核缓存区中(进入核心态)
2、从内核缓存区复制到用户缓冲区(read完成返回用户态)
3、发送数据,从用户缓存区复制到socket缓冲区(进入核心态)
4、网卡驱动异步发送数据(write完成返回用户态)

进入内核态两次,返回两次。
数据发生了三次复制,硬盘–>内核缓冲区–>用户缓冲区–>socket缓冲区

sendfile

在这里插入图片描述
不通过调用read和write,直接系统调用sendfile

sendfile(socket, file, len);

1、只进入内核态一次
2、只把位置和数据长度等信息从内核缓冲区复制到socket缓冲区,网卡驱动可以直接从内核缓冲区读取数据

zero copy

系统调用sendfile即为零拷贝
1、除了从硬盘读取数据时进行的DMA复制以外,没有任何其他复制
2、避免了数据不断地在用户态和核心态搬运,不需要CPU参与数据的复制,提高了系统性能

好的,下面我来为您图解一下Linux DMA拷贝数据到用户态的零拷贝Zero-Copy)技术。 首先,我们需要了解什么是DMA(Direct Memory Access,直接内存访问)技术。DMA是一种数据传输技术,它允许外设直接访问系统内存,而无需CPU的干预,从而提高数据传输效率。 在Linux中,当我们需要将数据从内核态传输到用户态时,通常情况下需要经过两次数据拷贝。第一次是将数据从设备驱动程序复制到内核缓冲区,第二次是将数据从内核缓冲区复制到用户空间缓冲区。这两次数据拷贝会消耗大量CPU资源,影响系统性能。 为了解决这个问题,Linux内核引入了零拷贝技术。零拷贝技术是指数据传输时,数据不需要经过CPU的拷贝,而是直接从内核空间传输到用户空间。这样可以减少CPU的负担,提高系统性能。 下面是零拷贝技术的流程图: ![DMA零拷贝技术流程图](https://img-blog.csdn.net/20180908100849451?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2JhY2tpbmcyMDE4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/50) 1. 应用程序发起读取请求。 2. 系统调用将请求传递给驱动程序。 3. 驱动程序将请求转换为DMA请求,并向DMA控制器发出请求。 4. DMA控制器将数据从设备读入内核缓冲区中。 5. DMA控制器将数据从内核缓冲区中直接传输到用户空间缓冲区,无需经过CPU。 6. DMA控制器传输完成后,向驱动程序发送通知。 7. 驱动程序将传输完成的数据返回给应用程序。 通过零拷贝技术,可以减少CPU的拷贝次数,提高数据传输效率,从而提高系统性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值