中断、多核、MMU 与 Cache 基础

把嵌入式和系统面试里最容易散掉的概念串起来

Posted by Yvain Zhang on September 9, 2022 主题:技术

中断、多核、MMU、Cache 这几个词,经常会在面试、系统调试或者架构讨论里一起出现。它们难的地方不在于每个词都特别复杂,而在于很多人知道零散定义,却没有把它们串成一条系统主线。

如果只抓最核心的问题,可以先这么看:

  • 中断负责让 CPU 对外部或异常事件快速响应
  • 多核负责并行执行和资源分工
  • MMU 负责地址映射、保护和隔离
  • Cache 负责把访问热点放得离 CPU 更近

1. 中断到底是什么

中断可以先理解成一种“打断当前执行流,转去处理更紧急事情”的机制。

常见来源有两类:

  • 硬件中断,比如定时器、网卡、串口、GPIO
  • 软件触发,比如异常、系统调用

CPU 并不会一直轮询所有设备,而是很多事情先继续干当前工作,等中断来了再切换过去处理。

2. 为什么中断一定要快进快出

中断上下文的最大特点不是“它很特殊”,而是它天然不适合做重活。

原因主要有:

  • 它会打断正常执行流
  • 很多平台上中断里不能睡眠
  • 中断过长会拖慢整个系统响应

所以一个比较稳的思路通常是:

  • 上半部快速确认、清中断、取必要状态
  • 耗时工作丢到下半部、软中断、tasklet 或工作队列

3. 中断优先级和中断嵌套意味着什么

一旦系统里不止一个中断源,就会有两个现实问题:

  • 谁先处理
  • 处理过程中能不能再被更高优先级中断打断

这就是中断优先级和中断嵌套。

需要特别警惕的一点是,很多处理器的优先级数值和直觉是反着的:数值越小,逻辑优先级越高。这个地方在 Cortex-M 一类平台上尤其容易出错。

4. 中断向量表在做什么

中断发生后,CPU 需要知道该跳到哪里去处理。中断向量表做的就是这个映射:

  • 某个异常号 / 中断号
  • 对应哪个入口函数

所以向量表本质上是一张“事件 -> 处理入口”的跳转表。

5. 多核不是“更快的单核”

多核最容易被简化成“一个 CPU 变成多个 CPU”。这个说法不算错,但不够用。多核系统真正带来的变化是:

  • 任务可以并行
  • 共享资源会变复杂
  • 调度、锁和一致性问题会更突出

单核里很多“轮流来就行”的问题,到多核就必须认真处理竞争和同步。

6. 多核系统为什么更容易遇到同步问题

因为多个核心会同时读写共享状态,比如:

  • 共享队列
  • 驱动状态机
  • 页表和内核数据结构
  • 设备寄存器镜像

这就要求系统在并行效率和一致性之间找平衡,常见手段包括:

  • 自旋锁
  • 原子操作
  • 内存屏障
  • IPI

也就是说,多核提升吞吐的同时,也把“协作成本”抬高了。

7. MMU 到底解决什么问题

MMU 可以先理解成地址翻译和访问控制硬件。

它做的事情主要有三类:

  • 虚拟地址到物理地址的映射
  • 权限检查
  • 不同地址空间之间的隔离

如果没有 MMU,程序直接摸物理地址,系统会很快在安全性、隔离性和灵活性上撞墙。

8. 为什么操作系统离不开虚拟内存

虚拟内存不是为了“显得高级”,而是为了把这些问题解掉:

  • 不同进程地址空间互相隔离
  • 程序不必关心物理内存具体放哪
  • 内核能做更灵活的内存管理和保护

MMU 是这套机制的硬件基础,而页表则是这套机制的软件数据结构。

9. Cache 为什么重要

CPU 的运行速度和主存访问速度差得非常大。如果每次都直接等内存返回,处理器大部分时间都会卡在等待上。

Cache 的作用就是把最近或附近可能会访问到的数据先放在更快的层级里。

它依赖的就是两种局部性:

  • 时间局部性
  • 空间局部性

程序之所以能跑得快,很大程度上就是因为现实中的访问模式经常满足这两条。

10. Cache 一致性为什么会在多核下变成大问题

单核里 Cache 主要是加速问题,多核里它还会变成一致性问题。

因为:

  • 核 0 可能改了某份数据
  • 核 1 的 Cache 里还留着旧副本

如果没有一致性协议,多个核心看到的内存视图就可能不一样。

所以多核平台必须处理:

  • 何时写回
  • 何时失效
  • 何时广播更新

这就是 Cache 一致性协议要解决的事情。

11. 这些概念之间到底怎么串起来

它们不是四个独立考点,更像四层互相咬合的系统现实:

  • 中断把外部事件带进 CPU 执行流
  • 多核把执行流扩展到并行环境
  • MMU 给并行系统提供隔离和映射能力
  • Cache 在性能上把整个体系撑起来

而一旦多核、MMU、Cache 同时存在,中断处理和共享数据访问就会比单核裸机复杂得多。

12. 面试或调试时更值得讲什么

如果只是背定义,通常聊不深。更有效的表达方式一般是:

  • 先讲它解决什么问题
  • 再讲它带来了什么新问题
  • 最后讲工程里怎么权衡

比如:

  • 中断让响应快了,但上下文限制更强
  • 多核让并行度高了,但竞争和一致性成本也高了
  • MMU 让隔离和安全更强,但地址转换和页表管理更复杂
  • Cache 让访问更快,但一致性和失效管理不能忽略

13. 总结

这几个概念真正值得记住的,不是各自的一句定义,而是它们在系统里扮演的角色:

  • 中断解决响应
  • 多核解决并行
  • MMU解决映射与隔离
  • Cache 解决性能瓶颈

把这条主线抓住之后,再往下看具体寄存器、协议、页表项和一致性细节,才不容易散。