并行:同一时刻,多个任务真的同时在跑(需要多个物理 CPU 核)
并发:一段时间内,多个任务交替快速执行,给人 “同时跑” 的感觉,可以只有单个 CPU 核
一、并行(Parallelism)
硬件基础:多个独立的 CPU 物理核心(如:双核 A55:CPU0、CPU1)
1、同一时钟周期,CPU0 跑任务 A,CPU1 跑任务 B,真正同时执行指令。
2、条件:必须多核;单核 CPU不存在并行。
3、Linux 行为:内核调度器(CFS)把不同任务分发到不同核上运行。
4、例子:
- CPU0:运行图像采集线程(从 camera 读帧)
- CPU1:运行 H.264 编码线程
- 两个线程同一时刻一起跑,这就是并行。
5、并行带来的典型问题:
① 跨核的数据竞争
② Cache 一致性
ARMv8 有硬件 CC(Cache Coherence,一致性总线),多核访问同一个共享内存时硬件自动同步 Cache;但依然需要锁(spinlock/mutex)保护临界区,否则出现脏数据。
二、并发(Concurrency)
不一定多核,单核也能并发。本质是任务交替复用 CPU 资源。
1、Linux 内核依靠时间片轮转调度 + 抢占实现并发
① CPU 在很短时间内,不断切换任务 A→B→A→B,每个任务跑一小段时间片就被切走。
② 从宏观时间窗口看,多个任务都在推进。
2、两种典型并发来源:
① 线程 / 进程并发(用户态)
单核 A55 上,两个 pthread 线程轮流跑,不是同时执行,只是切换足够快。
② 中断和进程的并发
哪怕单核!中断随时抢占当前正在运行的任务,这是内核里最重要的并发场景。
比如:CPU 正在执行 sensor 读取的 task,来了 GPIO 中断,立刻跳进中断服务函数 ISR。
这就是中断上下文和进程上下文的并发,非常容易产生竞态。

三、如何区分?
- 并行:同时执行(多核)
- 并发:可以交替执行(单核 / 多核都有)
并行属于并发的一个子集;并发范围更大。
四、在 ARM Linux 里,4 种并发场景
1、进程上下文 <–> 进程上下文
多个线程 / 进程,被调度器抢占切换,多核下还会并行。用 mutex、semaphore 保护。
2、进程上下文 <–> 中断上下文(单核最典型并发)
① task 在读一个全局 buf,中断里写这个 buf
② 中断随时打断 task
③ 单核场景:不能用 mutex(mutex 会睡眠,中断上下文禁止睡眠),要用spin_lock_irqsave关中断保护。
3、中断 <–> 中断
同 CPU 上,高优先级中断抢占低优先级中断。
4、多核并行
不同核上同时跑进程 / 中断
两个核同时访问共享变量;此时即使关本核中断,另外一个核还在跑,必须自旋锁。
嵌入式 Linux 驱动和应用和 PC Linux 的共性:并发来源不止多线程,中断是大头。

五、并行和并发 对比
| 硬件要求 | 至少 2 个物理 CPU 核 | 单核、多核都支持 |
| 执行时刻 | 同一时刻,多个任务同时运行 | 一段时间内交替运行,不一定同时 |
| 核心目的 | 压榨多核算力,提速 | 资源复用、响应多个事件(比如同时处理按键、摄像头、串口) |
| 例子 | 双核 A55,两个线程分别跑在 CPU0、CPU1 | 单核上,应用线程和 GPIO 中断交替执行 |
| 竞争风险 | 跨核 Cache、共享数据竞争 | 抢占带来的竞态(中断抢任务、调度抢占) |
六、小结
1、 并行是 “多个任务在多个核上同一时刻一起跑”,依赖多核硬件;
2、并发是 “多个任务都有机会推进”,靠调度 / 抢占交替执行,单核就能实现;
3、在 ARM 嵌入式 Linux 中,中断带来的并发,是驱动里最容易忽略的竞态来源。




