零拷贝技术:减少数据复制和上下文切换,提高网络传输效率(上)

这篇具有很好参考价值的文章主要介绍了零拷贝技术:减少数据复制和上下文切换,提高网络传输效率(上)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

零拷贝

当涉及到网络传输中的零拷贝技术时,它在提高性能和效率方面扮演着重要的角色。在之前我们已经讨论了磁盘设备管理中的零拷贝技术,其中涉及到了DMA技术。现在,让我们来深入探讨一下网络传输中零拷贝技术的实现方式以及它的重要性。

为什么要有DMA技术

在没有DMA(直接内存访问)技术之前,I/O(输入/输出)的过程相对较为繁琐。当CPU需要进行数据读取或写入时,它会发送相应的指令给磁盘控制器,然后等待返回。

磁盘控制器接收到指令后,会开始处理,并将相应的数据缓冲填充到自身的缓冲区中。一旦缓冲区被填满,磁盘控制器会产生一个中断信号,通知CPU数据已准备就绪。

CPU接收到中断信号后,会保存当前进程的上下文,并开始处理这个中断。处理中断的过程包括将磁盘控制器缓冲区中的数据取出,并放入内核缓冲区中。一旦所有数据填满内核缓冲区后,CPU会将数据放入用户缓冲区的内存中,使应用程序可以对数据进行操作。

为了更好地理解这个过程,这里有一幅图:

零拷贝技术:减少数据复制和上下文切换,提高网络传输效率(上)

可以看到,在整个数据传输过程中,CPU需要亲自参与搬运数据的过程,而且这个过程中CPU无法同时进行其他任务。然而,CPU本应该用来处理运算而不是搬运数据。

简单的搬运几个字符数据那没问题,当我们使用千兆网卡或者硬盘传输大量数据时,如果仍然让CPU来搬运数据,显然CPU会忙不过来。为了解决这个问题,计算机科学家们发明了DMA技术,即直接内存访问(Direct Memory Access)技术。

什么是DMA技术?大家肯定知道了一些,我在简单提一下吧。DMA技术的简单理解就是,在进行IO设备和内存之间的数据搬运时,尽量交给DMA控制器来完成,这样CPU就可以在搬运过程中继续处理其他任务,不再参与与数据搬运相关的工作。通过使用DMA控制器进行数据传输,CPU可以去处理其他事务。

那么,具体来看DMA控制器进行数据传输的过程是怎样的呢?下面我们来详细了解一下。

零拷贝技术:减少数据复制和上下文切换,提高网络传输效率(上)

具体过程如下:

  1. 应用程序调用read方法时,发送一个IO请求给操作系统,请求将数据读取到自己的用户缓冲区中,此时进程开始阻塞等待数据。
  2. CPU告诉DMA控制器将数据写入到哪个内存地址,并将请求发送给DMA控制器,此时CPU可以继续进行其他任务。
  3. DMA控制器将请求指令发送给磁盘控制器。
  4. 磁盘控制器接收到指令后进行处理,将数据填充到数据缓冲区中,并发送中断信号给DMA控制器,通知其开始取数据。
  5. DMA控制器开始将磁盘控制器缓冲区中的数据拷贝到内核缓冲区中。在此过程中,CPU并不参与搬运数据的工作,而是忙于处理其他任务。
  6. 当DMA控制器将数据写入到内核缓冲区中足够多时,会发送一个中断信号给CPU,此时CPU才会介入,将数据从内核缓冲区拷贝到用户缓冲区(用户态中)。
  7. 系统调用返回,用户进程等待进行各种算法处理,然后再次被CPU调度。

可以看到,在整个数据传输过程中,CPU不再参与数据搬运的工作,而是由DMA控制器全程完成。然而,CPU在这个过程中仍然不可或缺,因为它需要告诉DMA控制器传输哪些数据,从何处传输到何处。

在早期的计算机系统中,DMA控制器主要存在于主板上。但是随着技术的发展,I/O设备的数量和种类不断增加,为了满足各种不同的数据传输需求,每个I/O设备中通常都会包含自己的DMA控制器。例如:网卡:例如以太网网卡,它负责将计算机连接到网络。网卡内部通常包含一个DMA控制器,用于将数据从网络传输到内存或从内存传输到网络。硬盘驱动器:硬盘驱动器中的控制器通常包含一个DMA控制器,用于将数据从硬盘传输到内存或从内存传输到硬盘。

