私は 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
.
.
なぜそれが起こっているのですか?