2012-02-21 39 views
18

Esta mañana he leído sobre la programación en tiempo real de Linux. Según el libro 'Programación del sistema Linux por Robert Love', hay dos horarios principales allí. Uno es SCHED_FIFO, fifo y el segundo es SCHED_RR, el round robin. Y entendí cómo funciona un algoritmo fifo y arr. Pero como tenemos la llamada al sistema,programación en tiempo real en Linux

sched_setscheduler (pid_t pid, int policy, const struct sched_parem *sp) 

podemos establecer explícitamente la política de programación para nuestro proceso. Entonces, en algún caso, dos procesos que se ejecutan por root pueden tener una política de programación diferente. Como un proceso que tiene SCHED_FIFO y otro tiene SCHED_RR y con la misma prioridad. En ese caso, ¿qué proceso se seleccionará primero? el proceso clasificado FIFO o el proceso clasificado RR? ¿Por qué?

Considere este caso. Hay tres procesos A, B, C. Todos tienen la misma prioridad. A y B son procesos clasificados RR y C es FIFO clase uno. A y B son ejecutables (por lo tanto, ambos se ejecutan alternativamente en algún intervalo de tiempo). Y actualmente A se está ejecutando. Ahora C se vuelve ejecutable. En este caso, si

1. A will preempt for C, or 
2. A will run until its timeslice goes zero and let C run. Or 
3. A will run until its timeslice goes zero and let B run. 
    a) here after B runs till its timeslice becomes zero and let C run or 
    b) after B runs till its timeslice becomes zero and let A run again (then C will starve untill A and B finishes) 
+5

Nota: desde la versión 3.14 , existe una política adicional llamada SCHED_DEADLINE (http://en.wikipedia.org/wiki/SCHED_DEADLINE) .Esta política implementa el algoritmo de programación First Deadline First (EDF). A cada tarea bajo esta política se le asigna una fecha límite, y la fecha más temprana -se ejecuta la tarea. – Claudio

Respuesta

8

man sched_setscheduler explica estas políticas de planificación en detalle.

En este caso particular porque los dos procesos en tiempo real tienen la misma prioridad, ninguno de ellos prevalecerá sobre el otro. Un proceso SCHED_FIFO se ejecuta hasta que se bloquea a sí mismo, el proceso SCHED_RR se ejecuta hasta que se bloquea o expira su tiempo cuántico.

1

Mi comprensión de las dos clases diferentes es que un proceso SCHED_FIFO nunca es reemplazado por el kernel. Incluso si otro proceso de clase "SCHED_FIFO" está esperando su turno ...

Si bien la política SCHED_RR comparte los recursos de la CPU un poco más. El programador permitirá que el proceso SCHED_RR se ejecute durante un período de tiempo, luego lo anticipa solo para permitir que pase otro proceso SCHED_RR. Eso es exactamente Round Robin.

SCHED_FIFO es "más fuerte" en el sentido de que si un proceso SCHED_FIFO nunca se dió() para el kernel o invocar una llamada al sistema en un dispositivo de un solo núcleo , entonces todos sus otros procesos en tiempo real no se puede ejecutar.

+1

"El programador permitirá que el proceso SCHED_RR se ejecute durante un período de tiempo, luego lo preautoriza solo para dejar pasar otro proceso SCHED_RR." no es correcto. Puede ser cualquier proceso de clase de programación (con el misma prioridad) que sucede a un proceso 'SCHED_RR' –

+2

Esto no es exacto. RT p los procesos tienen prioridades, y un proceso SCHED_FIFO de prioridad más baja _se preevaluará para ejecutar un proceso de mayor prioridad. – cha0site

13

En la programación en tiempo real, FIFO y RR no tienen exactamente el mismo significado que tienen en la programación no en tiempo real. Los procesos siempre se seleccionan de forma FIFO, sin embargo, el tiempo cuántico para SCHED_FIFO no está limitado a diferencia del tiempo de SCHED_RR.

Los procesos SCHED_FIFO no preceden a los procesos SCHED_RR con la misma prioridad.

sched_setscheduler (2) - página de manual de Linux

...

"política de planificación de un proceso determina donde será insertado en la lista de procesos con igual prioridad estática y cómo se va a mover dentro de este lista. Toda programación es preventiva: si un proceso con una prioridad estática más alta está lista para ejecutarse, el proceso que se está ejecutando será reemplazado y devuelto a la lista de espera para su nivel de prioridad estática. La política de programación solo determina el orden dentro de la lista de procesos ejecutables con la misma prioridad estática ".

...

"Un proceso SCHED_FIFO decir, hasta que es bloqueado por una solicitud de E/S, hasta que sea apropiado por un proceso de mayor prioridad, o que llama sched_yield (2)."

...

"Cuando un proceso SCHED_FIFO puede ejecutarse, se insertará al final de la lista para su prioridad"

...

" SCHED_RR:. Ronda Robin programación

SCHED_RR es una mejora simple de SCHED_FIFO. Todo lo descrito anteriormente para SCHED_FIFO también se aplica a SCHED_RR, excepto que cada proceso solo puede ejecutarse durante un tiempo cuántico máximo. Si se ha estado ejecutando un proceso SCHED_RR durante un período de tiempo igual o superior al cuántico de tiempo, se colocará al final de la lista para su prioridad. Un proceso SCHED_RR que ha sido reemplazado por un proceso de prioridad más alta y posteriormente reanuda la ejecución como un proceso en ejecución completará la porción no expirada de su tiempo de turno rotativo "

+1

Entonces quiere decir, todos los procesos que tienen la misma prioridad se colocarán en la misma cola. Entre ellos, el proceso de clasificación FIFO se ejecutará hasta que finalice o bloquee, pero el proceso de clasificación de RR se ejecutará solo para su ciclo de tiempo. ¿Estoy en lo correcto? – theB

+0

Sí, así es como he entendido la página de manual. Es lo mismo que otros sistemas en tiempo real definen FIFO y RR (por ejemplo, MQX RTOS de Freescale) – svenfx

+0

@theB Me refiero a su nueva respuesta aquí, porque de alguna manera no puedo agregar un comentario. Usted dice que la discusión anterior era incorrecta con respecto al libro de Robert Love 'Programación de sistema Linux'. Y tiene razón, como dice Robert, "los procesos de prioridad más alta (y los procesos SCHED_FIFO de igual o mayor prioridad) siempre anticiparán un proceso SCHED_RR en ejecución, independientemente de si tiene alguna de sus horas de espera ". (página 196). – svenfx

1

De acuerdo con la página man, creo que 1 es la respuesta. A, B son políticas RR, C es una política FIFO. Como RR también es una FIFO de mejora, todas ellas son de tipo FIFO.

Dado que todas tienen la misma prioridad, y la página man dice "Una llamada a sched_setscheduler () o sched_setparam (2) pondrán el proceso SCHED_FIFO (o SCHED_RR) identificado por pid al inicio de la lista si fue ejecutable. Como consecuencia, puede adelantarse al proceso en ejecución si tiene la misma prioridad. (POSIX.1-2001 especifica que el proceso debe ir al final de la lista.)"

Una vez llamando sched_setscheduler para establecer la política de C como FIFO, C tendrá prioridad A.

Cuestiones relacionadas