From d55631db693183e7f99d6ad39c313aa16338e2cc Mon Sep 17 00:00:00 2001 From: Tulio A M Mendes Date: Thu, 12 Feb 2026 01:13:13 -0300 Subject: [PATCH] =?utf8?q?feat:=20decay-based=20scheduler=20=E2=80=94=20pr?= =?utf8?q?iority=20decay=20on=20time=20slice=20exhaustion,=20boost=20on=20?= =?utf8?q?sleep=20wake?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- src/kernel/scheduler.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/kernel/scheduler.c b/src/kernel/scheduler.c index b23e80c..654f07d 100644 --- a/src/kernel/scheduler.c +++ b/src/kernel/scheduler.c @@ -743,8 +743,10 @@ void schedule(void) { struct process* prev = current_process; // Put prev back into expired runqueue if it's still runnable. + // Priority decay: penalize CPU-bound processes that exhaust their slice. if (prev->state == PROCESS_RUNNING) { prev->state = PROCESS_READY; + if (prev->priority < SCHED_NUM_PRIOS - 1) prev->priority++; rq_enqueue(rq_expired, prev); } @@ -846,6 +848,8 @@ void process_wake_check(uint32_t current_tick) { if (iter->state == PROCESS_SLEEPING) { if (current_tick >= iter->wake_at_tick) { iter->state = PROCESS_READY; + /* Priority boost: reward I/O-bound processes that sleep */ + if (iter->priority > 0) iter->priority--; rq_enqueue(rq_active, iter); } } -- 2.43.0