进程切换
在看xv6的代码,先做一下简单的笔记。
通常来说,进程A持有锁,最终由A释放。但是在进程切换的时候不同。
当一个进程释放CPU的时候,调用yield()
1 yield() 2 { 3 lock(&proctab.lock); 4 proc->state = RUNNABLE; 5 sched(); 6 unlock(&proctab.lock); 7 }
proc是全局变量,指向当前进程。
当A持有锁,然后调用sched的时候,转到scheduler中去了:
1 scheduler(void) 2 { 3 for(;;){ 4 lock(&proctab.lock); 5 for(p = proctab.proc; p < proctab.proc+NPROC; p++){ 6 if(p->state != RUNNABLE) 7 continue; 8 proc = p; 9 p->state = RUNNING; 10 swtch(&cpu->scheduler, p->context); 11 } 12 unlock(&proctab.lock); 13 } 14 }
(这里忽略了一些细节)
scheduler会选择一个进程,比如说B,然后调用swtch,,然后切换到B中去。通常,跳到B相当于从B调用yield()中的sched中返回,然后B执行yield中行6的代码,这时候B释放的是A持有的锁。
浙公网安备 33010602011771号