日期:2014-05-16 浏览次数:20688 次
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