2012-05-16 17 views
9

Estamos usando kernel versión 2.4-20 y necesitamos contar la cantidad de usuarios activos, en modo kernel. El objetivo es cambiar el programador, por lo que estamos en sched.c, modificando la función schedule().cómo contar el número de usuarios activos en kernel

Lo que hacemos es contar los usuarios en la 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; 
    } 
} 

que básicamente está agregando usuarios únicos a una lista. Sin embargo, obtenemos resultados aleatorios. ¿Hay alguna manera concreta de resolver este problema?

Gracias.

+4

¿Qué quiere decir con 'resultados aleatorios'? – ArjunShankar

+0

Al principio contamos usuarios en la función de bondad(), allí teníamos números absolutamente arbitrarios (aunque teníamos 4 usuarios corriendo al mismo tiempo, podríamos obtener 1 usuario como resultado). en sched(), parece que tenemos valores consistentes pero no estamos seguros, ya que sched() se ejecuta con tanta frecuencia, necesitamos tomar muestras (una vez en 5000 turnos). Supongo que no hay ningún campo en kernel que tenga usuarios activos actualmente? si no lo hay, ¿cuál es la mejor manera de contarlos? Gracias por su respuesta. –

+0

Gracias por aclarar. No sé la respuesta a esto. Mi intención era señalar que la pregunta no era del todo clara. Sugeriría editar esto en la pregunta. ¡Buena suerte! – ArjunShankar

Respuesta

1

Es posible que desee intentar contar los usuarios dentro de la macro for_each_task. Esto da como resultado contar a los usuarios que tienen una tarea que está bloqueada debido a E/S o por cualquier otro motivo. Esto debería proporcionar mejores resultados, ya que no puede garantizar que pueda contar los usuarios que ejecutan procesos interactivos si usa la cola de ejecución.

+0

que tiene sentido. pero primero contabilizamos usuarios en función de bondad, que podrían ser la causa de resultados aleatorios. Aunque no tengo una explicación para eso. Por algún motivo, funciona for_each_task in schedule. ¡Gracias! –

0

¿Funcionaría? quien | awk '{print $ 1}' | ordenar -ud

+0

puede tomar el conteo. – Keshi

+0

Estoy en kernel, no puedo usar llamadas al sistema ni programas de terminal. –

Cuestiones relacionadas