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];创建一个包含 64 个进程的数组,其字段由语言初始化为 0。0 恰好是 UNUSED 枚举的值。

allocproc 通过 ptable.proc 循环查找 state=UNUSED,然后将找到的第一个初始化为所有需要的值。所以不需要显式初始化数组中的结构。

于 2017-10-30T05:33:13.800 回答
3

它被初始化。

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

上面的代码定义了一个结构(没有名称)并初始化ptable为这种类型的一个结构。也许你对这种语法感到困惑:

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

在这里,我们只定义了一个结构名称ptable,没有初始化。

于 2015-04-27T09:55:06.047 回答
1
struct {
    struct spinlock lock;
    struct proc proc[NPROC];
}ptable;

它在堆栈上分配并自动初始化。这里的诀窍是它是用 GCC 方式编写的,也称为匿名结构。

于 2016-04-18T15:03:39.810 回答
0

作为全局变量的结构体在 xv6 内核启动期间ptable作为调用的一部分被加载到内存中。bootmain()由于它是全局的,因此会初始化默认值。现在来看看它们如何实际用于存储进程以及何时修改条目。

  • 第一个进程是由它创建的,userinit()它选择一个未使用的条目并将其用于设置自己的 PCB。
  • 在内核制作手工制作的 initproc 之后,会发生对调度程序的第一次调用,这就是您在此处所指的内容。
  • 由于调度程序将选择一个 RUNNABLE 进程,而我们现在唯一的一个就是 initproc 本身,它就是开始运行的那个。
  • 它调用以fork()生成一个 shell,该 shellallocproc()在每次调用时调用以从 ptable 获取另一个未使用的条目并将其分配给进程。

这就是在 fork 期间填充 ptable 的方式,并帮助 xv6 记录活动进程。

于 2021-05-05T12:22:55.907 回答