电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

程序员面试之零拷贝技术解析22

17页
  • 卖家[上传人]:沧海****19
  • 文档编号:194625930
  • 上传时间:2021-08-29
  • 文档格式:DOCX
  • 文档大小:1.21MB
  • / 17 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 1、程序员面试之零拷贝技术解析Hey guys,这里是程序员cxuan,欢迎你收看我最新一期的文章,这篇文章给大家分享一篇非常优质的文章 -零拷贝技术,零拷贝技术也是面试常考的一个点,比较重要,而这篇文章恰好的解决了所有的疑惑,推荐给你。1. 数据的四次拷贝与四次上下文切换很多应用程序在面临客户端请求时,可以等价为进行如下的系统调用:1. File.read(file, buf, len);2. Socket.send(socket, buf, len);例如消息中间件 Kafka 就是这个应用场景,从磁盘中读取一批消息后原封不动地写入网卡(NIC,Network interface controller)进行发送。在没有任何优化技术使用的背景下,操作系统为此会进行 4 次数据拷贝,以及 4 次上下文切换,如下图所示:如果没有优化,读取磁盘数据,再通过网卡传输的场景性能比较差:4 次 copy:1. CPU 负责将数据从磁盘搬运到内核空间的 Page Cache 中;2. CPU 负责将数据从内核空间的 Socket 缓冲区搬运到的网络中;3. CPU 负责将数据从内核空间的 Page C

      2、ache 搬运到用户空间的缓冲区;4. CPU 负责将数据从用户空间的缓冲区搬运到内核空间的 Socket 缓冲区中;4 次上下文切换:1. read 系统调用时:用户态切换到内核态;2. read 系统调用完毕:内核态切换回用户态;3. write 系统调用时:用户态切换到内核态;4. write 系统调用完毕:内核态切换回用户态;我们不免发出抱怨:1. CPU 全程负责内存内的数据拷贝还可以接受,因为效率还算可以接受,但是如果要全程负责内存与磁盘、网络的数据拷贝,这将难以接受,因为磁盘、网卡的速度远小于内存,内存又远远小于 CPU;2. 4 次 copy 太多了,4 次上下文切换也太频繁了;2. DMA 参与下的数据四次拷贝DMA 技术很容易理解,本质上,DMA 技术就是我们在主板上放一块独立的芯片。在进行内存和 I/O 设备的数据传输的时候,我们不再通过 CPU 来控制数据传输,而直接通过 DMA 控制器(DMA Controller,简称 DMAC)。这块芯片,我们可以认为它其实就是一个协处理器(Co-Processor)。DMAC 最有价值的地方体现在,当我们要传输的数据特别

      3、大、速度特别快,或者传输的数据特别小、速度特别慢的时候。比如说,我们用千兆网卡或者硬盘传输大量数据的时候,如果都用 CPU 来搬运的话,肯定忙不过来,所以可以选择 DMAC。而当数据传输很慢的时候,DMAC 可以等数据到齐了,再发送信号,给到 CPU 去处理,而不是让 CPU 在那里忙等待。注意,这里面的“协”字。DMAC 是在“协助”CPU,完成对应的数据传输工作。在 DMAC 控制数据传输的过程中,我们还是需要 CPU 的进行控制,但是具体数据的拷贝不再由 CPU 来完成。原本,计算机所有组件之间的数据拷贝(流动)必须经过 CPU,如下图所示:现在,DMA 代替了 CPU 负责内存与磁盘以及内存与网卡之间的数据搬运,CPU 作为 DMA 的控制者,如下图所示:但是 DMA 有其局限性,DMA 仅仅能用于设备之间交换数据时进行数据拷贝,但是设备内部的数据拷贝还需要 CPU 进行,例如 CPU 需要负责内核空间数据与用户空间数据之间的拷贝(内存内部的拷贝),如下图所示:上图中的 read buffer 也就是 page cache,socket buffer 也就是 Socket 缓冲

      4、区。3. 零拷贝技术3.1 什么是零拷贝技术?零拷贝技术是一个思想,指的是指计算机执行操作时,CPU 不需要先将数据从某处内存复制到另一个特定区域。可见,零拷贝的特点是 CPU 不全程负责内存中的数据写入其他组件,CPU 仅仅起到管理的作用。但注意,零拷贝不是不进行拷贝,而是 CPU 不再全程负责数据拷贝时的搬运工作。如果数据本身不在内存中,那么必须先通过某种方式拷贝到内存中(这个过程 CPU 可以不参与),因为数据只有在内存中,才能被转移,才能被 CPU 直接读取计算。零拷贝技术的具体实现方式有很多,例如: sendfile mmap splice 直接 Direct I/O不同的零拷贝技术适用于不同的应用场景,下面依次进行 sendfile、mmap、Direct I/O 的分析。不过出于总结性的目的,我们在这里先对下面的技术做一个前瞻性的总结。 DMA 技术回顾:DMA 负责内存与其他组件之间的数据拷贝,CPU 仅需负责管理,而无需负责全程的数据拷贝; 使用 page cache 的 zero copy: sendfile:一次代替 read/write 系统调用,通过使用 DM

      5、A 技术以及传递文件描述符,实现了 zero copy mmap:仅代替 read 系统调用,将内核空间地址映射为用户空间地址,write 操作直接作用于内核空间。通过 DMA 技术以及地址映射技术,用户空间与内核空间无须数据拷贝,实现了 zero copy 不使用 page cache 的 Direct I/O:读写操作直接在磁盘上进行,不使用 page cache 机制,通常结合用户空间的用户缓存使用。通过 DMA 技术直接与磁盘/网卡进行数据交互,实现了 zero copy3.2 sendfilesnedfile 的应用场景是:用户从磁盘读取一些文件数据后不需要经过任何计算与处理就通过网络传输出去。此场景的典型应用是消息队列。在传统 I/O 下,正如第一节所示,上述应用场景的一次数据传输需要四次 CPU 全权负责的拷贝与四次上下文切换,正如本文第一节所述。sendfile 主要使用到了两个技术:1. DMA 技术;2. 传递文件描述符代替数据拷贝;下面依次讲解这两个技术的作用。1.利用 DMA 技术sendfile 依赖于 DMA 技术,将四次 CPU 全程负责的拷贝与四次上下文

      6、切换减少到两次,如下图所示:DMA 负责磁盘到内核空间中的 Page cache(read buffer)的数据拷贝以及从内核空间中的 socket buffer 到网卡的数据拷贝。2.传递文件描述符代替数据拷贝传递文件描述可以代替数据拷贝,这是由于两个原因: page cache 以及 socket buffer 都在内核空间中; 数据传输过程前后没有任何写操作;注意事项:只有网卡支持 SG-DMA(The Scatter-Gather Direct Memory Access)技术才可以通过传递文件描述符的方式避免内核空间内的一次 CPU 拷贝。这意味着此优化取决于 Linux 系统的物理网卡是否支持(Linux 在内核 2.4 版本里引入了 DMA 的 scatter/gather - 分散/收集功能,只要确保 Linux 版本高于 2.4 即可)。3.一次系统调用代替两次系统调用由于 sendfile 仅仅对应一次系统调用,而传统文件操作则需要使用 read 以及 write 两个系统调用。正因为如此,sendfile 能够将用户态与内核态之间的上下文切换从 4 次讲到 2 次

      7、。另一方面,我们需要注意 sendfile 系统调用的局限性。如果应用程序需要对从磁盘读取的数据进行写操作,例如解密或加密,那么 sendfile 系统调用就完全没法用。这是因为用户线程根本就不能够通过 sendfile 系统调用得到传输的数据。3.3 Direct I/ODirect I/O 即直接 I/O。其名字中的直接二字用于区分使用 page cache 机制的缓存 I/O。 缓存文件 I/O:用户空间要读写一个文件并不直接与磁盘交互,而是中间夹了一层缓存,即 page cache; 直接文件 I/O:用户空间读取的文件直接与磁盘交互,没有中间 page cache 层;直接在这里还有另一层语义:其他所有技术中,数据至少需要在内核空间存储一份,但是在 Direct I/O 技术中,数据直接存储在用户空间中,绕过了内核。Direct I/O 模式如下图所示:此时用户空间直接通过 DMA 的方式与磁盘以及网卡进行数据拷贝。Direct I/O 的读写非常有特点: Write 操作:由于其不使用 page cache,所以其进行写文件,如果返回成功,数据就真的落盘了(不考虑磁盘自带的

      8、缓存); Read 操作:由于其不使用 page cache,每次读操作是真的从磁盘中读取,不会从文件系统的缓存中读取。事实上,即使 Direct I/O 还是可能需要使用操作系统的 fsync 系统调用。为什么?这是因为虽然文件的数据本身没有使用任何缓存,但是文件的元数据仍然需要缓存,包括 VFS 中的 inode cache 和 dentry cache 等。在部分操作系统中,在 Direct I/O 模式下进行 write 系统调用能够确保文件数据落盘,但是文件元数据不一定落盘。如果在此类操作系统上,那么还需要执行一次 fsync 系统调用确保文件元数据也落盘。否则,可能会导致文件异常、元数据确实等情况。Direct I/O 的优缺点:(1)优点1. Linux 中的直接 I/O 技术省略掉缓存 I/O 技术中操作系统内核缓冲区的使用,数据直接在应用程序地址空间和磁盘之间进行传输,从而使得自缓存应用程序可以省略掉复杂的系统级别的缓存结构,而执行程序自己定义的数据读写管理,从而降低系统级别的管理对应用程序访问数据的影响。2. 与其他零拷贝技术一样,避免了内核空间到用户空间的数据拷贝

      9、,如果要传输的数据量很大,使用直接 I/O 的方式进行数据传输,而不需要操作系统内核地址空间拷贝数据操作的参与,这将会大大提高性能。(2)缺点1. 由于设备之间的数据传输是通过 DMA 完成的,因此用户空间的数据缓冲区内存页必须进行 page pinning(页锁定),这是为了防止其物理页框地址被交换到磁盘或者被移动到新的地址而导致 DMA 去拷贝数据的时候在指定的地址找不到内存页从而引发缺页错误,而页锁定的开销并不比 CPU 拷贝小,所以为了避免频繁的页锁定系统调用,应用程序必须分配和注册一个持久的内存池,用于数据缓冲。2. 如果访问的数据不在应用程序缓存中,那么每次数据都会直接从磁盘进行加载,这种直接加载会非常缓慢。3. 在应用层引入直接 I/O 需要应用层自己管理,这带来了额外的系统复杂性;谁会使用 Direct I/O?IBM 的一篇文章指出,自缓存应用程序( self-caching applications)可以选择使用 Direct I/O。自缓存应用程序对于某些应用程序来说,它会有它自己的数据缓存机制,比如,它会将数据缓存在应用程序地址空间,这类应用程序完全不需要使用操作系统内核中的高速缓冲存储器,这类应用程序就被称作是自缓存应用程序( self-caching applications )。例如,应用内部维护一个缓存空间,当有读操作时,首先读取应用层的缓存数据,如果没有,那么就通过 Direct I/O 直接通过磁盘 I/O 来读取数据。缓存仍然在应用,只不过应用觉得自己实现一个缓存比操作系统的缓存更高效。数据库管理系统是这类应用程序的一个代表。自缓存应用程序倾向于使用数据的逻辑表达方式,而非物理表达方式;当系统内存较低的时候,自缓存应用程序会让这种数据的逻辑缓存被换出,而并非是磁盘上实际的数据被换出。自缓存应

      《程序员面试之零拷贝技术解析22》由会员沧海****19分享,可在线阅读,更多相关《程序员面试之零拷贝技术解析22》请在金锄头文库上搜索。

      点击阅读更多内容
    最新标签
    监控施工 信息化课堂中的合作学习结业作业七年级语文 发车时刻表 长途客运 入党志愿书填写模板精品 庆祝建党101周年多体裁诗歌朗诵素材汇编10篇唯一微庆祝 智能家居系统本科论文 心得感悟 雁楠中学 20230513224122 2022 公安主题党日 部编版四年级第三单元综合性学习课件 机关事务中心2022年全面依法治区工作总结及来年工作安排 入党积极分子自我推荐 世界水日ppt 关于构建更高水平的全民健身公共服务体系的意见 空气单元分析 哈里德课件 2022年乡村振兴驻村工作计划 空气教材分析 五年级下册科学教材分析 退役军人事务局季度工作总结 集装箱房合同 2021年财务报表 2022年继续教育公需课 2022年公需课 2022年日历每月一张 名词性从句在写作中的应用 局域网技术与局域网组建 施工网格 薪资体系 运维实施方案 硫酸安全技术 柔韧训练 既有居住建筑节能改造技术规程 建筑工地疫情防控 大型工程技术风险 磷酸二氢钾 2022年小学三年级语文下册教学总结例文 少儿美术-小花 2022年环保倡议书模板六篇 2022年监理辞职报告精选 2022年畅想未来记叙文精品 企业信息化建设与管理课程实验指导书范本 草房子读后感-第1篇 小数乘整数教学PPT课件人教版五年级数学上册 2022年教师个人工作计划范本-工作计划 国学小名士经典诵读电视大赛观后感诵读经典传承美德 医疗质量管理制度 2
    关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
    手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
    ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.