本Lab比较简单,就是为xv6添加一个用户级的多线程功能,然后熟悉一下Linux下多线程编程。
笔者用时约2h
Uthread: switching between threads
这一部分的代码不涉及内核代码,所以也比较简单,根据提示修改user/uthread.c中的代码即可。仿照内核中进程转换函数swtch的实现即可。首先,添加一个context上下文结构体用于保存被调用者保存寄存器(从kernel/proc.h中复制过来就行啦)。
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;
};
并且为thread添加一个context字段
struct thread {
char stack[STACK_SIZE]; /* the thread's stack */
int state; /* FREE, RUNNING, RUNNABLE */
struct context context;
};
然后需要仿照swtch函数(定义在kernel/swtch.S中)实现一个thread_switch函数(定义在user/uthread_switch.S中),其实也就是复制过来就好啦
thread_switch:
/* YOUR CODE HERE */
sd ra, 0(a0)
sd sp, 8(a0)
sd s0, 16(a0)
sd s1, 24(a0)
sd s2, 32(a0)
sd s3, 40(a0)

本文介绍了如何在xv6中添加用户级多线程功能,包括线程上下文结构体的定义、线程切换函数thread_switch的实现以及线程创建和调度。此外,还讨论了并发put操作导致的键丢失问题,并提出了使用锁进行并发控制的解决方案,最后提到了使用屏障进行线程同步。
最低0.47元/天 解锁文章
608

被折叠的 条评论
为什么被折叠?



