什么是DMA与零拷贝

文章详细介绍了传统的IO模型,包括DMA技术如何解放CPU。在文件传输方面,对比了传统方式与mmap、sendfile以及支持SG-DMA的sendfile的零拷贝技术。讨论了大文件传输中面临的问题,并提出了异步I/O结合直接I/O作为解决方案,以减少磁盘和内存的交互,提高高并发场景下的效率。同时提到Nginx如何根据文件大小选择不同的IO策略。
摘要由CSDN通过智能技术生成

一、IO

1. 传统IO

  • CPU 发出对应的指令给磁盘控制器,然后返回;
  • 磁盘控制器收到指令后,于是就开始准备数据,会把数据放入到磁盘控制器的内部缓冲区中,然后产生一个中断;
  • CPU 收到中断信号后,停下手头的工作,接着把磁盘控制器的缓冲区的数据一次一个字节地读进自己的寄存器,然后再把寄存器里的数据写入到内存,而在数据传输的期间 CPU 是无法执行其他任务的。

2. DMA技术

将IO设备与内存之间的数据传输工作交给DMA控制器,这样 CPU 就可以去处理别的事务。

在这里插入图片描述

二、文件传输

1. 传统文件传输

四次用户态/内核态切换 + 四次数据拷贝

在这里插入图片描述

2. mmap + write

用 mmap() 替换 read() 系统调用函数。mmap() 系统调用函数会直接把内核缓冲区里的数据「映射」到用户空间,这样就不需要再从内核拷贝数据到用户缓冲区。四次用户态/内核态切换 + 三次数据拷贝

在这里插入图片描述

3. sendfile

sendfile接收源端和目的端的文件描述符作为参数,通过一次sendfile系统调用就可以直接在内核态中将内核缓冲区里的数据拷贝到 socket 缓冲区。两次用户态/内核态切换 + 三次数据拷贝
在这里插入图片描述

4. 支持SG-DMA的sendfile(零拷贝)

如果网卡支持 SG-DMA 技术,那么在sendfile() 系统调用的过程中网卡的 SG-DMA 控制器可以直接将数据从PageCache拷贝到网卡,不需要CPU在内存中进行数据拷贝,因此称为零拷贝两次用户态/内核态切换 + 两次数据拷贝

在这里插入图片描述

5. 大文件传输 (异步 + 直接IO)

大文件传输如果采用零拷贝,由于文件太大,可能某些部分的文件数据被再次访问的概率比较低,这样就会带来 2 个问题:

  • PageCache 由于长时间被大文件占据,其他「热点」的小文件可能就无法充分使用到 PageCache,于是这样磁盘读写的性能就会下降了;
  • PageCache 中的大文件数据,由于没有享受到缓存带来的好处,但却耗费 DMA 多拷贝到 PageCache 一次;

当虚拟文件系统读文件时,首先从内核缓存中查找要读取的文件内容是否存在缓存中,如果存在就直接从缓存中读取。对文件进行写操作时也一样,首先写入到缓存中,然后由操作系统同步到块设备(如磁盘)中。缓存I/O 的引入是为了减少对块设备的 I/O 操作,但是由于读写操作都先要经过缓存,然后再从缓存复制到用户空间,所以多了一次内存复制操作。
直接I/O就是对用户进行的 I/O 操作直接与块设备进行交互,而不进行缓存。直接I/O 的优点是:由于不对 I/O 数据块进行缓存,所以可以直接跟用户数据进行交互,减少一次内存的拷贝。直接I/O 的缺点是:每次 I/O 操作都直接与块设备进行交互,增加了对块设备的读写操作。但由于应用程序可以自行对数据块进行缓存,所以更加灵活,适合一些对 I/O 操作比较敏感的应用,如数据库系统。
参考:Linux 直接I/O 原理与实现

因此在高并发的场景下,针对大文件的传输的方式,应该使用「异步 I/O + 直接 I/O」来替代零拷贝技术。绕开 PageCache 的 I/O 叫直接 I/O,使用 PageCache 的 I/O 则叫缓存 I/O。通常,对于磁盘,异步 I/O 只支持直接 I/O。它把读操作分为两部分:

  • 前半部分,内核向磁盘发起读请求,但是可以不等待数据就位就可以返回,于是进程此时可以处理其他任务;
  • 后半部分,当内核直接将磁盘中的数据拷贝到进程缓冲区后,进程将接收到内核的通知,再去处理数据;

在 Nginx 里,可以通过配置,设定一个文件大小阈值,针对大文件使用异步 IO 和直接 IO,而对小文件使用零拷贝。

参考:DMA与零拷贝

三、网络数据传输流程

在这里插入图片描述
在这里插入图片描述

转载于:简述Linux系统收发网络数据包的过程

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值