0

私は xv6 に新しいスケジューラを実装する作業を行っています。そのためには、最初にどのように機能するかを理解する必要があります。有線の問題に直面しています。つまり、for ループ ループがプロセスをスローする方法を本当に理解できません。

これは元のコードです:

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++){
   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);

 }
}

だから私は簡単なことを試しました、私はforループを作りました.1番目のものはループしてすべてのprocをスローし、他に何もせずにそれらをカウントする必要があります.2番目のものは元のものと同じようにループして実行する必要があります.期待どおりに機能しませんでした。何が起こっているのかというと、最初の for ループから 1 サイクル実行し、次に 2 番目から 1 サイクル実行するということです。

void
scheduler(void)
{
struct proc *p;
int FirstCounter=0;
int SecCounter=0;
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++){
    if(p->state != RUNNABLE)
      continue;
    counter++;
    cprintf("1st counter  = %d\n",FirstCounter); 
}
    for(p = ptable.proc; p < &ptable.proc[NPROC]; p++){
      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;
        cprintf("2nd counter  = %d\n",SecCounter); 
    }


release(&ptable.lock);

} }


そして出力はそのようなものです、

.
.
.
1st counter  = 14
2nd counter  = 15
1st counter  = 15
2nd counter  = 16
.
.

なぜそれが起こっているのですか?

4

1 に答える 1

0

試してみましたが、同じ結果が得られました。

pid = 1 and pid = 2しかし、プロセスの pid を出力すると、init およびページ デーモン プロセスであることがわかります。

init プロセスとページ デーモン プロセスの出力がわかりません。しかし、fork()新しいプロセスを試してみると、思った通りのプリントが得られます。

于 2015-03-19T21:58:57.383 に答える