2012-05-16 13 views
9

Używamy wersji jądra 2.4-20 i musimy policzyć liczbę aktywnych użytkowników, w trybie jądra. Celem jest zmiana programu planującego, więc jesteśmy w sched.c, modyfikując funkcję harmonogramu().jak liczyć liczbę aktywnych użytkowników w jądrze

Co możemy zrobić, to policzyć użytkowników w makrze 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; 
    } 
} 

który jest w zasadzie dodawania unikalnych użytkowników na liście. Dostajemy jednak losowe wyniki. Czy istnieje konkretny sposób rozwiązania tego problemu?

Dziękuję.

+4

Co masz na myśli przez "przypadkowe wyniki"? – ArjunShankar

+0

Początkowo policzyliśmy użytkowników w funkcji dobroci(), tam mieliśmy absolutnie dowolne liczby (mimo, że mieliśmy 4 użytkowników działających w tym samym czasie, możemy uzyskać 1 użytkownika jako wynik). w sched(), wydaje się, że mamy stałe wartości, ale nie jesteśmy pewni, ponieważ sched() jest uruchamiany tak często, musimy pobrać próbki (raz na 5000 obrotów). Domyślam się, że w jądrze nie ma pola, które zawiera aktualnych aktywnych użytkowników? jeśli nie, jaki jest najlepszy sposób ich policzenia? Dzięki za twoją odpowiedź. –

+0

Dzięki za wyjaśnienie. Nie znam odpowiedzi na to. Moim zamiarem było zwrócenie uwagi, że pytanie nie było całkowicie jasne. Sugerowałbym, żeby to zmienić w pytanie. Powodzenia! – ArjunShankar

Odpowiedz

1

Możesz spróbować zliczać użytkowników wewnątrz makra for_each_task. Powoduje to zliczanie użytkowników, którzy mają zadanie zablokowane z powodu operacji we/wy lub z dowolnego innego powodu. Powinno to zapewnić lepsze wyniki, ponieważ nie można zagwarantować możliwości liczenia użytkowników, którzy uruchamiają procesy interaktywne, jeśli używa się kolejki uruchamiania.

+0

ma to sens. ale najpierw policzyliśmy użytkowników w funkcji dobroci, co może być przyczyną przypadkowych wyników. Nie mam na to żadnego wytłumaczenia. Z jakiegoś powodu działa funkcja for_each_task w funkcji harmonogramu. Dzięki! –

0

Czy to działa? kto | awk "{print $ 1}" sort -ud

+0

możesz wtedy wziąć liczbę. – Keshi

+0

Jestem w jądrze, nie mogę używać wywołań systemowych ani programów terminalowych. –

Powiązane problemy