diff --git a/lab4/.gdbinit b/lab4/.gdbinit index 52dd98f..6608d0e 100644 --- a/lab4/.gdbinit +++ b/lab4/.gdbinit @@ -13,4 +13,4 @@ define add-symbol-file-auto end add-symbol-file-auto ./build/kernel.img -add-symbol-file-auto ./user/build/ramdisk/yield_single.bin +add-symbol-file-auto ./user/build/ramdisk/yield_spin.bin diff --git a/lab4/kernel/exception/exception.c b/lab4/kernel/exception/exception.c index 932a151..be3af16 100644 --- a/lab4/kernel/exception/exception.c +++ b/lab4/kernel/exception/exception.c @@ -32,7 +32,7 @@ void exception_init_per_cpu(void) * Uncomment the timer_init() when you are handling preemptive * shceduling */ - // timer_init(); + timer_init(); /** * Lab3: Your code here diff --git a/lab4/kernel/exception/irq.c b/lab4/kernel/exception/irq.c index 9a71412..802037a 100644 --- a/lab4/kernel/exception/irq.c +++ b/lab4/kernel/exception/irq.c @@ -50,6 +50,8 @@ void handle_irq(int type) * Lab4 * Do you miss something? */ + sched(); + eret_to_thread(switch_context()); } void plat_handle_irq(void) diff --git a/lab4/kernel/sched/policy_rr.c b/lab4/kernel/sched/policy_rr.c index 5ef239d..a0658be 100644 --- a/lab4/kernel/sched/policy_rr.c +++ b/lab4/kernel/sched/policy_rr.c @@ -106,6 +106,7 @@ int rr_sched_dequeue(struct thread *thread) // 出队 list_del(&thread->ready_queue_node); thread->thread_ctx->state = TS_INTER; + thread->thread_ctx->sc->budget = DEFAULT_BUDGET; return 0; } @@ -164,11 +165,18 @@ int rr_sched(void) { struct thread *dest_thread; - // 若当前有运行进程,放入队列 - if (current_thread != NULL && current_thread->thread_ctx != NULL - && current_thread->thread_ctx->type != TYPE_IDLE) { - rr_sched_enqueue(current_thread); - kdebug("[RR] Cpu #%d yield thread %lx to queue\n", smp_get_cpu_id(), current_thread->thread_ctx); + // 若当前有运行进程 + if (current_thread != NULL && current_thread->thread_ctx != NULL) { + // 预算非 0 + if (current_thread->thread_ctx->sc->budget != 0) { + return 0; + } + + // 若非空闲线程,放入队列 + if (current_thread->thread_ctx->type != TYPE_IDLE) { + rr_sched_enqueue(current_thread); + kdebug("[RR] Cpu #%d yield thread %lx to queue\n", smp_get_cpu_id(), current_thread->thread_ctx); + } } // 选择新线程 @@ -221,6 +229,12 @@ int rr_sched_init(void) */ void rr_sched_handle_timer_irq(void) { + // 预算 + if (current_thread != NULL && current_thread->thread_ctx != NULL) { + if (current_thread->thread_ctx->sc->budget > 0) { + current_thread->thread_ctx->sc->budget--; + } + } } struct sched_ops rr = { diff --git a/lab4/kernel/sched/sched.c b/lab4/kernel/sched/sched.c index d09defa..582898e 100644 --- a/lab4/kernel/sched/sched.c +++ b/lab4/kernel/sched/sched.c @@ -140,6 +140,10 @@ u64 switch_context(void) */ void sys_yield(void) { + // 重置预算 + current_thread->thread_ctx->sc->budget = 0; + + // 调度 sched(); eret_to_thread(switch_context()); }