多处理机调度
前面五节默认只有一个 CPU。这一节讨论多处理机环境下调度多出来的问题。
范围提示:本节在 408 中属于低频考点,通常只以选择题形式考查概念辨析,不涉及计算。掌握下面几组名词的含义与权衡关系即可。
机制
两种组织方式
非对称多处理(AMP):指定一个主处理机负责所有调度决策、I/O 处理和系统管理,其余处理机只执行用户代码。
优点是实现简单——只有主处理机会访问系统数据结构,天然不需要考虑并发访问的互斥问题。缺点是主处理机容易成为瓶颈。
对称多处理(SMP):每个处理机都可以自我调度,地位平等,都能访问系统数据结构。
这是现代系统的主流。代价是必须处理多个处理机同时访问就绪队列等内核数据结构的互斥问题——这正是自旋锁在多处理器系统中不可或缺的原因。
就绪队列的组织
SMP 下有两种做法:
共用一个就绪队列:所有处理机从同一个队列取进程。天然实现负载均衡,但队列本身成了临界资源,访问必须互斥,处理机数量多时争用严重。
每个处理机一个私有队列:各取各的,没有争用。但可能出现一个队列排满、另一个队列空着的情况,需要额外的负载均衡机制。
现代系统多采用私有队列 + 定期负载均衡。
处理机亲和性
处理机亲和性指让一个进程尽量始终在同一个处理机上运行。
理由完全是缓存:进程在某个核上运行一段时间后,该核的 Cache 和 TLB 里已经装满了它的数据。若把它迁移到另一个核,这些内容全部作废,新核上要重新一点点填回来,性能明显下降。
这与 2.2.4 讲的切换开销是同一回事——迁移的代价本质上就是一次”更彻底的” Cache/TLB 失效。
两种强度:
- 软亲和性:操作系统尽量保持进程在同一处理机上,但必要时(负载严重不均)仍可迁移。
- 硬亲和性:允许进程指定自己只能在某个 CPU 子集上运行,系统不得违背。
负载均衡
负载均衡指设法让各处理机的工作量大致均等,避免”一核有难八核围观”。
两种触发方式:
- 推迁移:由一个专门的任务周期性检查各处理机的负载,发现不均则把进程从繁忙的处理机推到空闲的处理机。
- 拉迁移:空闲的处理机主动从繁忙处理机的队列里拉一个进程过来。
两者可以并存。
边界
亲和性与负载均衡是一对矛盾
这是本节唯一真正需要理解的地方。
负载均衡要求”哪里空就往哪里迁”,而亲和性要求”尽量别迁”。 两者的目标直接冲突:
- 迁移了 → 负载均了,但 Cache/TLB 全废,性能下降
- 不迁移 → 保住了缓存,但可能一个核忙死、一个核闲死
所以实际系统只能折中:设一个负载差异的阈值,差得不多就不迁(保亲和性),差得太多才迁(保均衡)。软亲和性正是这个折中的体现。
这条权衡是选择题最爱考的点。 记住一句话:亲和性保的是单个进程的效率,负载均衡保的是整体资源利用率。
亲和性不是为了公平
容易误解为”亲和性是为了让进程公平地分到 CPU”。恰恰相反——它是为了保留缓存局部性,与公平毫无关系,而且它妨碍负载均衡。
AMP 为什么不需要考虑互斥
因为只有主处理机会访问系统数据结构。既然同一时刻只有一个执行流在碰就绪队列,就不存在竞态,自然不需要互斥机制。
SMP 则必须解决互斥,这正是多处理器系统上自旋锁的用武之地——见 2.3.3 中”自旋锁适用于多处理器”的论证。
对照速查
| 非对称多处理 AMP | 对称多处理 SMP | |
|---|---|---|
| 调度决策 | 只有主处理机做 | 每个处理机自我调度 |
| 是否需要互斥 | 不需要 | 必须(多核同时访问内核结构) |
| 瓶颈 | 主处理机 | — |
| 现代主流 | 否 | 是 |
| 就绪队列 | 优点 | 缺点 |
|---|---|---|
| 共用一个 | 天然负载均衡 | 队列是临界资源,争用严重 |
| 每处理机一个 | 无争用 | 需额外的负载均衡机制 |
| 处理机亲和性 | 负载均衡 | |
|---|---|---|
| 目标 | 保住 Cache/TLB | 各核工作量均等 |
| 倾向 | 尽量不迁移 | 该迁就迁 |
| 保的是 | 单个进程的效率 | 整体资源利用率 |
| 关系 | 互相冲突,须折中 |
考点
- AMP 不需要考虑互斥,SMP 必须考虑
- 亲和性的理由是保留 Cache/TLB 局部性,不是公平
- 亲和性与负载均衡互相冲突,实际系统靠阈值折中
- 软亲和性可迁移,硬亲和性可指定 CPU 子集
- 推迁移(周期检查后推出)vs 拉迁移(空闲核主动拉取)
链接
- 🏠 返回总览:操作系统第 2 章:进程与线程总览
- ⬅️ 上一节:2.2.5 CPU 调度算法
- 🔗 迁移代价的实质见 2.2.4 进程切换
- 📖 名词库:第 2 章名词库