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
This commit is contained in:
Rene Gollent
2009-03-29 17:08:10 +00:00
parent dc707c28aa
commit 6c990aa4af
@@ -40,19 +40,31 @@ static struct thread* sRunQueue[B_MAX_CPU_COUNT];
static struct thread* sIdleThreads; static struct thread* sIdleThreads;
static cpu_mask_t sIdleCPUs = 0; static cpu_mask_t sIdleCPUs = 0;
const int32 kMaxTrackingQuantums = 5;
const bigtime_t kMaxThreadQuantum = 3000;
struct scheduler_thread_data { struct scheduler_thread_data {
scheduler_thread_data(void) scheduler_thread_data(void)
{ {
init(); Init();
} }
void init()
void Init()
{ {
memset(fLastThreadQuantums, 0, sizeof(fLastThreadQuantums)); memset(fLastThreadQuantums, 0, sizeof(fLastThreadQuantums));
fLastQuantumSlot = 0; 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; int16 fLastQuantumSlot;
}; };
@@ -424,9 +436,16 @@ affine_reschedule(void)
// track CPU activity // track CPU activity
if (!thread_is_idle_thread(oldThread)) { if (!thread_is_idle_thread(oldThread)) {
oldThread->cpu->active_time += bigtime_t activeTime =
(oldThread->kernel_time - oldThread->cpu->last_kernel_time) (oldThread->kernel_time - oldThread->cpu->last_kernel_time)
+ (oldThread->user_time - oldThread->cpu->last_user_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)) { if (!thread_is_idle_thread(nextThread)) {
@@ -435,7 +454,7 @@ affine_reschedule(void)
} }
if (nextThread != oldThread || oldThread->cpu->preempted) { 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; timer *quantumTimer = &oldThread->cpu->quantum_timer;
if (!oldThread->cpu->preempted) if (!oldThread->cpu->preempted)
@@ -469,7 +488,7 @@ affine_on_thread_create(struct thread* thread)
static void static void
affine_on_thread_init(struct thread* thread) affine_on_thread_init(struct thread* thread)
{ {
((scheduler_thread_data *)(thread->scheduler_data))->init(); ((scheduler_thread_data *)(thread->scheduler_data))->Init();
} }