除零中断是什么意思?_DMA 技术是什么,在哪里用?看完绝对有收获

前文《I/O Zero Copy是什么?》介绍了 Zero Copy 的本质就是 IO 设备跟用户程序空间传输数据的过程中,减少数据拷贝次数,减少系统调用,实现 CPU 的零参与,彻底消除 CPU 在这方面的负载。实现 Zero Copy 用到的最主要技术是 DMA 数据传输技术和内存区域映射技术(虚拟内存)。

挖坑不断,填坑不止,通过《10 分钟看懂虚拟内存底层原理》我们学习了虚拟内存的底层原理。今天,我们来填一下 DMA 的大坑。从上层应用一路往下到底层硬件高速数据交换接口 DMA,越往下笔者愈感心有余而力不足,在这方面笔者也是个新人,边学边做一些笔记。

一、DMA 是什么?

DMA(Direct Memory Access:直接内存存取)是所有现代电脑的重要特色,它允许不同速度的硬件装置来沟通,而不需要依于 CPU 的大量中断负载,是一种可以大大减轻 CPU 工作量的数据转移方式。

CPU 有转移数据、计算、控制程序转移等很多功能,但其实转移数据(尤其是转移大量数据)是可以不需要 CPU 参与。比如希望外设A 的数据拷贝到外设 B,只要给两种外设提供一条数据通路,再加上一些控制转移的部件就可以完成数据的拷贝

正是基于上述的考虑,大佬们设计了 DMA ,解决数据转移过度消耗CPU资源的问题。

DMA 细节我们就不继续深究了,更多去了解 DMA 在 I/O 上的应用是怎样的,不过要记住 DMA 基本原理:

DMA 是一种允许外围设备(硬件子系统)直接访问系统主内存的机制。也就是说,基于 DMA 访问方式,系统主内存于硬盘或网卡之间的数据传输可以绕开 CPU 的调度。

整个数据传输操作在一个 DMA 控制器(DMAC)的控制下进行的,CPU 除了在数据传输开始和结束时做一点处理外(开始和结束时候要做中断处理),在传输过程中 CPU 可以继续进行其他的工作。这样在大部分时间里,CPU 计算和 I/O 操作都处于并行操作,使整个计算机系统的效率大大提高。

二、Linux I/O 的 DMA 应用

Linux 提供了轮询、I/O 中断以及 DMA 传输这 3 种磁盘与主存之间的数据传输机制。

1)轮询方式是基于死循环对 I/O 端口进行不断检测。

2)I/O 中断方式是指当数据到达时,磁盘主动向 CPU 发起中断请求,由 CPU 自身负责数据的传输过程。

3)DMA 传输则在 I/O 中断的基础上引入了 DMA 磁盘控制器,由 DMA 磁盘控制器负责数据的传输,降低了 I/O 中断操作对 CPU 资源的大量消耗。

2.1 I/O中断方式

在 DMA 技术出现之前,应用程序与磁盘之间的 I/O 操作都是通过 CPU 的中断完成的。每次用户进程读取磁盘数据时,都需要 CPU 中断,然后发起 I/O 请求等待数据读取和拷贝完成,每次的 I/O 中断都导致 CPU 的上下文切换:

7f7858b94f6ad6db2385188a7083b921.png

1)用户进程向 CPU 发起 read 系统调用读取数据,由用户态切换为内核态,然后一直阻塞等待数据的返回。

2)CPU 在接收到指令以后对磁盘发起 I/O 请求,将磁盘数据先放入磁盘控制器缓冲区。

3)数据准备完成以后,磁盘向 CPU 发起 I/O 中断。

4)CPU 收到 I/O 中断以后将磁盘缓冲区中的数据拷贝到内核缓冲区,然后再从内核缓冲区拷贝到用户缓冲区。

5)用户进程由内核态切换回用户态,解除阻塞状态,然后等待 CPU 的下一个执行时钟。

2.2 DMA传输方式

有了 DMA 磁盘控制器接管数据读写请求以后,CPU 从繁重的 I/O 操作中解脱,数据读取操作的流程如下:

1417e4ae49e8f5987116a56c26a39801.png

1)用户进程向 CPU 发起 read 系统调用读取数据,由用户态切换为内核态,然后一直阻塞等待数据的返回。

2)CPU 在接收到指令以后对 DMA 磁盘控制器发起调度指令。

3)DMA 磁盘控制器对磁盘发起 I/O 请求,将磁盘数据先放入磁盘控制器缓冲区,CPU 全程不参与此过程。

4)数据读取完成后,DMA 磁盘控制器会接受到磁盘的通知,将数据从磁盘控制器缓冲区拷贝到内核缓冲区。

5)DMA 磁盘控制器向 CPU 发出数据读完的信号,由 CPU 负责将数据从内核缓冲区拷贝到用户缓冲区。

6)用户进程由内核态切换回用户态,解除阻塞状态,然后等待 CPU 的下一个执行时钟。

小结

目前大多数的硬件设备,包括磁盘控制器、网卡、显卡以及声卡等都支持 DMA 技术。通过 DMA 和虚拟内存技术,我们实现了 Zero Copy 的目标,IO 设备跟用户程序空间传输数据的过程中,减少数据拷贝次数,减少系统调用,实现 CPU 的零参与,彻底消除 CPU 在这方面的负载。

PS:学习编辑不易,求个关注。另外,最近重温了《深入 Java 虚拟机》一书,大家有没有兴趣看看用 Java 语言实践 JVM 规范呢,有这个想法。

挖坑序列文章

10 分钟看懂虚拟内存底层原理

I/O Zero Copy是什么?看完这篇你绝对会了

10分钟看懂 Java IO 底层原理

深入分析 Java 需要编码的场景

Java 编码很难吗?看完这篇文章你就懂了

编码字符集和字符集编码傻傻分不清楚!看完这篇文章你就懂了?

为什么 String 要设计成 final ,又如何设计一个不可变类呢?

你真的懂 Java 的 String 吗?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值