46.SMP-多核.md 5.2 KB

SMP/多核

判别规则(核心,唯一要记的)

  1. 看"是否真同时":多核多线程同一时刻各占一个核 → 并行;单核时间片轮流 → 并发(不是并行)
  2. 看"是否共享数据":核间共享数据 → 必须原子操作/锁(否则丢失更新/数据竞争);各核私有数据 → 不需要锁
  3. 看"缓存是否打架":共享数据跨核 → 靠缓存一致性协议(MESI)保证;互不相干的变量挤在同一缓存行 → 伪共享(性能骤降),用对齐/填充解决

一句话:"SMP = 多核对等共享内存;共享数据必须同步;缓存一致性和伪共享是多核的坑;关中断只关当前核,多核要自旋锁。"

抽象描述(一句话本质)

SMP(对称多处理)= 多个处理器核心共享同一块物理内存、同一个操作系统、完全对等。每个核有自己的寄存器和缓存(L1/L2),问题出在"共享数据 + 各自缓存"的冲突上。

易混对比

并行 并发
定义 同一时刻同时执行多个 同一时刻只执行一个,轮流切换
需要 多核/多CPU 单核即可
例子 4 核跑 4 线程 单核跑多线程
数据竞争 多核共享数据必出 单核也要注意(中断/调度)
SMP AMP(非对称多处理)
核的关系 对等(对称) 不等(异构分工)
内存 共享同一块 可独立/私有
OS 一个 OS 管理所有核 可多个/专用核
例子 普通多核 PC/服务器 CPU 大小核 big.LITTLE、GPU+CPU

多核的坑:缓存一致性 / 伪共享 / 数据竞争

缓存一致性 原子性 伪共享
核间缓存与内存不一致 操作不可分割 不同变量同缓存行互相干扰
靠缓存一致性协议(MESI) 靠原子指令/锁 靠缓存行对齐/填充

MESI 协议(四状态):Modified 已改 / Exclusive 独占 / Shared 共享 / Invalid 失效。核改数据 → 标记 Modified,广播让其他核缓存失效(Invalid)→ 其他核再读时从内存/该核同步最新值。

伪共享判断:变量地址间隔 < 缓存行大小(通常 64 字节)→ 可能伪共享。如 int arr[8](32 字节 < 64)中 arr[0]arr[1] 同缓存行;arr[0]arr[100](400 字节 > 64)绝不会。

数据竞争:多核 count++ 是"读→改→写"三步,同时执行被切开 → 丢失更新(A 读 0、B 读 0,都写 1,结果 1 不是 2)。

原子操作 vs 锁 vs 自旋锁

原子操作 锁(互斥锁) 自旋锁
实现 硬件原子指令(CAS/test-and-set) 基于原子指令 + 阻塞/睡眠 忙等轮询
开销 最小 有上下文切换 忙等耗 CPU
适用 单变量简单操作(count++) 多步骤临界区 多核短临界区
是否阻塞 是(睡眠) 忙等

锁本身就是用原子指令实现的。原子操作不阻塞别人,锁会阻塞等待。

多核临界区:关中断不够

  • 单核(FreeRTOS):关中断(taskENTER_CRITICAL)可保护临界区(主题27)
  • 多核:关中断只关当前核,其他核照样能改共享数据 → 必须用自旋锁原子操作
  • 自旋锁也有优先级反转问题

变体验证(3 题,全过=学会)

  1. 4 核 CPU 跑 2 个线程都在核 0 → 并发;绑到核 0/核 1 → 并行
  2. 陷阱题:两个核上 count++(共享变量)不加锁,说"不同核不会同时写,安全" → count++ 读改写被切开,丢失更新(结果 1 不是 2)
  3. 陷阱题:arr[0]arr[100] 说"离得远没伪共享" → (400 字节 > 64 缓存行,不可能同缓存行);但 arr[0]arr[1](4 字节 < 64)→ 会伪共享

口述要点(面试怎么讲)

  • 结论先行:SMP = 多核对等共享内存/OS;多核真并行、共享数据必须同步;关中断只关当前核
  • 缓存一致性:核各有缓存,改了数据要广播让其他核失效(MESI),否则读到旧值
  • 伪共享:不相干变量挤同一缓存行,互相写导致反复失效,性能骤降;靠对齐/填充拉开距离
  • 原子 vs 锁:原子操作单变量一步完成不阻塞;锁多步骤临界区会阻塞;自旋锁多核忙等
  • 多核临界区:关中断只关当前核,其他核照样改数据 → 自旋锁/原子操作
  • 易错点:把并发当并行;以为多核不用加锁;以为关中断多核有效;伪共享判断只看"逻辑无关"不看地址间隔

关系网络

相邻概念 关系 孤立理解会犯的错
临界区(主题27) 单核关中断即可;多核必须自旋锁/原子 以为关中断多核也有效
原子操作(主题21) 多核共享单变量的保护手段 以为原子操作要阻塞别人
进程 vs 线程 多核多线程真并行,共享数据竞争更易触发 以为多核不用加锁
优先级反转(主题26) 多核自旋锁也有优先级反转问题 以为自旋锁没开销

学习日期

2026-08-26


每主题一页,复习时只翻本目录。