In this exercise you will design the context switch mechanism for a user-level threading system, and then implement it. To get you started, your xv6 has two files user/uthread.c and user/uthread_switch.S, and a rule in the Makefile to build a uthread program. uthread.c contains most of a user-level threading package, and code for three simple test threads. The threading package is missing some of the code to create a thread and to switch between threads.
您的工作是制定一个计划来创建线程并保存/恢复寄存器以在线程之间切换,并实施该计划。当你完成后, make grade 应该说你的解决方案通过了 uthread 测试。
ra 是 caller-saved,无需特殊处理,在调用前会自动更新 ra:auipc ra,0x0
仅需要保存/恢复被调用者保存寄存器,以及ra——用于调度
增加一个结构体 ucontext,保存callee-saved寄存器与ra
创建用户线程时需要初始化 state、上下文中的 ra、sp 等等
sp 需要这样初始化,得加个SIZE:
使用细粒度的锁
可以避免某些锁争用:以 bucket 为单位
使用了:
要求:必须等待指定数量的线程调用 barrier,才可唤醒所有线程继续工作;同时,会进行多轮的 barrier 调用,每一轮完成时需要更新轮次
我们在此时进入下一轮
最后的代码像这样: