xv6 调度程序内核陷阱

问题描述 投票:0回答:1

我正在编写一个简单的调度程序,其中我们迭代进程数组并查找所有可运行的进程并将其存储在另一个数组中以供查找。我有一个 srand 函数调用,它将生成一个介于 0 和可运行进程之间的数字。使用该索引从可运行进程数组中获取该进程,运行它然后重复。但是,如果有人可以提供帮助,我会不断收到恐慌内核陷阱错误。

void
scheduler(void)
{
  struct proc *p;
  struct cpu *c = mycpu();
  struct proc *arr[NPROC]; 
  c->proc = 0;
  
  for(;;){
    // Avoid deadlock by ensuring that devices can interrupt.
    intr_on();  
    
    int i=0;
    int runnableProc=0;
      for(p = proc; p < &proc[NPROC]; p++) {
      acquire(&p->lock);
      if(p->state == RUNNABLE) {   
        // Switch to chosen process.  It is the process's job
        // to release its lock and then reacquire it
        // before jumping back to us.
       arr[i]=p;
       runnableProc++;
       i++;
       }       
       release(&p->lock);
       }
        int randomNum=sys_srand()%runnableProc;
        acquire(&arr[randomNum]->lock);
  arr[randomNum]->state=RUNNING;
        c->proc = arr[randomNum];     
        swtch(&c->context, &arr[randomNum]->context);

        // Process is done running for now.
        // It should have changed its p->state before coming back.
        c->proc = 0;
        release(&arr[randomNum]->lock);
       
        }
}
scheduler xv6
1个回答
0
投票

我猜

sys_srand
是问题所在,但我在xv6存储库中找不到它。

鉴于其名称,

sys_srand
似乎是一个系统调用,声明为不带参数(
xxx sys_srand(void)
),但我相信它是
srand
的系统调用实现,它采用整数作为参数。

所以问题是:

  • 您从内核调用
    sys_xxx
    ,而不是直接调用
    xxx
    函数。 (或者
    sys_srand()
    中所谓的)
  • 您混合了
    srand
    rand
    函数。
    • srand
      是初始化随机生成器种子(每个进程应该调用一次)和
    • rand
      返回一个伪随机数。

排序:

  • 在您的日程安排开始时拨打
    srand
    一次
  • 调用
    rand
    选择要运行的进程。
© www.soinside.com 2019 - 2024. All rights reserved.