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

233 lines
9.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
好的,我帮你把之前讨论过的**线程/进程调度、阻塞、上下文切换相关题目**整理成一个高密度、页面级信息量的汇总版本,按照你想要的“全信息、一屏展示”的风格来写。每个题目包括核心考点、需要分析的流程、涉及的调度机制和状态变化,便于你复习或者直接背。
---
# 线程与进程调度、阻塞与上下文切换综合题目汇总
**题目 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队列状态**全部覆盖,信息密度最大,可以直接拿来复习或者口述演练整个调度过程。
---
如果你愿意,我可以帮你再画一个**“全流程一图搞定线程状态+调度+页表切换”图表**,一眼就能看完整个系统的动态,这样你就完全不用在脑子里反复推演了。
你想让我画吗?