From 6c990aa4affc8b67f29a55cc757811c2774a7234 Mon Sep 17 00:00:00 2001 From: Rene Gollent Date: Sun, 29 Mar 2009 17:08:10 +0000 Subject: [PATCH] Start tracking thread timeslice usage. Not actually used for any determinations just yet, but will be. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@29785 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../kernel/scheduler/scheduler_affine.cpp | 31 +++++++++++++++---- 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/src/system/kernel/scheduler/scheduler_affine.cpp b/src/system/kernel/scheduler/scheduler_affine.cpp index 4b917dd43d..bcf14f549d 100644 --- a/src/system/kernel/scheduler/scheduler_affine.cpp +++ b/src/system/kernel/scheduler/scheduler_affine.cpp @@ -40,19 +40,31 @@ static struct thread* sRunQueue[B_MAX_CPU_COUNT]; static struct thread* sIdleThreads; static cpu_mask_t sIdleCPUs = 0; +const int32 kMaxTrackingQuantums = 5; +const bigtime_t kMaxThreadQuantum = 3000; + struct scheduler_thread_data { scheduler_thread_data(void) { - init(); + Init(); } - void init() + + void Init() { memset(fLastThreadQuantums, 0, sizeof(fLastThreadQuantums)); fLastQuantumSlot = 0; } + + float GetAverageQuantumUsage() const + { + float quantumAverage = 0.0; + for (int32 i = 0; i < kMaxTrackingQuantums; i++) + quantumAverage += fLastThreadQuantums[i]; + return quantumAverage / kMaxTrackingQuantums; + } - int32 fLastThreadQuantums[5]; + int32 fLastThreadQuantums[kMaxTrackingQuantums]; int16 fLastQuantumSlot; }; @@ -424,9 +436,16 @@ affine_reschedule(void) // track CPU activity if (!thread_is_idle_thread(oldThread)) { - oldThread->cpu->active_time += + bigtime_t activeTime = (oldThread->kernel_time - oldThread->cpu->last_kernel_time) + (oldThread->user_time - oldThread->cpu->last_user_time); + oldThread->cpu->active_time += activeTime; + scheduler_thread_data *data = oldThread->scheduler_data; + data->fLastThreadQuantums[data->fLastQuantumSlot] = activeTime; + if (data->fLastQuantumSlot == kMaxTrackingQuantums - 1) + data->fLastQuantumSlot = 0; + else + data->fLastQuantumSlot++; } if (!thread_is_idle_thread(nextThread)) { @@ -435,7 +454,7 @@ affine_reschedule(void) } if (nextThread != oldThread || oldThread->cpu->preempted) { - bigtime_t quantum = 3000; // ToDo: calculate quantum! + bigtime_t quantum = kMaxThreadQuantum; // ToDo: calculate quantum! timer *quantumTimer = &oldThread->cpu->quantum_timer; if (!oldThread->cpu->preempted) @@ -469,7 +488,7 @@ affine_on_thread_create(struct thread* thread) static void affine_on_thread_init(struct thread* thread) { - ((scheduler_thread_data *)(thread->scheduler_data))->init(); + ((scheduler_thread_data *)(thread->scheduler_data))->Init(); }