Scheduler-线程

这是每个 CPU 核的“空闲状态”。当没有进程运行时,CPU 就跑在这个循环里。

核心循环

void scheduler(void) {
  for(;;){ // 无限循环
    intr_on(); // 开中断 (防止死锁,接收时钟中断)
    
    for(p in proc_table){ // 遍历进程表
      acquire(&p->lock);
      if(p->state == RUNNABLE) {
        p->state = RUNNING;
        
        // 这里的 swtch 是把 CPU 从调度器切给进程 P
        swtch(&c->context, &p->context);
        
        // 当进程 P yield() 后,swtch 会返回到这里
        // 此时 p->lock 依然被持有!(由 P 进程带过来的)
      }
      release(&p->lock);
    }
  }
}