日期:2014-05-16  浏览次数:20726 次

(莱昂氏unix源代码分析导读-29) swap in/out (下)

                                                                              by cszhao1980

最后,看一下我们的老朋友sched(),上次看到它还是在系统初启时,#0进程在

sched()函数中调用sleep(&runout ,…)睡眠,从而让出cpu,切换至#1进程。

 

sched()函数是个黑洞,它内部是个死循环,永远也不会退出(除非出错)。也

就是说#0进程将陷入在sched()中,而sched()用来进行调度,自此#0进程就蜕变

为调度进程。事实上, sched()函数也是#0进程的专属函数——只有#0进程才会调用它。

 

首先看看sched()的入口——这里的入口,不仅指#0进程第一次调用sched()时的入口,

也同时指,当#0进程醒来后,要执行的语句。显然,无论是哪种情况,都会首先到“Loop”处:

1957: loop:

1958:      spl6();

1960:      for(rp = &proc[0]; rp < &proc[NPROC]; rp++)

1961:      if(rp->p_stat==SRUN && (rp->p_flag&SLOAD)==0 &&

1962:          rp->p_time > n) {

1963:                 p1 = rp;

1964:                 n = rp->p_time;

1965:       }

1966:       if(n == -1) {

1967:            runout++;

1968:            sleep(&runout, PSWP);

1969:            goto loop;

1970:        }

 sched()Loop整个进程表,看是否有进程处于S