提交 5aaaa6b1 创建 作者: Frans Kaashoek's avatar Frans Kaashoek

Make sleep use condvar

Processor affinity Steal a proces only after it has ran for MTHRESH cycles
上级 40ba7672
...@@ -174,6 +174,7 @@ UPROGS=\ ...@@ -174,6 +174,7 @@ UPROGS=\
_zombie\ _zombie\
_halt\ _halt\
_thrtest\ _thrtest\
_sleep\
fs.img: mkfs README $(UPROGS) fs.img: mkfs README $(UPROGS)
./mkfs fs.img README $(UPROGS) ./mkfs fs.img README $(UPROGS)
......
...@@ -154,6 +154,7 @@ void idtinit(void); ...@@ -154,6 +154,7 @@ void idtinit(void);
extern uint ticks; extern uint ticks;
void tvinit(void); void tvinit(void);
extern struct spinlock tickslock; extern struct spinlock tickslock;
extern struct condvar cv_ticks;
// uart.c // uart.c
void uartinit(void); void uartinit(void);
......
#define NPROC 64 // maximum number of processes #define NPROC 64 // maximum number of processes
#define KSTACKSIZE 4096 // size of per-process kernel stack #define KSTACKSIZE 4096 // size of per-process kernel stack
#define NCPU 8 // maximum number of CPUs #define NCPU 2 // maximum number of CPUs
#define NOFILE 16 // open files per process #define NOFILE 16 // open files per process
#define NFILE 100 // open files per system #define NFILE 100 // open files per system
#define NBUF 10 // size of disk block cache #define NBUF 10 // size of disk block cache
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#define NDEV 10 // maximum major device number #define NDEV 10 // maximum major device number
#define ROOTDEV 1 // device number of file system root disk #define ROOTDEV 1 // device number of file system root disk
#define USERTOP 0xA0000 // end of user address space #define USERTOP 0xA0000 // end of user address space
#define PHYSTOP 0x10000000 // use phys mem up to here as free pool #define PHYSTOP 0x1000000 // use phys mem up to here as free pool
#define MAXARG 32 // max exec arguments #define MAXARG 32 // max exec arguments
#define MAXNAME 16 // max string names #define MAXNAME 16 // max string names
#define MTHRESHOLD 1000000 // min cycles a proc executes on a core before allowed to be stolen
...@@ -61,6 +61,8 @@ allocproc(void) ...@@ -61,6 +61,8 @@ allocproc(void)
found: found:
p->state = EMBRYO; p->state = EMBRYO;
p->pid = ptable->nextpid++; p->pid = ptable->nextpid++;
p->cpuid = cpu->id;
p->curcycles = 0;
release(&ptable->lock); release(&ptable->lock);
// Allocate kernel stack if possible. // Allocate kernel stack if possible.
...@@ -103,10 +105,10 @@ addrun1(struct runq *rq, struct proc *p) ...@@ -103,10 +105,10 @@ addrun1(struct runq *rq, struct proc *p)
void void
addrun(struct proc *p) addrun(struct proc *p)
{ {
acquire(&runq->lock); acquire(&runqs[p->cpuid].lock);
// cprintf("%d: addrun %d\n", cpunum(), p->pid); // cprintf("%d: addrun %d\n", cpunum(), p->pid);
addrun1(runq, p); addrun1(&runqs[p->cpuid], p);
release(&runq->lock); release(&runqs[p->cpuid].lock);
} }
static void static void
...@@ -363,12 +365,17 @@ steal(void) ...@@ -363,12 +365,17 @@ steal(void)
STAILQ_FOREACH(p, &runqs[c].runq, run_next) { STAILQ_FOREACH(p, &runqs[c].runq, run_next) {
if (p->state != RUNNABLE) if (p->state != RUNNABLE)
panic("non-runnable proc on runq"); panic("non-runnable proc on runq");
if (p->curcycles > MTHRESHOLD) {
// cprintf("%d: steal %d from %d\n", cpunum(), p->pid, c);
delrun1(&runqs[c], p); cprintf("%d: steal %d (%d) from %d\n", cpunum(), p->pid, p->curcycles, c);
release(&runqs[c].lock);
addrun(p); delrun1(&runqs[c], p);
return; release(&runqs[c].lock);
p->curcycles = 0;
p->cpuid = cpu->id;
addrun(p);
return;
}
} }
release(&runqs[c].lock); release(&runqs[c].lock);
} }
...@@ -417,6 +424,7 @@ scheduler(void) ...@@ -417,6 +424,7 @@ scheduler(void)
proc = p; proc = p;
switchuvm(p); switchuvm(p);
p->state = RUNNING; p->state = RUNNING;
p->tsc = rdtsc();
mtrace_fcall_register(pid, 0, 0, mtrace_pause); mtrace_fcall_register(pid, 0, 0, mtrace_pause);
mtrace_fcall_register(proc->pid, 0, 0, mtrace_resume); mtrace_fcall_register(proc->pid, 0, 0, mtrace_resume);
...@@ -456,7 +464,7 @@ sched(void) ...@@ -456,7 +464,7 @@ sched(void)
if(readeflags()&FL_IF) if(readeflags()&FL_IF)
panic("sched interruptible"); panic("sched interruptible");
intena = cpu->intena; intena = cpu->intena;
proc->curcycles += rdtsc() - proc->tsc;
mtrace_fcall_register(proc->pid, 0, 0, mtrace_pause); mtrace_fcall_register(proc->pid, 0, 0, mtrace_pause);
mtrace_call_set(0, cpunum()); mtrace_call_set(0, cpunum());
swtch(&proc->context, cpu->scheduler); swtch(&proc->context, cpu->scheduler);
......
...@@ -69,6 +69,9 @@ struct proc { ...@@ -69,6 +69,9 @@ struct proc {
struct file *ofile[NOFILE]; // Open files struct file *ofile[NOFILE]; // Open files
struct inode *cwd; // Current directory struct inode *cwd; // Current directory
char name[16]; // Process name (debugging) char name[16]; // Process name (debugging)
unsigned long long tsc;
unsigned long long curcycles;
unsigned cpuid;
struct spinlock lock; struct spinlock lock;
STAILQ_ENTRY(proc) run_next; STAILQ_ENTRY(proc) run_next;
SLIST_HEAD(childlist, proc) childq; SLIST_HEAD(childlist, proc) childq;
......
#include "types.h"
#include "stat.h"
#include "user.h"
int
main(void)
{
int i;
for (i = 0; i < 10000000; i++) {
sleep(1);
}
}
...@@ -76,7 +76,7 @@ sys_sleep(void) ...@@ -76,7 +76,7 @@ sys_sleep(void)
release(&tickslock); release(&tickslock);
return -1; return -1;
} }
sleep(&ticks, &tickslock); cv_sleep(&cv_ticks, &tickslock);
} }
release(&tickslock); release(&tickslock);
return 0; return 0;
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
struct gatedesc idt[256]; struct gatedesc idt[256];
extern uint vectors[]; // in vectors.S: array of 256 entry pointers extern uint vectors[]; // in vectors.S: array of 256 entry pointers
struct spinlock tickslock; struct spinlock tickslock;
struct condvar cv_ticks;
uint ticks; uint ticks;
void void
...@@ -25,6 +26,7 @@ tvinit(void) ...@@ -25,6 +26,7 @@ tvinit(void)
SETGATE(idt[T_SYSCALL], 1, SEG_KCODE<<3, vectors[T_SYSCALL], DPL_USER); SETGATE(idt[T_SYSCALL], 1, SEG_KCODE<<3, vectors[T_SYSCALL], DPL_USER);
initlock(&tickslock, "time"); initlock(&tickslock, "time");
initcondvar(&cv_ticks, "time");
} }
void void
...@@ -52,7 +54,7 @@ trap(struct trapframe *tf) ...@@ -52,7 +54,7 @@ trap(struct trapframe *tf)
if(cpu->id == 0){ if(cpu->id == 0){
acquire(&tickslock); acquire(&tickslock);
ticks++; ticks++;
wakeup(&ticks); cv_wakeup(&cv_ticks);
release(&tickslock); release(&tickslock);
} }
lapiceoi(); lapiceoi();
......
...@@ -175,6 +175,13 @@ rcr3(void) ...@@ -175,6 +175,13 @@ rcr3(void)
return val; return val;
} }
static __inline__ unsigned long long rdtsc(void)
{
unsigned hi, lo;
__asm__ __volatile__ ("rdtsc" : "=a"(lo), "=d"(hi));
return ( (unsigned long long)lo)|( ((unsigned long long)hi)<<32 );
}
//PAGEBREAK: 36 //PAGEBREAK: 36
// Layout of the trap frame built on the stack by the // Layout of the trap frame built on the stack by the
// hardware and by trapasm.S, and passed to trap(). // hardware and by trapasm.S, and passed to trap().
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论