抢占 vs 时间片
判别规则(核心,唯一要记的)
- 有更高优先级任务就绪 → 抢占(跨优先级);tick 到点且同优先级 → 时间片(同级内部)
- 核心不变量:正在运行的永远是最高优先级就绪任务
- 抢占只发生在调度点;关中断/临界区内不发生。tick 到点只是"检查机会",切不切换看优先级
一句话:"高优先级插入靠抢占,同级轮流靠时间片。"
抽象描述(一句话本质)
抢占式调度 = "最高优先级的就绪任务一定在运行"。两件事触发切换:抢占(高优先级就绪 → 立刻打断)和时间片(同优先级 tick 到点轮流)。抢占对优先级响应,时间片对公平响应。
正反例(建立直觉)
- 正例1(抢占):低优先级任务在跑 → 高优先级任务就绪(中断唤醒)→ 立刻抢占,低优先级被踢回 Ready
- 正例2(时间片):两个同优先级任务都 Ready → 各跑一个 tick 时间片 → 轮流
- 反例1:以为抢占随时发生 → 错,只发生在调度点(tick 中断、更高优先级就绪),关中断/临界区内不会
- 反例2:以为时间片发生在不同优先级之间 → 错,只有同优先级才时间片;不同优先级永远高优先级先跑
易混对比
|
抢占(preemption) |
时间片(time slicing) |
| 触发 |
更高优先级就绪 |
tick 到点(同优先级) |
| 目的 |
保证最高优先级先跑 |
同优先级公平轮流 |
| 作用对象 |
跨优先级 |
同优先级内部 |
| 结果 |
低优先级被踢回 Ready |
轮流执行,都分到时间 |
变体验证(3 题,全过=学会)
- 任务 L(优先级2) 在跑,中断唤醒任务 H(优先级5) → 抢占
- 任务 X、Y 同优先级(3),X 在跑 → 时间片轮转
- 陷阱题:任务 P(优先级4) 在跑,tick 到点,任务 Q(优先级2) 就绪 → P 继续运行,既不是抢占也不是时间片——Q 优先级更低抢不走 CPU;时间片只在同优先级之间发生
口述要点(面试怎么讲)
- 结论先行:高优先级就绪 → 抢占;同优先级 tick 到点 → 时间片;低优先级就绪 → 永不切换
- 为什么临界区/关中断里不抢占:临界区 = 关中断 → tick 中断进不来 → 调度器没有运行机会 → 调度点被物理移除 → 抢占无从发生。代价:中断响应延迟、实时性受损
- tick 到点 ≠ 时间片:tick 到点只是检查机会。就绪队列无同优先级时:① 有更高优先级 → 抢占 ② 只有更低优先级 → 当前任务继续运行。跨优先级切换只看优先级高低
- 饿死(starvation):最高优先级任务不阻塞(忙等/死循环)→ 低优先级永远拿不到 CPU。对策:高优先级主动让出(延时/阻塞),或事件驱动而非忙等
- 易错点:以为 tick 到点就切换;以为时间片跨优先级;以为临界区还能被切走
关系网络
| 相邻概念 |
和本主题的关系 |
孤立理解会犯的错 |
| 任务状态机 |
Running↔Ready 的两条路径就是抢占和时间片 |
以为切换靠"任务完成" |
| 临界区 |
关中断 → 调度点消失 → 不抢占 |
以为临界区里还能被切走 |
| 优先级反转 |
抢占规则被破坏的场景:低优先级间接挡住高优先级 |
以为抢占永远发生 |
| 实时性 |
抢占延迟 = 中断/关中断的影响 |
以为抢占是瞬时的 |
学习日期
2026-08-03
每主题一页,复习时只翻本目录。