1. 性能调优概述:为什么需要任务调度与DMA加速?

大家好,我是你们这堂课的主讲。咱们开门见山——为什么一个好好的系统,跑着跑着就卡了?为什么CPU占用率不高,但吞吐量就是上不去?

我做了十几年嵌入式和高性能计算,见过太多这样的场景:工程师把算法优化到极致,结果发现瓶颈根本不在算法,而在数据搬运和任务切换上。说白了,CPU在等数据,DMA在闲着,任务调度在瞎忙活。

这一章,我们先搞清楚“为什么要做这件事”,再分析“瓶颈到底在哪”。

1.1 系统性能的“隐形杀手”

先看一个典型场景。一个视频采集系统,需要从摄像头获取数据,做预处理,然后传给AI模型推理。

传统做法是这样的:

  1. CPU发起读取请求
  2. CPU等待数据从外设搬到内存
  3. CPU把数据从内存搬到寄存器
  4. CPU处理数据
  5. CPU把结果写回内存

你发现问题了吗?CPU大部分时间都在“搬砖”,而不是“思考”。

核心矛盾:CPU是计算单元,不是搬运工。让CPU做数据搬运,就像让爱因斯坦去搬砖——浪费天才。

我在一个工业相机项目中遇到过类似问题。当时CPU占用率已经到90%,但帧率只有30fps。一分析,发现CPU有60%的时间在等数据。后来引入DMA和任务调度优化,帧率直接翻到120fps,CPU占用率降到40%。

1.2 任务调度:让CPU做正确的事

任务调度解决的是“谁先做、谁后做、谁不做”的问题。

一个没有调度的系统,就像没有红绿灯的十字路口——所有任务都在抢CPU,结果谁都没法好好干活。

调度策略 适用场景 我踩过的坑
FCFS(先来先服务) 批处理系统 交互任务响应慢到崩溃
时间片轮转 分时系统 实时任务被频繁打断
优先级调度 实时系统 优先级反转导致死锁
多级反馈队列 通用系统 参数调不好反而更差

避坑指南:我曾经在一个RTOS项目中,把所有中断都设成最高优先级。结果中断嵌套太深,低优先级任务永远得不到CPU。嗯,那叫一个惨——系统直接“假死”。

1.3 DMA传输:解放CPU的搬运工

DMA(Direct Memory Access)说白了就是:让硬件自己搬数据,CPU只管下命令。

没有DMA时,CPU要亲自参与每一次数据拷贝:

// 伪代码:没有DMA
while (data_available) {
    byte = read_from_peripheral();  // CPU等待
    buffer[i++] = byte;             // CPU搬运
    if (i == BUFFER_SIZE) {
        process(buffer);            // CPU处理
        i = 0;
    }
}

有DMA时,CPU只需要:

// 伪代码:有DMA
dma_config(src=peripheral, dst=buffer, size=BUFFER_SIZE);
dma_start();                        // 启动DMA,CPU解放
while (!dma_done) {
    // CPU可以去做其他事情
    do_other_work();
}
process(buffer);                    // DMA完成后,CPU处理

你看,CPU从“搬运工”变成了“管理者”。

1.4 系统性能瓶颈分析:从哪下手?

性能调优不是拍脑袋。我习惯用“三步法”来找瓶颈:

  1. 测量:用profiler看CPU占用、内存带宽、I/O延迟
  2. 定位:找到最慢的环节(通常是数据搬运或任务切换)
  3. 优化:用DMA替代CPU搬运,用调度优化任务分配

下面这张图,是我自己总结的“性能瓶颈分析框架”:

系统性能瓶颈分析框架 系统性能目标 CPU计算瓶颈 数据搬运瓶颈 任务调度瓶颈 CPU占用率100% 算法效率低 缓存命中率低 内存带宽饱和 I/O等待时间长 数据拷贝频繁 上下文切换频繁 优先级反转 任务饥饿 算法优化/并行化 DMA传输加速 任务调度优化 系统吞吐量最大化

我的经验:性能调优80%的时间花在“找瓶颈”上,只有20%花在“改代码”上。别一上来就优化,先搞清楚瓶颈在哪。

1.5 为什么任务调度和DMA要一起讲?

你想想看,任务调度管的是“谁用CPU”,DMA管的是“谁搬数据”。这两者其实是同一个问题的两面:

  • 任务调度不好 → CPU在无意义的任务切换中浪费了时间 → 数据搬运更慢
  • DMA没用好 → CPU被数据搬运拖死 → 任务调度再优化也没用

我记得在一个网络数据包处理项目中,单独优化调度提升了15%的性能,单独优化DMA提升了20%。但两者一起优化,性能直接翻倍。为什么?因为DMA解放了CPU,调度让CPU做更有价值的事——1+1 > 2。

1.6 本章小结

这一章我们讲了三件事:

  1. 性能瓶颈在哪:CPU计算、数据搬运、任务调度,三大瓶颈
  2. 任务调度解决什么:让CPU做正确的事,减少无意义切换
  3. DMA解决什么:让硬件搬数据,CPU只下命令

后面的章节,我们会深入每个技术细节。从任务调度的算法实现,到DMA的驱动开发,再到两者如何协同工作。嗯,路还长,咱们一步步走。