Первая ветвь в теле l oop имеет оператор continue
, но я не совсем уверен, почему. У меня сложилось впечатление, что оператор continue
здесь не нужен, и что было бы лучше иметь оператор if, например if(p->state == RUNNABLE)
, с остальной частью тела l oop внутри тела оператора if (т.е. это сделало бы поток управления более явным).
Я думаю, что можно было бы избежать вложенности для удобства чтения. Или я что-то здесь упускаю?
// Per−CPU process scheduler.
// Each CPU calls scheduler() after setting itself up.
// Scheduler never returns. It loops, doing:
// − choose a process to run
// − swtch to start running that process
// − eventually that process transfers control
// via swtch back to the scheduler.
void
scheduler(void) {
struct proc * p;
for (;;) {
// Enable interrupts on this processor.
sti();
// Loop over process table looking for process to run.
acquire(&ptable.lock);
for (p = ptable.proc; p < &ptable.proc[NPROC]; p++) {
// What's the purpose of this?
if (p−>state != RUNNABLE)
continue;
// Switch to chosen process. It is the process’s job
// to release ptable.lock and then reacquire it
// before jumping back to us.
proc = p;
switchuvm(p);
p−>state = RUNNING;
swtch(&cpu−>scheduler, proc−>context);
switchkvm();
// Process is done running for now.
// It should have changed its p−>state before coming back.
proc = 0;
}
release(&ptable.lock);
}
}