MIT xv6 2020系列实验:Lab7 thread
这次实验的内容比较杂,但是简单。
任务一:Uthread:switching(线程切换)
为thread添加context来保存寄存器上下文:
struct context {
uint64 ra;
uint64 sp;
// callee-saved
uint64 s0;
uint64 s1;
uint64 s2;
uint64 s3;
uint64 s4;
uint64 s5;
uint64 s6;
uint64 s7;
uint64 s8;
uint64 s9;
uint64 s10;
uint64 s11;
};
struct thread {
char stack[STACK_SIZE]; /* the thread's stack */
int state; /* FREE, RUNNING, RUNNABLE */
struct context context;
};
thread_create如下,为ra分配调用地址,为sp分配旧栈指针。
void
thread_create(void (*func)())
{
struct thread *t;
for (t = all_thread; t < all_thread + MAX_THREAD; t++) {
if (t->state == FREE) break;
}
t->state = RUNNABLE;
// YOUR CODE HERE
// user ra return func in switch
t->context.ra = (uint64)func;
// point to stack top(highest addr)
t->context.sp = (uint64)t->stack + STACK_SIZE;
}
在thread_schedule时进行上下文切换:
if (current_thread != next_thread) { /* switch threads? */
next_thread->state = RUNNING;
t = current_thread;
current_thread = next_thread;
/* YOUR CODE HERE
* Invoke thread_switch to switch from t to next_thread:
* thread_switch(??, ??);
*/
thread_switch((uint64)&t->context, (uint64)¤t_thread->context);
}
任务二:Using thread(cpp)
这部分是cpp的内容,比较简单,只需要在put操作中加锁就行。
任务三:Barrier(cpp)
所有线程需要在一个点上等待,与锁不同,这次用广播变量pthread_cond_broadcast可以一次性控制变量上的所有锁,相当于控制一个计数锁。
结束。