picard - programación en tiempo real en Linux
musicbrainz picard español (4)
Esta mañana leí 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 funcionan los algoritmos fifo y rr. Pero como tenemos la llamada al sistema,
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 que 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 uno clasificado FIFO. A y B son ejecutables (por lo tanto, ambos se ejecutan alternativamente en algún tiempo entre niveles). Y actualmente A se está ejecutando. Ahora C se convierte en 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)
En la programación en tiempo real, FIFO y RR no tienen exactamente el mismo significado que tienen en la programación en tiempo no real. Los procesos siempre se seleccionan de manera FIFO, sin embargo, el cuanto de tiempo para SCHED_FIFO no está limitado a diferencia del cuanto de tiempo para SCHED_RR.
Los procesos de SCHED_FIFO no se anticipan a los procesos de SCHED_RR de la misma prioridad.
sched_setscheduler (2) - Página de manual de Linux
...
"La política de programación de un proceso determina dónde se insertará en la lista de procesos con la misma prioridad estática y cómo se moverá dentro de esta lista. Toda la programación es preventiva: si un proceso con una prioridad estática más alta está listo para ejecutarse, la ejecución actual el proceso se anticipará y se devolverá 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 se ejecuta hasta que es bloqueado por una solicitud de E / S, es reemplazado por un proceso de mayor prioridad o llama a sched_yield (2)".
...
"Cuando un proceso SCHED_FIFO se convierte en ejecutable, se insertará al final de la lista por su prioridad".
...
"SCHED_RR: programación de Round Robin
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 máximo. Si un proceso SCHED_RR se ha estado ejecutando durante un período de tiempo igual o mayor que el cuanto de tiempo, se colocará al final de la lista para su prioridad. "Un proceso SCHED_RR que ha sido precedido por un proceso de mayor prioridad y, posteriormente, reanuda la ejecución como un proceso en ejecución completará la parte pendiente de su cantidad de tiempo de round robin".
Mi comprensión de las dos clases diferentes es que el kernel nunca anticipa un proceso SCHED_FIFO. Incluso si otro proceso de clase "SCHED_FIFO" está esperando su turno ...
Mientras que la política de SCHED_RR comparte los recursos de la CPU un poco más. El programador permitirá que el proceso de SCHED_RR se ejecute por un período de tiempo, y luego lo adelantará solo para permitir que gire otro proceso de SCHED_RR. Eso es exactamente Round Robin.
SCHED_FIFO es "más fuerte" en el sentido de que si un proceso SCHED_FIFO nunca cede () al kernel ni invoca una llamada al sistema en un solo dispositivo central , entonces es posible que nunca se ejecuten todos los demás procesos en tiempo real.
Según la página del manual, creo que 1 es la respuesta. A, B son políticas de RR, C es políticas FIFO. Dado que RR también es un FIFO de mejora, todos ellos son de clase FIFO.
Como todos ellos tienen la misma prioridad, y la página del manual dice "Una llamada a sched_setscheduler () o sched_setparam (2) colocará el proceso SCHED_FIFO (o SCHED_RR) identificado por pid al comienzo de la lista si era ejecutable. Por lo tanto, puede anticiparse al proceso que se está ejecutando actualmente si tiene la misma prioridad (POSIX.1-2001 especifica que el proceso debe ir al final de la lista).
Una vez que se llama a sched_setscheduler para establecer la política de C como FIFO, C se adelantará a A.
man sched_setscheduler
explica estas políticas de programación en detalle.
En este caso particular, porque los dos procesos en tiempo real tienen la misma prioridad, ninguno de ellos se adelantará al otro. Un proceso SCHED_FIFO
se ejecuta hasta que se bloquea a sí mismo, el proceso SCHED_RR
se ejecuta hasta que se bloquea a sí mismo o su fecha de caducidad.