本实验依赖实验1/2/3/4/5。请把你做的实验2/3/4/5的代码填入本实验中代码中有“LAB1”/“LAB2”/“LAB3”/“LAB4”“LAB5”的注释相应部分。并确保编译通过。注意:为了能够正确执行lab6的测试应用程序,可能需对已完成的实验1/2/3/4/5的代码进行进一步改进。1
完成练习0后,建议大家比较一下(可用kdiff3等文件比较软件)个人完成的lab5和练习0完成后的刚修改的lab6之间的区别,分析了解lab6采用RR调度算法后的执行过程。执行make grade,大部分测试用例应该通过。但执行priority.c应该过不去。
问题
proc_tick(struct run_queue * rq, struct proc_struct * proc)用来在产生时钟中断时将proc的时间片减少,并对其进行判断是否需要调度。
ucore的调度过程
当线程因为wait、exit、sleep或者是时间片用完时,需要尽心调度,ucore通过schedule()函数进行调度,在这个函数中,当需要进行线程的切换时,他会先将当前的线程通过sched_class_enqueue()函数入队列,然后通过sched_class_pick_next()函数选择下一个要执行的线程并将其从队列中删除。
请在实验报告中简要说明如何设计实现”多级反馈队列调度算法“,给出概要设计,鼓励给出详细设计
- 进程在进入待调度的队列等待时,首先进入优先级最高的Q1等待。
首先需要换掉RR调度器的实现,即用default_sched_stride_c覆盖default_sched.c。然后根据此文件和后续文档对Stride度器的相关描述,完成Stride调度算法的实现。
实现过程
- 分为了使用skew_heap和list两种方式
- enqueue()
- 对于skew_heap,直接使用已经封装好的函数skew_heap_insert(),proc通过stride_proc_comp_f的比较方式插入到skew_heap中。
- 对于list,则是通过list_add_before()函数直接将proc插入到rq队列之中。
- dequeue()
- 对于skew_heap,直接使用已经封装好的函数skew_heap_remove()函数将proc从skew_heap中移走。
- 对于list,直接使用list_del_init()函数将proc从list中移除。
- pick_next()
- 对于skew_heap,其根节点即rq -> lab6_run_pool即为stride最小的节点,选择它即可,然后update选出的proc的stride。
- 对于list,则需要遍历一遍,从中找出stride最小的proc,并更新它的stride。
- proc_tick()函数
- 每次调用时,将proc->time_slice减一,如果proc->time_slice减为了0, 则说明需要进行调度,此时将proc->need_resched置一。