传统的文件传输有多糟糕?

如果服务端需要提供文件传输功能,我们可以考虑以下最简单的方式来实现:首先,从磁盘读取文件内容,然后通过网络协议将文件内容发送给客户端。

传统的文件传输方式在性能方面存在一些问题。首先,传统的I/O过程中,数据的读取和写入需要经过用户空间和内核空间之间的复制,这会导致额外的开销和延迟。其次,数据的读取和写入是通过操作系统层面的I/O接口来完成的,这也会增加一定的系统开销。此外,传统的文件传输方式需要进行多次系统调用,包括读取文件内容和写入网络报文,这也会增加系统的负担和延迟。
通常情况下,文件传输功能的代码如下所示,通常会涉及到两个系统调用:

// 伪代码如下:
// 读取文件内容:read(file)
// 将文件内容写入符合要求的报文中:write(socket)

尽管代码只有两行,但是其中发生了许多重要的操作。我们看下:

零拷贝技术:减少数据复制和上下文切换,提高网络传输效率(上)

首先,这段代码中发生了4次用户态与内核态的上下文切换。由于涉及两次系统调用(read()和write()),因此每次系统调用都需要从用户态切换到内核态,并在内核完成任务后再切换回用户态。

上下文切换的成本并不小,每次切换需要耗费几十纳秒到几微秒的时间。虽然单个切换时间很短,但在高并发的场景下,这种时间很容易被累积和放大,从而影响系统的性能。

其次,还发生了4次数据拷贝操作。其中两次是通过DMA(直接内存访问)进行的拷贝,另外两次则是通过CPU进行的拷贝。具体过程如下:

  1. DMA将数据从磁盘中拷贝到内核态的数据缓冲区;
  2. CPU接收到DMA控制器的中断信号后,将数据从内核缓冲区拷贝到用户缓冲区;
  3. 用户缓冲区的数据可能会被应用程序操作后直接发送或写入,再次由CPU拷贝到内核的socket缓冲区;
  4. DMA控制器再将socket缓冲区的数据拷贝到网卡上。

我们回过头看这个文件传输的过程,我们只是搬运一份数据,结果却搬运了 4 次,过多的数据拷贝无疑会消耗 CPU 资源,大大降低了系统性能。

我们可以看到,在文件传输的过程中,我们只需要搬运一份数据,但实际却进行了4次数据拷贝。过多的数据拷贝无疑会消耗CPU资源,大大降低系统性能。

这种简单且传统的文件传输方式存在冗余的上下文切换和数据拷贝操作,对于高并发系统而言非常糟糕。这些不必要的开销严重影响系统性能。因此,要提高文件传输的性能,我们需要减少用户态与内核态的上下文切换次数以及内存拷贝次数。

总结

在本次讨论中,我们确实只是提到了DMA技术在文件传输过程中的重要作用,并对零拷贝技术进行了简要介绍。然而,网络传输中存在的问题和优化方法是一个庞大的话题,涉及到诸多方面。因此,我决定将这些问题的详细讨论留到下一篇文章中,以便更全面地探讨网络传输的优化。我希望通过这样的讨论,能够为读者提供有益的信息和思路,感谢大家的阅读和关注,期待在下一篇文章中与大家再次交流和分享关于网络传输的优化问题。文章来源地址https://www.toymoban.com/news/detail-709758.html

