NOMBRE¶
sched_setscheduler, sched_getscheduler - establecen y obtienen los
algoritmos/parámetros de planificación
SINOPSIS¶
#include <sched.h>
int sched_setscheduler(pid_t pid, int policy,
const struct sched_param *p);
int sched_getscheduler(pid_t pid);
struct sched_param {
...
int sched_priority;
...
};
DESCRIPCIÓN¶
sched_setscheduler establece tanto la política de planificación
como los parámetros asociados para el proceso identificado por
pid. Si
pid es igual a cero, se establece el planificador del
proceso que hace la llamada. La interpretación del parámetro
p depende de la política seleccionada. Actualmente se admiten en
Linux las tres siguientes políticas:
SCHED_FIFO,
SCHED_RR,
y
SCHED_OTHER; sus respectivas semánticas se describen abajo.
sched_getscheduler pregunta por la política de planificación
aplicada actualmente al proceso identificado por
pid. Si
pid es
igual a cero, se obtiene la política del proceso que hace la llamada.
Políticas de Planificación¶
El planificador es la parte del núcleo que decide qué proceso
ejecutable será ejecutado por la CPU a continuación. El planificador
de Linux ofrece tres políticas de planificación diferentes, una para
los procesos normales y dos para aplicaciones en tiempo real. Se asigna a cada
proceso un valor de prioridad estática
sched_priority y este valor
sólo puede cambiarse a través de llamadas al sistema.
Conceptualmente, el planificador mantiene una lista de procesos ejecutables
para cada posible valor
sched_priority, y
sched_priority puede
tener un valor en el rango de 0 a 99. Para poder determinar qué proceso
se debe ejecutar a continuación, el planificador de Linux busca en la
lista no vacía con la prioridad estática más alta y toma el
proceso a la cabeza de dicha lista. La política de planificación
determina para cada proceso, dónde se insertará en la lista de
procesos con igual prioridad estática y cómo se moverá dentro
de esta lista.
SCHED_OTHER es el planificador de tiempo compartido universal
predeterminado empleado por la mayoría de los procesos;
SCHED_FIFO
y
SCHED_RR han sido pensados para aplicaciones especiales donde el
tiempo es crítico y necesitan un control preciso sobre la forma en la que
se seleccionan para ejecución los procesos ejecutables. A los procesos
planificados con
SCHED_OTHER se les debe asignar la prioridad
estática 0; los procesos planificados bajo
SCHED_FIFO o
SCHED_RR pueden tener una prioridad estática en el rango de 1 a
99. Solamente los procesos con privilegio de súper-usuario pueden obtener
una prioridad estática mayor que 0 y por tanto pueden ser planificados
bajo
SCHED_FIFO o
SCHED_RR. Las llamadas al sistema
sched_get_priority_min y
sched_get_priority_max pueden emplearse
para encontrar el rango válido de prioridad para una política de
planificación de una manera transportable en todos los sistemas que
cumplan POSIX.1b.
Toda la planificación es apropiativa: si un proceso con una prioridad
estática más alta está listo para ejecutarse, el proceso actual
será apropiado y devuelto a su lista de espera. La política de
planificación solamente determina la clasificación en la lista de
procesos ejecutables con igual prioridad estática.
SCHED_FIFO: Planificación FIFO (1º en entrar, 1º
en salir).¶
SCHED_FIFO sólo puede emplearse con prioridades estáticas
mayores que 0, lo que significa que cuando un proceso
SCHED_FIFO se
convierte en ejecutable, siempre prevalecerá inmediatamente sobre
cualquier otro proceso normal
SCHED_OTHER ejecutándose.
SCHED_FIFO es un simple algoritmo de planificación sin rodajas de
tiempo. Para procesos planificados bajo la política
SCHED_FIFO, se
aplican las siguientes reglas: Un proceso
SCHED_FIFO que ha sido
apropiado por otro proceso de mayor prioridad permanecerá en la cabeza de
la lista para su prioridad y reanudará su ejecución tan pronto como
todos los procesos de prioridad más alta se bloqueen de nuevo. Cuando un
proceso
SCHED_FIFO llegue a ser ejecutable, se insertará al final
de la lista para su prioridad. Una llamada a
sched_setscheduler o a
sched_setparam pondrá el proceso
SCHED_FIFO (o
SCHED_RR) identificado por
pid al comienzo de la lista si era
ejecutable. Como consecuencia, puede apropiarse del proceso actualmente en
curso si tiene la misma prioridad. (POSIX 1003.1 especifica que el proceso
debería ir al final de la lista.) Un proceso que llame a
sched_yield será colocado al final de la lista. Ningún otro
suceso moverá un proceso planificado bajo la política
SCHED_FIFO en la lista de espera de procesos ejecutables con igual
prioridad estática. Un proceso
SCHED_FIFO se ejecuta hasta que es
bloqueado por una petición de E/S, hasta que sea apropiado por un proceso
de más alta prioridad, o hasta que llame a
sched_yield.
SCHED_RR: Planificación circular (Round Robin).¶
SCHED_RR es una mejora simple de
SCHED_FIFO. Todo lo descrito
arriba para
SCHED_FIFO se aplica también a
SCHED_RR,
excepto que a cada proceso sólo se le permite ejecutarse durante un
cuanto de tiempo máximo. Si un proceso
SCHED_RR ha estado
ejecutándose durante un periodo de tiempo igual o mayor que el cuanto de
tiempo, será puesto al final de la lista para su prioridad. Un proceso
SCHED_RR que ha sido apropiado por un proceso de más alta
prioridad y subsecuentemente reanuda su ejecución como un proceso en
ejecución, completará la porción no expirada de su cuanto de
tiempo de asignación en rueda. La cantidad del cuanto de tiempo puede ser
obtenida con
sched_rr_get_interval.
SCHED_OTHER: Planificación predeterminada de Linux en
t.c.¶
SCHED_OTHER solamente puede emplearse con la prioridad estática 0.
SCHED_OTHER es el planificador estándar de Linux en tiempo
compartido, pensado para todos los procesos que no requieren mecanismos
especiales de prioridad estática en tiempo real. El proceso a ejecutarse
se escoge de la lista de prioridad estática 0 basado en una prioridad
dinámica que se determina solamente dentro de esta lista. La prioridad
dinámica se basa en el nivel de `nice' (puesto por la llamada
nice
o
setpriority) e incrementado para cada cuanto de tiempo para el que el
proceso está listo para la ejecución, pero denegado para ella por el
planificador. Esto asegura un buen progreso entre todos los procesos
SCHED_OTHER.
Tiempo de respuesta¶
Un proceso de alta prioridad bloqueado esperando E/S tiene un cierto tiempo de
respuesta antes de que sea planificado otra vez. El escritor del controlador
del dispositivo puede reducir grandemente este tiempo de respuesta empleando
un manejador de interrupción de "interrupción lenta".
Miscelánea¶
Los procesos hijos heredan el algoritmo y parámetros de planificación
a través de un
fork.
Usualmente se necesita un bloqueo de memoria para que los procesos en tiempo
real puedan evitar demoras en la paginación; esto puede hacerse con
mlock o
mlockall.
Como un bucle infinito no bloqueante en un proceso planificado bajo
SCHED_FIFO o
SCHED_RR, bloqueará para siempre todos los
procesos con baja prioridad, un desarrollador de software debería siempre
mantener disponible en la consola un shell planificado bajo una prioridad
estática mayor que la de la aplicación en pruebas. Esto
permitirá un `kill' de emergencia en aplicaciones de tiempo real en
pruebas que no bloqueen o terminen como se espere. Como los procesos
SCHED_FIFO y
SCHED_RR pueden apropiar otros procesos para
siempre, sólo los procesos de root tienen permiso para activar estas
políticas bajo Linux.
Los sistemas POSIX en los cuales se dispone de
sched_setscheduler y
sched_getscheduler definen
_POSIX_PRIORITY_SCHEDULING en
<unistd.h>.
VALOR DEVUELTO¶
En caso de éxito,
sched_setscheduler devuelve cero. En caso de
éxito,
sched_getscheduler devuelve la política para el
proceso (un entero no negativo). En caso de error, se devuelve -1 y se pone en
errno un valor apropiado.
ERRORES¶
- ESRCH
- No se ha podido encontrar el proceso cuya ID es
pid.
- EPERM
- El proceso que hace la llamada no tiene los privilegios
apropiados. Solamente los procesos de root tienen permiso para activar las
políticas SCHED_FIFO y SCHED_RR. El proceso que llame a
sched_setscheduler necesita un UID efectivo igual al EUID o al UID
del proceso identificado por pid, o debe ser un proceso del
súper-usuario.
- EINVAL
- La politica de planificación no es una de las
políticas reconocidas, o el parámetro p no tiene sentido
para la politica.
POSIX.1b (antiguamente POSIX.4)
FALLOS¶
En Linux-1.3.81,
SCHED_RR no había sido aún probada
cuidadosamente y pudiera ser que no se comportara exactamente como se describe
o requiere por POSIX.1b.
NOTA¶
El Linux estándar es un sistema operativo de propósito general que
puede manejar procesos en segundo plano, aplicaciones interactivas y
aplicaciones flexibles de tiempo real (aplicaciones que necesitan de forma
usual cumplir límites temporales). Esta página de manual está
dirigida a esos tipos de aplicaciones.
El Linux estándar
no está diseñado para soportar
aplicaciones estrictas de tiempo real, es decir, aplicaciones en las se deben
garantizar los plazos (a menudo mucho más breves que un segundo) o el
sistema fracasará catastróficamente. Como todos los sistemas
operativos de propósito general, Linux está diseñado para
maximizar el rendimiento del caso medio en lugar del rendimiento del peor
caso. El rendimiento del peor caso de Linux para el manejo de interrupciones
es mucho más pobre que su caso medio, sus distintos cerrojos del
núcleo (como los de SMP) producen tiempos de espera de máxima
duracción y muchas de sus técnicas para mejorar el rendimiento
decrementan el tiempo medio incrementando el tiempo del peor caso. Para la
mayoría de situaciones, eso es lo que usted quiere, pero si realmente
está desarrollando una aplicación estricta de tiempo real considere
el usar extensiones estrictas de tiempo real para Linux como RTLinux
(
http://www.rtlinux.org) o use un sistema operativo diferentes diseñado
específicamente para aplicaciones estrictas de tiempo real.
VÉASE TAMBIÉN¶
sched_setaffinity(2),
sched_getaffinity(2),
sched_setparam(2),
sched_getparam(2),
sched_yield(2),
sched_get_priority_max(2),
sched_get_priority_min(2),
sched_rr_get_interval(2),
nice(2),
setpriority(2),
getpriority(2),
mlockall(2),
munlockall(2),
mlock(2),
munlock(2)
Programming for the real world - POSIX.4 por Bill O. Gallmeister,
O'Reilly & Associates, Inc., ISBN 1-56592-074-0
IEEE Std 1003.1b-1993 (estándar POSIX.1b)
ISO/IEC 9945-1:1996 - Ésta es la nueva revisión de 1996 de
POSIX.1, que contiene en un solo estándar POSIX.1(1990), POSIX.1b(1993),
POSIX.1c(1995), y POSIX.1i(1995).