两段式切换模型
xv6 采用 Process A → Scheduler → Process B 的切换模式,而不是直接 A → B。
为什么要有个中间商 (Scheduler)?
- 解耦 (Decoupling): 如果允许 A 直接切到 B,A 就必须知道 B 的地址,且 A 的栈必须能安全地过渡到 B。这会导致复杂的依赖关系。
- 安全性 (Safety): 每个 CPU 都有一个独立的
scheduler线程(运行在cpu->context)。当 A 放弃 CPU 时,它先切回到这个“安全港湾”,清理 A 的状态,然后再寻找 B。 - 多核支持: 每个 CPU 核只运行自己的调度器,互不干扰。
流程图
[CPU Core 0]
Process A (Kernel Stack)
|
v swtch(&A->context, &cpu->scheduler)
Scheduler Thread (Scheduler Stack) <-- 此时 CPU 运行在专用调度栈上
| (查找 RUNNABLE 进程...)
v swtch(&cpu->scheduler, &B->context)
Process B (Kernel Stack)