scheduler: continue work

This commit is contained in:
Matheus
2025-08-23 13:54:45 -03:00
parent 1787658989
commit 7a890ac41d
13 changed files with 197 additions and 33 deletions
+23
View File
@@ -3,6 +3,7 @@
#include <kernel/proc.h>
#include <kernel/thread.h>
#include <util.h>
#include <bitmap.h>
#define SCHED_WAKEUP_REASON_NORMAL 0
@@ -13,8 +14,10 @@
#define SCHED_RUN_QUEUE_SIZE 32
#define SCHED_MAX_INTERACTIVITY 100
#define SCHED_INTERACTIVITY_LIMIT 30
#define SCHED_NICE_MAX 19
#define SCHED_NICE_MIN -20
#define SCHED_SLEEP_TIME_LIMIT_CPU_US 1000
typedef struct {
struct {
@@ -53,5 +56,25 @@ void sched_thread_wakeup_callback(thread_t *thread);
thread_t *sched_select_next_thread(void);
void sched_insert_in_cpu_queue(struct cpu_t *cpu, thread_t *thread);
void sched_preempt_cpu(struct cpu_t *cpu);
static inline int sched_thread_run_queue_index(int interactivity) {
return min(interactivity * SCHED_RUN_QUEUE_SIZE / SCHED_MAX_INTERACTIVITY, SCHED_RUN_QUEUE_SIZE - 1);
}
static inline bool sched_thread_can_run_in_cpu(thread_t *thread, int cpu_queue, int cpu_interactivity) {
int current_queue = 0;
if (thread->class == THREAD_CLASS_TIMESHARE && thread->metrics.interactivity_score > SCHED_INTERACTIVITY_LIMIT)
current_queue = 1;
else if (thread->class == THREAD_CLASS_IDLE)
current_queue = 2;
// if thread is timeshare, can only immediatelly run when cpu queue is running idle threads,
if (current_queue == 1)
return cpu_queue == 2;
// otherwise, realtime > idle and if a tie the index in the queue
return current_queue < cpu_queue || sched_thread_run_queue_index(thread->metrics.interactivity_score) < sched_thread_run_queue_index(cpu_interactivity);
}
#endif