2011-11-04 16 views
13

Soy un principiante en el Kernel de Linux y estoy tratando de aprender cómo programa Linux los procesos.Linux CFS (Completely Fair Scheduler) latencia

He leído algunos libros sobre el Kernel de Linux y he revisado los enlaces de IBM http://www.ibm.com/developerworks/linux/library/l-cfs/ y todo, pero aún me quedan algunas dudas.

  1. ¿Cómo programa el programador todas las tareas dentro del tiempo sysctl_sched_latency?
  2. Cuando se despierta un proceso, ¿qué se hace realmente en la función place_entity?
  3. Cuando se despierta un proceso, ¿por qué se ajusta el vruntime restando de sched_latency? ¿No puede eso conducir a procesos en la cola de ejecución con grandes diferencias en el valor vruntime?

Respuesta

10

En primer lugar el tiempo de ejecución virtual de una tarea

  • en teoría es la que la tarea comenzaría su próximo segmento de tiempo de ejecución en un teóricamente perfecto CPU roscado múltiple.
  • en la práctica es su tiempo de ejecución real normalizado con respecto al número total de tareas en ejecución

1. ¿Cómo funciona el programa planificador de todas las tareas dentro del tiempo sysctl_sched_latency?

Mantiene un árbol ordenado en rojo y negro, donde todas las tareas ejecutables son ordenadas por su tiempo de ejecución virtual. Los nodos de la izquierda se han ejecutado durante el menor tiempo posible. CFS elige la tarea más a la izquierda y la ejecuta, hasta que la tarea programa o el programador marca y luego el tiempo de CPU que pasó corriendo se agrega a su tiempo de ejecución virtual. Cuando ya no es el nodo más a la izquierda, se ejecuta una nueva tarea con la virtualización más corta y se elimina la tarea anterior.

2. Cuando se despierta un proceso, ¿qué se hace realmente en la función place_entity?

versión corta:

Cuando un proceso se despierta la función place_entity bien deja tiempo de ejecución virtual de la de tarea, ya que era o lo aumenta.

Versión larga:

Cuando un proceso se despierta la función place_entity hace lo siguiente

  1. Inicia el tiempo de ejecución virtual temporal a tiempo de ejecución virtual de la cola de ejecución del CFS de la tarea más pequeña.

  2. Como duerme menos que una sola latencia no cuenta, inicializa una variable de umbral para sysctl_sched_latency. Si la característica GENTLE_FAIR_SLEEPERS está habilitada, , entonces la mitad del valor de esta variable. Disminuya el tiempo de ejecución virtual temporal inicializado previamente mediante este valor de umbral.

  3. Asegúrese de que el tiempo de ejecución virtual temporal sea al menos igual al tiempo de ejecución virtual de la tarea, estableciendo el tiempo de ejecución virtual calculado al máximo de sí mismo y del tiempo de ejecución virtual de la tarea.

  4. Establezca el tiempo de ejecución virtual de la tarea en el tiempo de ejecución temporal.

3. Cuando un proceso se despierta ¿Por qué el vruntime ajustarse restando de sched_latency?

El tiempo de ejecución virtual se reduce porque no duerme menos que una sola latencia. Por ejemplo, la tarea no debe tener su posición modificada en el árbol rojo negro cambiado si solo ha dormido para una sola latencia del programador.

4. ¿No puede eso conducir a procesos en la cola de ejecución con grandes diferencias en el valor de vruntime?

Creo que la lógica descrita en el Paso 3 de la Pregunta 2 evita o al menos minimiza eso.

Referencias

sched.c Linux Kernel Source

sched_fair.c Linux Kernel Source

Notes on the CFS Scheduler Design

+0

respuesta a la pregunta 1 en realidad no responder sobre el SFC programación dentro de 'sysctl_sched_latency'. – kavadias