到了这里,关于零拷贝技术:减少数据复制和上下文切换,提高网络传输效率(上)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ⛳ 多线程面试-什么是多线程上下文切换?

    多线程会共同使用一组计算机上的CPU ,而线程数大于给线程分配的 CPU 数量时,为了让各个线程都有执行的机会,就需要轮转使用CPU。 不同的线程切换使用 CPU, 发生的切换数据等, 就是上下文切换 在上下文切换过程中, CPU 会停止处理当前运行的程序, 并保存当前程序运行的具

    2024年02月14日
    浏览(41)
  • 【CSAPP】进程 | 上下文切换 | 用户视角下的并发进程

      💭 写在前面: 本文将学习《深入理解计算机系统》的第六章 - 关于异常控制流和系统级 I/O 的 进程部分。CSAPP 是计算机科学经典教材《Computer Systems: A Programmer\\\'s Perspective》的缩写,该教材由Randal E. Bryant和David R. O\\\'Hallaron 合著。 📜 本章目录: 0x00 进程(Processes) 0x01 假象

    2024年01月16日
    浏览(58)
  • 从零开始理解Linux中断架构(10)---上下文切换长征路

    有了前面章节的一大堆的铺垫,我们现在考虑一个路径比较长的任务切换: 当前 用户态进程 10#,在中断发生后,被切换到了 用户态进程 15#。        这里将使用异常执行流的概念来解释切换过程。理解了最长的那个切换,其他的任务切换:通过系统调用引起的任务切换,

    2024年02月11日
    浏览(46)
  • Linux_进程的优先级&&环境变量&&上下文切换&&优先级队列

    什么是优先级? 指定一个进程获取某种资源的先后顺序 本质是进程获取cpu资源的优先顺序 为什么要有优先级 进程访问的资源(CPU)是有限的 操作系统关于调度和优先级的原则:分时操作系统,基本的公平,如果进程因为长时间不被调整,就造成了饥饿问题 Linux的优先级特

    2024年04月09日
    浏览(54)
  • Java并发编程挑战与解决方案:上下文切换、死锁、资源限制及底层实现原理

    深入探讨Java并发编程中的挑战,包括上下文切换、死锁、资源限制,并介绍解决方案如减少上下文切换、避免死锁等。了解Java并发机制的底层实现原理和线程间通信方法。

    2024年02月01日
    浏览(44)
  • vue-element-plus-admin框架的tag上下文切换bug

    首先贴上该框架的链接:https://github.com/kailong321200875/vue-element-plus-admin 在对路由进行部分修改后,网站多次切换tag时,控制台会出现报错: Cannot read properties of undefined (reading \\\'offsetLeft\\\') 。 我在框架的issue中找到了类似问题:打开多个TagsView时会报错,用的 template 分支 对此,作

    2024年02月15日
    浏览(45)
  • Arm Cortex R52与TC3xx Aurix上下文切换对比

    目录 1.Arm Cortex R52上下文切换 2.英飞凌TC3xx的CPU上下午切换 2.1 上下文类型 2.2 Task Switching Operation  2.3 Context管理寄存器  2.4 各种事件的上下文切换 2.4.1 中断/Trap的上下文切换 2.4.2 函数调用的上下文切换 2.4.3 FCALL/FRET的上下文切换 2.5 Context Save、Restore操作 2.6 Context 切换性能特性

    2024年02月02日
    浏览(60)
  • 安信可开发环境构建-基于Ai-WB2系列 和 Ai-M61 或 Ai-M62 (环境上下文切换)

    首先,对于Ai-WB2系列环境的构建官方文档已经讲的非常明白了,这里不做阐述 如下链接所示https://blog.csdn.net/Boantong_/article/details/128480919  本人亲自测试可行 ,请严格follow官方的steps。 另外需要注意的是,为了避免错误,尽量不要自己从GIT或者Gitee拉取项目。使用上述链接内,

    2024年02月08日
    浏览(37)
  • 读数据压缩入门笔记06_上下文转换

    3.3.1.1. 如果这两个符号是相同的,那么行程继续 3.3.1.2. 如果不相同,那么当前行程终止 8.6.1.1. 真实数据中普遍存在 9.3.1.1. 事实上符号之间的顺序很重要 9.3.4.1. lexicographical permutation 9.3.4.2. BWT会打乱数据流中符号的顺序,并试图让相同的符号簇彼此靠近 9.3.4.3. 找出原始数

    2024年02月09日
    浏览(51)
  • 中间件中防止数据上下文并发导致异常

    在ASP.NET Core中,如果你想在中间件中只使用一个实例的数据库上下文(DbContext),你需要确保这个上下文在整个请求中是可用的,并且中间件在处理请求时能够访问它。以下是如何做到这一点的步骤: 注册DbContext为Scoped : 在Startup.cs的 ConfigureServices 方法中,你需要将你的D

    2024年01月24日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包