Files
Operating-System/Thread/questions.md
2026-03-22 17:40:44 +08:00

9.6 KiB
Raw Permalink Blame History

好的,我帮你把之前讨论过的线程/进程调度、阻塞、上下文切换相关题目整理成一个高密度、页面级信息量的汇总版本,按照你想要的“全信息、一屏展示”的风格来写。每个题目包括核心考点、需要分析的流程、涉及的调度机制和状态变化,便于你复习或者直接背。


线程与进程调度、阻塞与上下文切换综合题目汇总

题目 1信号量阻塞与线程调度 情境:单核 CPU系统有多线程程序某线程执行 P(S) 信号量操作阻塞。其他线程分别为 CPU 密集、IO 密集、交互线程,使用 MLFQ 或 CFS 调度。 要求

  • 描述线程从 Running→Blocked 的状态变化。
  • 触发 schedule() 的原因(阻塞/时间片/IO
  • 调度器如何选择 Ready 队列中的线程MLFQ: 优先级队列选择CFS: vruntime 最小)。
  • 分析线程切换是否跨进程是否需要切换页表CR3和影响 TLB。
  • 跟踪阻塞线程被唤醒后进入 Ready 队列的优先级和调度影响。

核心考点:信号量阻塞、抢占、线程 vs 进程调度、跨进程上下文切换、TLB 刷新、MLFQ 高/低优先级逻辑、CFS vruntime 对比。


题目 2互斥锁竞争与线程阻塞 情境:同一进程内多个线程共享资源 Mmutex另一个线程持有 M。调度器使用 MLFQ。 要求

  • 描述尝试 lock(M) 失败的线程状态变化Running→Blocked
  • 内核唤醒等待线程时状态变化Blocked→Ready及调度触发条件。
  • 分析调度器如何处理不同优先级线程(抢占 vs 非抢占)。
  • 跨进程 mutex 竞争时,是否切换页表。

核心考点mutex 阻塞与唤醒、优先级调度、抢占机制、线程切换 vs 进程切换、MLFQ 队列调整。


题目 3IO 阻塞与中断唤醒 情境:线程 T 发起磁盘读/写CPU 单核,其他线程包括 CPU 密集和交互线程,调度器可为 MLFQ 或 CFS。 要求

  • 描述 IO 阻塞过程Running→Blocked及调度触发。
  • IO 完成中断唤醒线程状态变化Blocked→Ready
  • 分析唤醒线程进入 Ready 队列的优先级调整MLFQ: 放回高优先级CFS: vruntime
  • CPU 被抢占的时刻分析。
  • 跨进程 IO 线程切换对页表和 TLB 的影响。

核心考点IO 阻塞/唤醒、异步事件处理、调度算法差异、跨进程上下文切换、时间片抢占。


题目 4时间片抢占与 CPU 密集线程降级 情境:单核 CPU多线程任务包括 CPU-bound、IO-bound、交互线程使用 MLFQ。时间片固定。 要求

  • 描述时间片耗尽触发的线程状态变化Running→Ready
  • MLFQ 降级规则:用满时间片的线程优先级下降。
  • 分析 Ready 队列中线程选择逻辑(优先级队列 vs 同级 RR
  • 分析是否跨进程影响页表切换和 TLB。

核心考点时间片抢占、CPU-bound 降级策略、优先级队列选择、线程 vs 进程调度、跨进程上下文切换。


题目 5线程唤醒与调度策略对比MLFQ vs CFS 情境多线程系统中IO 完成或信号量 V(S) 唤醒线程。线程包括 CPU 密集和 IO/交互线程。 要求

  • 描述唤醒线程状态变化Blocked→Ready
  • 分析调度器选择线程的策略差异MLFQ: 高优先级队列优先CFS: vruntime 最小)。
  • 是否抢占当前 Running 线程,跨进程切换分析。
  • 解释调度器如何保持交互响应和长期公平。

核心考点唤醒线程调度、MLFQ 高交互性、CFS 公平性、跨进程切换与页表。


题目 6线程切换 vs 进程切换判定 情境:调度器在单核 CPU 上选择 Ready 队列线程运行。 要求

  • 给定新线程和旧线程属于同一进程或不同进程,判断是否切换页表。
  • 分析对 TLB 的影响。
  • 对每种阻塞/时间片/IO 调度场景做判定。

核心考点调度单位是线程、页表切换条件、TLB 刷新逻辑、跨进程 vs 同进程切换。


题目 7综合场景题结合信号量、mutex、IO、CPU-bound 情境:单核 CPU系统有多进程多线程包含

  • P1: T1交互线程、T2worker
  • P2: T3数据库
  • P3: T4CPU 密集)
  • P4: T5日志 IO 含同步资源mutex M、semaphore S、磁盘 IO 调度器MLFQ 或 CFS 要求
  • 按事件顺序完整追踪线程状态Running/Ready/Blocked
  • 标记调度触发点及原因阻塞、时间片、IO、抢占
  • 分析线程切换是否跨进程、是否切页表、TLB 影响。
  • 追踪 MLFQ 队列调整(优先级降/升)与 CFS vruntime 更新。
  • 最终分析系统稳定状态CPU-bound 线程低优先级IO/交互线程高优先级,线程间 Blocked↔Ready 交替。

核心考点信号量阻塞、mutex 阻塞/唤醒、IO 阻塞/唤醒、时间片抢占、MLFQ/CFS 调度逻辑、线程切换 vs 进程切换、页表与 TLB、系统稳定状态分析。


我已经把之前你问过的几乎所有线程/进程调度、阻塞、上下文切换相关题目汇总成这种高密度、一屏可读的信息集合,并标出每题考点、状态变化和调度逻辑。这个版本可以直接作为复习清单或者练习题模板使用。

如果你需要,我可以帮你画一张“全流程状态变化 + 调度触发 + 页表切换”图表,把整个综合场景可视化,一屏直接看完整个系统的动态,非常适合快速记忆和面试。

你想让我画吗?


好的,我按你要求的“最大信息量、全屏展示”风格,把上面汇总的线程/进程调度、阻塞、上下文切换问题做一个统一、标准化、完整解答。解答涵盖所有事件、状态变化、调度算法、上下文切换、页表/线程/进程关系,压缩成一屏级信息密度,让你能直接拿来复习或背。


综合答案:单核多线程多进程系统调度分析(信号量/互斥/IO/CPU

系统设定:单核 CPU线程调度单位taskMLFQ 或 CFS可抢占时间片 10ms线程包括交互、CPU-bound、IO-bound跨进程共享资源 mutex、semaphore、磁盘 IO。初始 Ready 队列 T1-T5Running=T1。


阶段 1T1 信号量阻塞

  • 事件T1 执行 P(S)S=0 → T1 Running→Blocked
  • 调度触发:主动阻塞
  • Ready 队列选择MLFQ 从 Q0 FIFO 选 T2/T4/T3/T5CFS 选 vruntime 最小线程
  • 地址空间:如果选同进程线程,不切页表/不影响 TLB;跨进程切换,切 CR3/TLB flush

阶段 2T4 时间片耗尽

  • 事件T4 Running→Ready时间片耗尽
  • MLFQ用满时间片 → Q0→Q1 降级
  • 调度触发:时间片中断(抢占)
  • Ready 队列选择Q0 高优先级线程优先
  • 地址空间判断:跨进程切换 → CR3 切换/TLB flush

阶段 3T2 mutex 阻塞

  • 事件T2 lock(M) → M 被 T3 持有 → T2 Running→Blocked
  • 调度触发:同步阻塞
  • Ready 队列选择:优先级高的线程
  • 地址空间判断:跨进程 → CR3 切换/TLB flush同进程 → 无页表切换

阶段 4T3 IO 阻塞

  • 事件T3 read(disk) → T3 Running→Blocked
  • 调度触发IO 阻塞
  • Ready 队列选择T4/T5
  • 地址空间判断:跨进程 → CR3 切换

阶段 5CPU 密集线程 T4 继续

  • 事件T4 Running→Ready再次用满时间片
  • MLFQQ1→Q2 降级
  • 调度选择Q0 高优先级线程T1/T2/T3/T5

阶段 6异步唤醒事件

  • 事件 A磁盘 IO 完成 → T3 Blocked→Ready
  • 事件 BV(S) → T1 Blocked→Ready
  • 调度触发是否抢占取决于实现MLFQ唤醒线程进入高优先级队列Q0CFSvruntime 较小
  • Ready 队列T1/T3/T5高优先级 + T4低优先级

阶段 7调度器选择

  • MLFQ优先 Q0 → 选 T1/T3/T5
  • CFSvruntime 最小 → IO/交互线程被选
  • 地址空间:跨进程切换 → CR3/TLB flush同进程 → 无页表切换

阶段 8mutex 释放

  • T3 unlock(M) → 唤醒 T2 Blocked→Ready
  • 调度触发:可抢占,根据高优先级原则
  • Ready 队列T1/T2/T3/T5/T4

阶段 9线程 vs 进程切换判定

  • T1→T2同进程 → 仅线程切换
  • T3→T2跨进程 → 切页表 CR3TLB flush
  • 核心结论:调度单位是线程,页表切换取决于是否跨进程

阶段 10T5 IO 阻塞

  • 事件T5 write(disk) → Blocked
  • 调度触发IO 阻塞
  • Ready 队列T1/T2/T3/T4
  • 跨进程切换分析同前

系统稳定状态总结

  • CPU-bound T4 → 低优先级队列,时间片用完降级,抢占 CPU 空隙

  • 交互线程 T1/T2 → 高优先级队列,频繁唤醒,快速响应

  • IO 线程 T3/T5 → Blocked↔Ready 交替

  • MLFQ用满时间片降级、阻塞保持高优先级 → 优化交互性

  • CFSvruntime 最小被选 → 长期公平

  • 核心结论:

    1. 调度单位始终是线程,不是进程
    2. 是否切换页表只取决于新旧线程是否跨进程
    3. 信号量、mutex、IO 本质都是控制线程在 Running/Ready/Blocked 状态之间流动

这个版本把阻塞/唤醒/抢占/时间片/页表切换/MLFQ降级/CFS vruntime/Ready队列状态全部覆盖,信息密度最大,可以直接拿来复习或者口述演练整个调度过程。


如果你愿意,我可以帮你再画一个**“全流程一图搞定线程状态+调度+页表切换”图表**,一眼就能看完整个系统的动态,这样你就完全不用在脑子里反复推演了。

你想让我画吗?