2012-05-16 6 views
9

Stiamo usando la versione 2.4-20 del kernel e dobbiamo contare il numero di utenti attivi, in modalità kernel. L'obiettivo è cambiare lo schedulatore, quindi siamo in sched.c, modificando la funzione schedule().come contare il numero di utenti attivi nel kernel

Quello che facciamo è contare gli utenti nella macro list_for_each.

list_for_each(tmp, &runqueue_head) { 
    p = list_entry(tmp, struct task_struct, run_list); 
    if (can_schedule(p, this_cpu)) { 
     if (unique(p->uid)) add_new_user(p->uid); 
     int weight = goodness(p, this_cpu, prev->active_mm); 
     if (weight > c) 
      c = weight, next = p; 
    } 
} 

che è fondamentalmente l'aggiunta di utenti unici a un elenco. Tuttavia, otteniamo risultati casuali. C'è un modo concreto per risolvere questo problema?

Grazie.

+4

Cosa intendi per "risultati casuali"? – ArjunShankar

+0

All'inizio abbiamo contato gli utenti con la funzione bontà(), con numeri assolutamente arbitrari (anche se avevamo 4 utenti in esecuzione contemporaneamente, potremmo ottenere 1 utente come risultato). in sched(), sembra che abbiamo valori coerenti ma non siamo sicuri, dal momento che sched() viene eseguito così frequentemente, abbiamo bisogno di prendere campioni (una volta ogni 5000 giri). Immagino che non ci sia un campo nel kernel che contiene gli attuali utenti attivi? se non c'è, qual è il modo migliore per contarli? Grazie per la risposta. –

+0

Grazie per il chiarimento. Non conosco la risposta a questo. La mia intenzione era di sottolineare che la domanda non era del tutto chiara. Suggerirei di modificarlo nella domanda. In bocca al lupo! – ArjunShankar

risposta

1

Si consiglia di provare a contare gli utenti all'interno della macro for_each_task. Ciò si traduce nel conteggio degli utenti che hanno un'attività bloccata a causa di I/O o per altri motivi. Ciò dovrebbe fornire risultati migliori in quanto non è possibile garantire la possibilità di contare gli utenti che eseguono processi interattivi se si utilizza la coda di esecuzione.

+0

questo ha senso. ma abbiamo prima contato gli utenti in funzione di bontà, che potrebbe essere la causa di risultati casuali. Però non ho una spiegazione per questo. Per qualche motivo, for_each_task nella funzione di pianificazione funziona. Grazie! –

0

Questo lavoro dovrebbe funzionare? chi | awk '{print $ 1}' | sort -ud

+0

puoi quindi prendere il conteggio. – Keshi

+0

Sono nel kernel, non posso usare chiamate di sistema né programmi terminali. –