进程切换

在看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持有的锁。

 

posted @ 2013-03-19 00:46  canghai  阅读(163)  评论(0)    收藏  举报