欢迎光临
我们一直在努力

程序的并发与并行

并行:同一时刻,多个任务真的同时在跑(需要多个物理 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 的共性:并发来源不止多线程,中断是大头。

五、并行和并发 对比

项目并行 Parallel并发 Concurrency
硬件要求 至少 2 个物理 CPU 核 单核、多核都支持
执行时刻 同一时刻,多个任务同时运行 一段时间内交替运行,不一定同时
核心目的 压榨多核算力,提速 资源复用、响应多个事件(比如同时处理按键、摄像头、串口)
例子 双核 A55,两个线程分别跑在 CPU0、CPU1 单核上,应用线程和 GPIO 中断交替执行
竞争风险 跨核 Cache、共享数据竞争 抢占带来的竞态(中断抢任务、调度抢占)

六、小结

1、 并行是 “多个任务在多个核上同一时刻一起跑”,依赖多核硬件;

2、并发是 “多个任务都有机会推进”,靠调度 / 抢占交替执行,单核就能实现;

3、在 ARM 嵌入式 Linux 中,中断带来的并发,是驱动里最容易忽略的竞态来源。

赞(0)
未经允许不得转载:171主机测评 » 程序的并发与并行
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址