mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-10-29 05:38:21 +00:00
scheduler: continue work
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user