【发布时间】:2015-03-03 00:03:19
【问题描述】:
我正在尝试修改 xv6 中的调度策略,其中 Parent 在分叉后首先运行。
childPid = fork();
if (childPid < 0)
{
printf("fork() is failed\n");
}
else if (childPid == 0) // child
{
printf(" child! ");
exit();
}
printf(" parent! ");
由于 xv6 的调度程序总是先运行父级,我需要先将上下文切换到子级,以便子级先运行,然后再运行父级。 我曾尝试在代码中使用 wait(),但等待会失败,我不想使用失败。 当我的用户级程序执行 fork 时,我需要修改上下文切换。
在 xv6 fork() 系统调用中我做了以下更改
acquire(&ptable.lock);
np->state = RUNNABLE;
swtch(&cpu->scheduler, proc->context);
release(&ptable.lock);
但这似乎不起作用。 它是否与定时器中断有关。 在进行上下文切换后,如何实现在 fork 中先运行 child。
【问题讨论】:
-
“等待将失败” 的前提似乎是错误的。你是怎么得出这个结论的?此外,将
\n放在printfs的末尾可能会有所帮助。 -
“定时器中断”与这里有什么关系?
-
子代码可以立即禁止所有中断,因此调度器无法运行(这是一种非常激进的方法,我建议不要这样做)
-
在 xv6 fork 系统调用中,我通过添加上述第二个代码 sn-p 对 swtch 进行了更改,以首先运行新创建的进程
fork()方法。但是在打印我的孩子阻止我的 xv6 停止并且不运行父代码之后,可以为父再次运行做什么 -
@user3386109 :是的,如果您在 proc.c 中查看“wait()”命令的代码,它会失败,您肯定可以评论它为什么会失败。
if(!havekids || proc->killed){ //cprintf("havekids %d ",havekids); release(&ptable.lock); return -1; }