4

私は話している:

struct {
struct spinlock lock;
struct proc proc[NPROC];
} ptable;

これは proc.c ファイルにあります。

誰かが初期化されている場所を説明できますか? なぜなら、proc.c に何か (プロセス) が追加されているのを見たことがないからです。

より正確に言うと、スケジューラ コードを見ているとしましょう。

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−&gt;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−&gt;state = RUNNING;
  swtch(&cpu−&gt;scheduler, proc−&gt;context);
  switchkvm();
  // Process is done running for now.
  // It should have changed its p−&gt;state before coming back.
  proc = 0;
  }
 release(&ptable.lock);
 }
}

の:

for(p = ptable.proc; p < &ptable.proc[NPROC]; p++){

ptable の各プロセスをループ処理していることがわかります。私の質問は、どうやってそこにたどり着いたのですか? ありがとう!

4

4 に答える 4

5

xv6 のコードには初期化がありません。理由は次のとおりです。

C は proc の int 変数と enum 変数を 0 に初期化します。ptableが実装さstruct proc proc[NPROC];れると、言語によってフィールドが 0 に初期化される 64 個のプロセスの配列が作成されます。0 はたまたま UNUSED 列挙の値です。

allocproc は ptable.proc をループして state=UNUSED を探し、最初に見つかったものをすべての必要な値に初期化します。したがって、配列内の構造体を明示的に初期化する必要はありません。

于 2017-10-30T05:33:13.800 に答える
1
struct {
    struct spinlock lock;
    struct proc proc[NPROC];
}ptable;

スタックに割り当てられ、自動的に初期化されます。ここでの秘訣は、匿名構造体とも呼ばれる GCC 方式で記述されていることです。

于 2016-04-18T15:03:39.810 に答える