码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 操作系统零拷贝技术、PageCache


    笔记目录

    • 1.DMA技术在I/O子系统的运用
      • 1.1 DMA技术诞生的背景
      • 1.2 DMA工作流程
      • 1.3 网络传输文件的流程
    • 2.零拷贝技术
      • 2.1 内存映射技术 mmap
      • 2.2 sendfile模式
        • 2.2.1 SG-DMA
    • 3.PageCache

    图片取材自图灵课堂!

    1.DMA技术在I/O子系统的运用

    1.1 DMA技术诞生的背景

    在早期计算机中,系统的I/O流程如下:

            1. CPU通过系统和I/O总线给磁盘控制器发出指令。
            1. 磁盘控制器收到指令后,控制器负责读取磁盘数据,将磁盘数据放入控制器内部缓冲,然后在I/O总线上发出一个CPU中断信号。
            1. CPU收到中断信号,将磁盘控制器的缓冲区按字节依次读取到CPU寄存器中,然后将寄存器数据写入内存,此期间CPU不会调度进程做额外的计算工作。
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    由于整个数据的传输过程都需要CPU亲自参与,如果数据量很大的时候,显然这种模式会消耗 大量CPU时间,于是直接内存访问DMA技术就诞生了。

    1.2 DMA工作流程

    DMA是一种特殊的芯片,它可以控制设备控制器和内存数据交互,无需CPU干预控制和拷贝过程。

            1. CPU通过设置DMA控制器的寄存器,告诉DMA需要传送数据的地址等信息。
            1. DMA将I/O请求发送给磁盘控制器。
            1. 磁盘控制器收到DMA的I/O请求,将磁盘数据拷贝到磁盘控制器的内部缓冲区,缓冲区到达一定量会给DMA发起一个中断信号。
            1. DMA收到磁盘控制器的信号,将磁盘控制器内部缓冲区数据根据I/O总线拷贝到操作系统内核空间。
            1. DMA读取了足够多的数据就会给CPU发送中断信号。
            1. CPU收到DMA完成一次传输的信号,将内核空间的数据拷贝到指定进程用户空间地址
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    1.3 网络传输文件的流程

    在这里插入图片描述

    2.零拷贝技术

    零拷贝技术并不是一次拷贝也没有,而是减少文件的拷贝次数。

    2.1 内存映射技术 mmap

    mmap:内存文件映射,操作系统可以通过mmap()函数将磁盘上的文件映射到内存的一块区域,进程可以像读写内存一样来读写该文件。在传统的read()函数中,read函数会将内核缓冲区数据拷贝到用户空间中,mmap函数无需这一次拷贝。mmap()函数会把内核缓冲区数据映射到进程的用户态空间中。
    在这里插入图片描述

    2.2 sendfile模式

    在Linux2.1版本中,系统提供了一个函数sendfile(),ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);,它可以代替read和write两个系统调用,这样相比于mmap就会又减少一次系统调用,也减少了2此进程的上下文切换,全流程只需要2次上下文切换和3此数据拷贝。
    在这里插入图片描述

    2.2.1 SG-DMA

    在Linux2.4版本后,并且网卡支持SG-DMA技术的情况下,sendfile()函数还可以进一步优化,更加少一步数据拷贝
    在这里插入图片描述

    3.PageCache

    在I/O系统中,数据从设备控制器拷贝到操作系统内核缓冲区,这个内核缓冲区就是PageCache。它的作用是将操作系统最近频繁读写的数据写入PageCache中提高性能,因为磁盘I/O的速度不高,参考局部性原理,PageCache有着预读的功能。但是,在传输大文件的时候PageCache会被很快写满,其它热点数据就无法更好利用PageCache,从总体上降低了操作系统的效率。所以针对大文件的传输,不建议使用PageCache而是建议绕过设备控制器缓存拷贝到PageCache的这一个流程,这个流程叫直接I/O或者叫异步I/O。

  • 相关阅读:
    使用vue-cli搭建SPA项目->spa项目的构建,基于spa项目路由完成,基于spa项目完成嵌套路由
    生活不止诗和远方,还有​眼前的苟且!
    2022计算机保研夏令营记录
    前端工作总结293-uni-增加添加成功提示
    Java后端开发(十)-- idea(2022版)将 已push 的 远程仓库 的 多条commit记录 进行撤销
    推荐一个免费的相亲工具
    EF Core中带过滤器参数的Include方法
    C++中按引用向函数传递参数
    LeetCode题集-4 - 寻找两个有序数组的中位数,图文并茂,六种解法,万字讲解
    【C++ Primer Plus学习记录】指针——使用new来创建动态数组
  • 原文地址:https://blog.csdn.net/qq_42290561/article/details/125475821
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号