3.2 内核第一次做进程调度
现在执行的是进程0的代码。从这里开始,进程0准备切换到进程1去执行。在Linux 0.11的进程调度机制中,通常有以下两种情况可以产生进程切换。1)允许进程运行的时间结束。进程在创建时,都被赋予了有限的时间片,以保证所有进程每次都只执行有限的时间。一旦进程的时间片被削减为0,就说明这个进程此次执行的时间用完了,立即切换到其他进程去执行,实现多进程轮流执行。2)进程的运行停止。当一个进程需要等待外设提供的数据,或等待其他程序的运行结果……或进程已经执行完毕时,在这些情况下,虽然还有剩余的时间片,但是进程不再具备进一步执行的“逻辑条件”了。如果还等着时钟中断产生后再切换到别的进程去执行,就是在浪费时间,应立即切换到其他进程去执行。这两种情况中任何一种情况出现,都会导致进程切换。进程0角色特殊。现在进程0切换到进程1既有第二种情况的意思,又有怠速进程的意思。我们会在3.3.1节中讲解怠速进程。进程0执行for(;;) pause( ),最终执行到schedule()函数切换到进程1,如图3-13所示。
pause函数的执行代码如下:
//代码路径:init/main.c:
…
static inline _syscall0(int,fork)
static inline _syscall0(int,pause)
…
void main(void)
{
…
move_to_user_mode();
if (!fork()) { /* we count on this going ok */
init();
}
for(;;) pause();
}
pause()函数的调用与fork()函数的调用一样,会执行到unistd.h中的syscall0,通过int 0x80中断,在system_call.s中的call _sys_call_table(,