现在似乎每次点击时,正在运行的进程都会被抢占并强制产生处理器,我已经彻底调查了代码库,代码中唯一与处理抢占相关的部分如下(在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_slice
和current_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
(