【问题标题】:Context Switching and Timer Interrupts in xv6xv6 中的上下文切换和定时器中断
【发布时间】: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-&gt;killed){ //cprintf("havekids %d ",havekids); release(&amp;ptable.lock); return -1; }

标签: c xv6


【解决方案1】:

您可以在父代码中调用sched_yield(),这将使父线程放弃CPU,而另一个线程将开始运行。

【讨论】:

  • “另一个线程将开始运行” 至少是暂时的,但不能保证在调度程序切换回父线程之前另一个线程会完成任何事情。
  • 调用 sched_yield() 之后的指令应该是 waitpid(childpid, &status) 然后父进程会坐下来等到子进程退出后再继续执行。
  • 我不能在这个中使用 sched_yield。我已经尝试过在 xv6 的 proc.c 中定义的 'yield()' 但它没有用。
猜你喜欢
  • 2017-11-19
  • 2017-06-01
  • 2017-09-04
  • 1970-01-01
  • 1970-01-01
  • 2015-12-20
  • 2017-06-20
  • 1970-01-01
  • 2014-09-25
相关资源
最近更新 更多