Provided by: manpages-es_1.55-10_all 

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.
CONFORME A
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).
Linux 2.4.18 25 junio 2002 SETSCHEDULER(2)