Почему в алгоритме планировщика xv6 есть оператор continue? - PullRequest
1 голос
/ 01 августа 2020

Первая ветвь в теле 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);

   }
 }
...