XV6- 循环调度器

Posted

技术标签:

【中文标题】XV6- 循环调度器【英文标题】:XV6- scheduler for loop 【发布时间】:2014-05-23 16:28:53 【问题描述】:

我正在我的 xv6 中实现一个新的调度程序,为此我需要了解它是如何工作的 1st,我面临一个有线问题,我无法真正理解 for 循环循环如何抛出进程

这是原始代码:

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->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->state = RUNNING;
  swtch(&cpu->scheduler, proc->context);
  switchkvm();

  // Process is done running for now.
  // It should have changed its p->state before coming back.
  proc = 0;

release(&ptable.lock);

 


所以我尝试了一个简单的事情,我做了 for 循环,第一个应该循环抛出所有 proc 并计算它们而不做任何其他事情,第二个应该循环并像原来的那样运行它们,事情是它没有像我预期的那样工作,发生的事情是它从第一个 for 循环开始运行一个循环,然后从第二个循环运行一个循环,依此类推

void
scheduler(void)

struct proc *p;
int FirstCounter=0;
int SecCounter=0;
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->state != RUNNABLE)
      continue;
    counter++;
    cprintf("1st counter  = %d\n",FirstCounter); 

    for(p = ptable.proc; p < &ptable.proc[NPROC]; p++)
      if(p->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->state = RUNNING;
        swtch(&cpu->scheduler, proc->context);
        switchkvm();



        // Process is done running for now.
        // It should have changed its p->state before coming back.
        proc = 0;
        cprintf("2nd counter  = %d\n",SecCounter); 
    


release(&ptable.lock);


输出是这样的,

.
.
.
1st counter  = 14
2nd counter  = 15
1st counter  = 15
2nd counter  = 16
.
.

为什么会这样?

【问题讨论】:

这不可能是代码。 FirstCounter、SecCounter、计数器?! 【参考方案1】:

我试过了,得到了同样的结果。

但是,当你打印进程的pid时,你会发现pid = 1 and pid = 2,我认为它们是init和page daemon进程。

我不知道初始化进程和页面守护进程的打印。但是,当你尝试fork()new 进程时,你会得到如你所想的打印结果。

【讨论】:

以上是关于XV6- 循环调度器的主要内容,如果未能解决你的问题,请参考以下文章

XV6调度

复杂的时间调度器

复杂的时间调度器

[QNX 自适应分区用户指南]8 自适应分区线程调度器和其他线程调度器

xv6/调度算法及并发程序设计

线程组-调度器配置