DMA 是什么?直接内存访问(DMA)原理、传输模式与服务器性能优化一次讲清


看服务器配置和硬件评测时,你大概率见过 DMA 这个词:NVMe 固态硬盘、独立网卡、声卡的规格表里都有它。DMA 是 Direct Memory Access 的缩写,中文叫“直接内存访问”。它解决的是计算机体系结构里一个朴素的问题:数据从 A 搬到 B,一定要 CPU 亲手搬吗?这篇文章就把 DMA 的原理、传输模式和它在服务器上的实际应用一次讲清。

为什么需要 DMA:CPU 亲自搬数据的代价

先看没有 DMA 的世界。硬盘要把一个文件读进内存,CPU 必须一条指令一条指令地把数据从硬盘控制器读进寄存器、再写入内存,1GB 的文件意味着数十亿次重复劳动。这段时间 CPU 被完全占用,连键盘鼠标的响应都顾不上,宝贵的算力全部浪费在“搬砖”上。

DMA 的思路是在主板上加一个专职搬运工——DMA 控制器(DMAC)。CPU 只需要下一道命令:多少数据、从哪搬到哪,随后就去处理别的任务;数据搬运由 DMAC 全程接管,搬完再发一个中断信号告诉 CPU“活干完了”。

DMA 的工作流程:四步完成一次传输

  1. CPU 初始化 DMA 控制器,写入源地址、目标地址和数据长度;
  2. CPU 继续执行其他任务,DMAC 通过总线向设备控制器发起读写请求;
  3. 数据经 DMAC 直接在设备与内存之间传输,不经过 CPU 寄存器;
  4. 传输完成后,DMAC 向 CPU 发出中断,CPU 再进行后续处理。

传输期间不占用 CPU,让算力和 I/O 吞吐同时得到释放,这是现代操作系统高并发的硬件基础之一。

三种常见 DMA 传输模式

  • 停止 CPU 访问(块传输):DMAC 独占总线一次搬完,速度最快,期间 CPU 无法访存;
  • 周期挪用(Cycle Stealing):趁 CPU 不用总线的间隙,每次“偷”一个总线周期搬运数据,对 CPU 影响最小,速度居中;
  • 交替访问:把总线时间片轮流分配给 CPU 和 DMA,硬件设计最复杂,效率也最高。

现代高速设备普遍采用块传输配合分散聚合(Scatter-Gather):一次描述多个内存块连续搬运,显著减少中断次数。

在服务器与 VPS 上,DMA 离你并不远

  • NVMe 固态硬盘:NVMe 协议高度依赖 DMA,数据在硬盘与内存之间直接传输,这是 NVMe 远快于 SATA 的重要原因;
  • RDMA 网络:数据中心网卡支持远程直接内存访问,两台服务器之间绕过内核、零拷贝传输,延迟可以压到微秒级,数据库与分布式存储大量采用;
  • 零拷贝技术:Linux 的 sendfile、splice 等特性,本质上都在减少内存拷贝与 CPU 参与的次数,思路与 DMA 一脉相承;
  • 虚拟化环境:VPS 常用的 virtio 半虚拟化驱动,让客户机通过 DMA 与宿主机高效交换数据;SR-IOV 直通则把网卡能力近乎原样地交给虚拟机,I/O 性能大幅提升。

写在最后

一句话总结:DMA 让 CPU 从“搬运工”回归“指挥官”。理解了它,你就能明白为什么同样配置的服务器,换了 NVMe 硬盘或 RDMA 网卡之后 I/O 性能天差地别。下次给 VPS 跑磁盘 IO 跑分的时候,你就知道那些数字背后真正干活的是谁了。


手机扫码阅读

微信或手机浏览器扫一扫,随时随地随心阅读与分享

网站打不开怎么办?从域名解析、端口到服务器日志,网站打不开排查思路一次讲清

域名解析实战:从 A 记录、CNAME 到 TTL,域名解析设置与不生效排查一次讲清

评 论