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