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



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

// Force process to give up CPU on clock tick.
// If interrupts were on while locks held, would need to check nlock.
if(myproc() && myproc() -> state == RUNNING && tf -> trapno == T_IRQ0 + IRQ_TIMER)
yield();

我猜时间是在T_IRQ0 + IRQ_TIMER中指定的,但我无法弄清楚如何修改这两个,这两个是在trap.h中指定的:

#define T_IRQ0          32      // IRQ 0 corresponds to int T_IRQ
#define IRQ_TIMER        0

我想知道如何更改默认的 RR 调度时间片(现在是 1 个时钟周期,杉木示例使其成为 10 个时钟周期(?

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

为此,您可以在struct proc中添加一些extra_slicecurrent_slice,并通过以下方式修改 TIMER 陷阱处理程序:

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();
}

然后,您只需创建一个系统调用来设置extra_slice并修改scheduler函数以将current_slice重置为在进程唤醒时extra_slice

// 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

您可以读取lapic.c文件:

lapicinit(void) 
{
....
// The timer repeatedly counts down at bus frequency
// from lapic[TICR] and then issues an interrupt.
// If xv6 cared more about precise timekeeping,
// TICR would be calibrated using an external time source.
lapicw(TDCR, X1);
lapicw(TIMER, PERIODIC | (T_IRQ0 + IRQ_TIMER));
lapicw(TICR, 10000000);

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

lapicw(TICR, 10000000); //10 000 000

可以成为

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

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

最新更新