CPU传统存取数据方式&DMA

本文探讨了传统CPU在数据传输中的局限性,引入DMA技术如何减轻CPU负担,以及硬中断和软中断的区别。文章详细描述了DMA的工作原理、流程和优势,以及它们在处理网络I/O和磁盘I/O中的应用,强调了DMA在提高系统效率和吞吐率中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

CPU 拷贝:

由 CPU 直接处理数据的传送,数据拷贝时会一直占用 CPU 的资源。

DMA 拷贝:

由 CPU 向DMA磁盘控制器下达指令,让 DMA 控制器来处理数据的传送,数据传送完毕再把信息反馈给 CPU,从而减轻了 CPU 资源的占有率。

上下文切换:

  • 当用户程序向内核发起系统调用时,CPU 将用户进程从用户态切换到内核态;

  • 当系统调用返回时,CPU 将用户进程从内核态切换回用户态。

网络 I/O

在这里插入图片描述

磁盘 I/O

在这里插入图片描述

读操作

当应用程序执行 read 系统调用读取一块数据的时候,如果这块数据已经存在于用户进程的页内存中,就直接从内存中读取数据。

如果数据不存在,则先将数据从磁盘加载数据到内核空间的读缓存(Read Buffer)中,再从读缓存拷贝到用户进程的页内存中。

read(file_fd, tmp_buf, len):基于传统的 I/O 读取方式,read 系统调用会触发 2 次上下文切换,1 次 DMA 拷贝和 1 次 CPU 拷贝。
发起数据读取的流程如下:

  1. 用户进程通过 read 函数向 Kernel 发起 System Call,上下文从 user space 切换为 kernel space。

  2. CPU 利用 DMA 控制器将数据从主存或硬盘拷贝到 kernel space 的读缓冲区(Read Buffer)。

  3. CPU 将读缓冲区(Read Buffer)中的数据拷贝到 user space 的用户缓冲区(User Buffer)。

  4. 上下文从 kernel space 切换回用户态(User Space),read 调用执行返回。

传统CPU存取数据

因为CPU 的工作速度和外设的工作速度差距太大,且外设格式种类繁多,无法直接存取,需要经过转换,因此CPU 不直接存取外设

基于上述原因,传统CPU 获取数据的步骤如下:

  1. CPU 将外设数据加载到内存(和CPU的处理速度最接近)

  2. CPU 检查 cache 是否有自己需要的数据(是否命中)

  3. 如果命中,直接返回数据;如未命中,

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值