主要内容:掌握ChChor的内核调度策略与实现。
调度相关的数据结构
thread_ctx
线程是调度的基本单元,因此thread_ctx中保存有调度相关的运行上下文、调度上下文、运行状态等信息。
- budget:rr调度器中的时间片
sched_ops
调度器的ops是一组抽象接口,不同的调度器都使用这一组接口
thread_state
调度器初始化
1 | void main(void *addr) |
idle线程初始化
1 | int sched_init(struct sched_ops *sched_ops) |
1 | int rr_sched_init(void) |
- 初始化全局变量
- 为每一个核创建idle线程,并加到RQ
- 创建idle线程的上下文,主要是创建kernel stack
- 初始化idle线程的上下文
线程调度
rr_sched
挑选一个thread来执行
1 | int rr_sched(void) |
rr_sched_enqueue
一个线程切出,重新放到RQ即可。这里涉及到了亲和性的概念,也就是线程是否要执行在哪个cpu执行。
1 | int rr_sched_enqueue(struct thread *thread) |
rr_sched_choose_thread
选择一个线程来执行,从RQ队首出队即可。
1 | struct thread *rr_sched_choose_thread(void) |
rr_sched_dequeue
1 | int rr_sched_dequeue(struct thread *thread) |
switch_to_thread
1 | int switch_to_thread(struct thread *target) |
switch_context
1 | u64 switch_context(void) |
切换上下文就是把vmspace切换到目标现成的地址空间,然后返回目标线程的上下文。
最后由eret_to_thread
完成处理器上下文切换。
rr_sched_handle_timer_irq
时间片减一。
1 | void rr_sched_handle_timer_irq(void) |
rr调度器使用一个定时器来做时间片的更新,在定时器终端中budget减1,然后执行调度,决定是否要切换到新的线程来执行。