233 lines
9.6 KiB
Markdown
233 lines
9.6 KiB
Markdown
好的,我帮你把之前讨论过的**线程/进程调度、阻塞、上下文切换相关题目**整理成一个高密度、页面级信息量的汇总版本,按照你想要的“全信息、一屏展示”的风格来写。每个题目包括核心考点、需要分析的流程、涉及的调度机制和状态变化,便于你复习或者直接背。
|
||
|
||
---
|
||
|
||
# 线程与进程调度、阻塞与上下文切换综合题目汇总
|
||
|
||
**题目 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:互斥锁竞争与线程阻塞**
|
||
**情境**:同一进程内多个线程共享资源 M(mutex),另一个线程持有 M。调度器使用 MLFQ。
|
||
**要求**:
|
||
|
||
* 描述尝试 lock(M) 失败的线程状态变化(Running→Blocked)。
|
||
* 内核唤醒等待线程时状态变化(Blocked→Ready)及调度触发条件。
|
||
* 分析调度器如何处理不同优先级线程(抢占 vs 非抢占)。
|
||
* 跨进程 mutex 竞争时,是否切换页表。
|
||
|
||
**核心考点**:mutex 阻塞与唤醒、优先级调度、抢占机制、线程切换 vs 进程切换、MLFQ 队列调整。
|
||
|
||
---
|
||
|
||
**题目 3:IO 阻塞与中断唤醒**
|
||
**情境**:线程 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(交互线程)、T2(worker)
|
||
* P2: T3(数据库)
|
||
* P3: T4(CPU 密集)
|
||
* 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,线程调度单位(task),MLFQ 或 CFS,可抢占,时间片 10ms;线程包括交互、CPU-bound、IO-bound,跨进程共享资源 mutex、semaphore、磁盘 IO。初始 Ready 队列 T1-T5,Running=T1。
|
||
|
||
---
|
||
|
||
## 阶段 1:T1 信号量阻塞
|
||
|
||
* 事件:T1 执行 `P(S)`,S=0 → T1 Running→Blocked
|
||
* 调度触发:主动阻塞
|
||
* Ready 队列选择:MLFQ 从 Q0 FIFO 选 T2/T4/T3/T5;CFS 选 vruntime 最小线程
|
||
* 地址空间:如果选同进程线程,**不切页表/不影响 TLB**;跨进程切换,**切 CR3/TLB flush**
|
||
|
||
---
|
||
|
||
## 阶段 2:T4 时间片耗尽
|
||
|
||
* 事件:T4 Running→Ready,时间片耗尽
|
||
* MLFQ:用满时间片 → Q0→Q1 降级
|
||
* 调度触发:时间片中断(抢占)
|
||
* Ready 队列选择:Q0 高优先级线程优先
|
||
* 地址空间判断:跨进程切换 → CR3 切换/TLB flush
|
||
|
||
---
|
||
|
||
## 阶段 3:T2 mutex 阻塞
|
||
|
||
* 事件:T2 lock(M) → M 被 T3 持有 → T2 Running→Blocked
|
||
* 调度触发:同步阻塞
|
||
* Ready 队列选择:优先级高的线程
|
||
* 地址空间判断:跨进程 → CR3 切换/TLB flush;同进程 → 无页表切换
|
||
|
||
---
|
||
|
||
## 阶段 4:T3 IO 阻塞
|
||
|
||
* 事件:T3 read(disk) → T3 Running→Blocked
|
||
* 调度触发:IO 阻塞
|
||
* Ready 队列选择:T4/T5
|
||
* 地址空间判断:跨进程 → CR3 切换
|
||
|
||
---
|
||
|
||
## 阶段 5:CPU 密集线程 T4 继续
|
||
|
||
* 事件:T4 Running→Ready,再次用满时间片
|
||
* MLFQ:Q1→Q2 降级
|
||
* 调度选择:Q0 高优先级线程(T1/T2/T3/T5)
|
||
|
||
---
|
||
|
||
## 阶段 6:异步唤醒事件
|
||
|
||
* 事件 A:磁盘 IO 完成 → T3 Blocked→Ready
|
||
* 事件 B:V(S) → T1 Blocked→Ready
|
||
* 调度触发:是否抢占取决于实现;MLFQ:唤醒线程进入高优先级队列(Q0),CFS:vruntime 较小
|
||
* Ready 队列:T1/T3/T5(高优先级) + T4(低优先级)
|
||
|
||
---
|
||
|
||
## 阶段 7:调度器选择
|
||
|
||
* MLFQ:优先 Q0 → 选 T1/T3/T5
|
||
* CFS:vruntime 最小 → IO/交互线程被选
|
||
* 地址空间:跨进程切换 → CR3/TLB flush;同进程 → 无页表切换
|
||
|
||
---
|
||
|
||
## 阶段 8:mutex 释放
|
||
|
||
* T3 unlock(M) → 唤醒 T2 Blocked→Ready
|
||
* 调度触发:可抢占,根据高优先级原则
|
||
* Ready 队列:T1/T2/T3/T5/T4
|
||
|
||
---
|
||
|
||
## 阶段 9:线程 vs 进程切换判定
|
||
|
||
* T1→T2(同进程) → 仅线程切换
|
||
* T3→T2(跨进程) → 切页表 CR3,TLB flush
|
||
* 核心结论:**调度单位是线程,页表切换取决于是否跨进程**
|
||
|
||
---
|
||
|
||
## 阶段 10:T5 IO 阻塞
|
||
|
||
* 事件:T5 write(disk) → Blocked
|
||
* 调度触发:IO 阻塞
|
||
* Ready 队列:T1/T2/T3/T4
|
||
* 跨进程切换分析同前
|
||
|
||
---
|
||
|
||
## 系统稳定状态总结
|
||
|
||
* CPU-bound T4 → 低优先级队列,时间片用完降级,抢占 CPU 空隙
|
||
* 交互线程 T1/T2 → 高优先级队列,频繁唤醒,快速响应
|
||
* IO 线程 T3/T5 → Blocked↔Ready 交替
|
||
* MLFQ:用满时间片降级、阻塞保持高优先级 → 优化交互性
|
||
* CFS:vruntime 最小被选 → 长期公平
|
||
* 核心结论:
|
||
|
||
1. 调度单位始终是线程,不是进程
|
||
2. 是否切换页表只取决于新旧线程是否跨进程
|
||
3. 信号量、mutex、IO 本质都是控制线程在 Running/Ready/Blocked 状态之间流动
|
||
|
||
---
|
||
|
||
这个版本把**阻塞/唤醒/抢占/时间片/页表切换/MLFQ降级/CFS vruntime/Ready队列状态**全部覆盖,信息密度最大,可以直接拿来复习或者口述演练整个调度过程。
|
||
|
||
---
|
||
|
||
如果你愿意,我可以帮你再画一个**“全流程一图搞定线程状态+调度+页表切换”图表**,一眼就能看完整个系统的动态,这样你就完全不用在脑子里反复推演了。
|
||
|
||
你想让我画吗?
|