我正在编写一个简单的调度程序,其中我们迭代进程数组并查找所有可运行的进程并将其存储在另一个数组中以供查找。我有一个 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);
}
}
我猜
sys_srand
是问题所在,但我在xv6存储库中找不到它。
鉴于其名称,
sys_srand
似乎是一个系统调用,声明为不带参数(xxx sys_srand(void)
),但我相信它是srand
的系统调用实现,它采用整数作为参数。
所以问题是:
sys_xxx
,而不是直接调用 xxx
函数。 (或者sys_srand()
中所谓的)srand
和 rand
函数。
srand
是初始化随机生成器种子(每个进程应该调用一次)和rand
返回一个伪随机数。排序:
srand
一次rand
选择要运行的进程。