两段式切换模型

xv6 采用 Process A Scheduler Process B 的切换模式,而不是直接 A B。

为什么要有个中间商 (Scheduler)?

  1. 解耦 (Decoupling): 如果允许 A 直接切到 B,A 就必须知道 B 的地址,且 A 的栈必须能安全地过渡到 B。这会导致复杂的依赖关系。
  2. 安全性 (Safety): 每个 CPU 都有一个独立的 scheduler 线程(运行在 cpu->context)。当 A 放弃 CPU 时,它先切回到这个“安全港湾”,清理 A 的状态,然后再寻找 B。
  3. 多核支持: 每个 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)