Linux 的 schedule()
函数主要完成现场切换任务。下面的主要是与文章所讨论问题相关的代码段
// Linux 2.6.11.12
// file: sched.c
void schedule(void) {
// ...
spin_lock_irq(&rq->lock);
// ...
prepare_arch_switch(rq, next);
context_switch(rq, prev, next);
finish_task_switch(prev);
// ...
}
这里锁住rq->lock
后,并没有将其打开,而是在prev task
下一次被调度后,才执行finish_task_switch(prev)
解锁rq->lock
。
那么,现在假定有三个进程A,B 和 C。A首先执行 schedule()
,A将rq->lock
锁住后,调用context_switch()
切换至B。再然后,B开始调用schedule()