Operating system 如何在XV6中修改进程抢占策略(如RR时间片)?

Operating system 如何在XV6中修改进程抢占策略(如RR时间片)?,operating-system,xv6,preemption,Operating System,Xv6,Preemption,现在,似乎在每次点击时,正在运行的进程都会被抢占,并被迫产生处理器,我已经彻底调查了代码库,代码中唯一与抢占相关的部分如下所示。c: 我猜定时是在T_IRQ0+IRQ_TIMER中指定的,但我不知道如何修改这两个,这两个是在trap.h中指定的: 我想知道如何更改默认的RR调度时间片,即现在的1个时钟周期,例如10个时钟周期?您可以读取lapic.c文件: 因此,如果希望定时器中断间隔更大,请更改TICR值: 可以成为 lapicw(TICR, 100000000); //100 000

现在,似乎在每次点击时,正在运行的进程都会被抢占,并被迫产生处理器,我已经彻底调查了代码库,代码中唯一与抢占相关的部分如下所示。c:

我猜定时是在T_IRQ0+IRQ_TIMER中指定的,但我不知道如何修改这两个,这两个是在trap.h中指定的:

我想知道如何更改默认的RR调度时间片,即现在的1个时钟周期,例如10个时钟周期?

您可以读取lapic.c文件:

因此,如果希望定时器中断间隔更大,请更改TICR值:

可以成为

    lapicw(TICR, 100000000); //100 000 000
警告,TICR引用32位无符号计数器,请勿超过4294967295 0xFFFFFFFF

您可以读取lapic.c文件:

因此,如果希望定时器中断间隔更大,请更改TICR值:

可以成为

    lapicw(TICR, 100000000); //100 000 000

警告,TICR引用32位无符号计数器,请勿超过4 294 967 295 0xFFFFFFFF

如果您希望一个进程比其他进程执行更多的时间,您可以允许它执行更多的时间片,*而无需更改时间片持续时间

为此,您可以在struct proc中添加一些额外的\u片和当前的\u片,并通过以下方式修改计时器陷阱处理程序:

if(myproc() && myproc()->state == RUNNING &&
  tf->trapno == T_IRQ0+IRQ_TIMER)
  {
    int current = myproc()->current_slice;
    if ( current ) 
      myproc()->current_slice = current - 1;
    else 
      yield();
  }
然后,您只需创建一个系统调用来设置额外的_片,并修改调度程序函数,以便在进程唤醒时将当前的_片重置为额外的_片:

// Switch to chosen process.  It is the process's job
// to release ptable.lock and then reacquire it
// before jumping back to us.
c->proc = p;
switchuvm(p);
p->state = RUNNING;
p->current_slice = p->extra_slice

如果您希望一个进程比其他进程执行更多的时间,您可以允许它有更多的时间片,*而无需`更改时间片持续时间'

为此,您可以在struct proc中添加一些额外的\u片和当前的\u片,并通过以下方式修改计时器陷阱处理程序:

if(myproc() && myproc()->state == RUNNING &&
  tf->trapno == T_IRQ0+IRQ_TIMER)
  {
    int current = myproc()->current_slice;
    if ( current ) 
      myproc()->current_slice = current - 1;
    else 
      yield();
  }
然后,您只需创建一个系统调用来设置额外的_片,并修改调度程序函数,以便在进程唤醒时将当前的_片重置为额外的_片:

// Switch to chosen process.  It is the process's job
// to release ptable.lock and then reacquire it
// before jumping back to us.
c->proc = p;
switchuvm(p);
p->state = RUNNING;
p->current_slice = p->extra_slice

我可以在运行时用一个系统调用来更改这个时间片吗@Mathieu@mahdi:10000是一个无量纲的数字,时间将取决于公交车频率。例如,如果您的总线为1Mhz,其周期将为1us 1微秒,因此您的时间片将为1us*10000 000=10000 000 us=10seconds@mahdilapic的寄存器TICR控制时间片的持续时间,你可以通过镜像创建一个系统调用来动态修改它,但我不确定它是否受支持……例如,我可以在运行时使用系统调用更改此时间片吗@Mathieu@mahdi:10000是一个无量纲的数字,时间将取决于公交车频率。例如,如果您的总线为1Mhz,其周期将为1us 1微秒,因此您的时间片将为1us*10000 000=10000 000 us=10seconds@mahdilapic的寄存器TICR控制时间片的持续时间,您可以通过镜像创建一个系统调用来动态修改它,但我不确定它是否受支持。。。
// Switch to chosen process.  It is the process's job
// to release ptable.lock and then reacquire it
// before jumping back to us.
c->proc = p;
switchuvm(p);
p->state = RUNNING;
p->current_slice = p->extra_slice