Provided by: manpages-es_1.55-10_all bug

NOMBRE

       sched_setscheduler,  sched_getscheduler  -  establecen  y  obtienen los
       algoritmos/parametros de planificacion

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'ON

       sched_setscheduler  establece  tanto  la politica de planificacion como
       los parametros asociados para el proceso identificado por pid.  Si  pid
       es  igual  a cero, se establece el planificador del proceso que hace la
       llamada. La interpretacion del  parametro  p  depende  de  la  politica
       seleccionada.  Actualmente  se  admiten  en  Linux  las tres siguientes
       politicas:  SCHED_FIFO,  SCHED_RR,  y  SCHED_OTHER;   sus   respectivas
       semanticas se describen abajo.

       sched_getscheduler  pregunta  por la politica de planificacion aplicada
       actualmente al proceso identificado por pid. Si pid es igual a cero, se
       obtiene la politica del proceso que hace la llamada.

   Pol'iticas de Planificaci'on
       El  planificador  es  la  parte  del  nucleo  que  decide  que  proceso
       ejecutable sera ejecutado por la CPU a continuacion. El planificador de
       Linux  ofrece  tres politicas de planificacion diferentes, una para los
       procesos normales y dos para aplicaciones en tiempo real. Se  asigna  a
       cada proceso un valor de prioridad estatica sched_priority y este valor
       solo puede cambiarse a traves 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 que proceso se debe ejecutar
       a continuacion, el planificador de Linux busca en la lista no vacia con
       la  prioridad  estatica mas alta y toma el proceso a la cabeza de dicha
       lista. La politica de planificacion determina para cada proceso,  donde
       se  insertara  en  la  lista de procesos con igual prioridad estatica y
       como se movera dentro de esta lista.

       SCHED_OTHER  es  el  planificador  de   tiempo   compartido   universal
       predeterminado  empleado  por  la mayoria de los procesos; SCHED_FIFO y
       SCHED_RR han sido pensados para aplicaciones especiales donde el tiempo
       es  critico  y necesitan un control preciso sobre la forma en la que se
       seleccionan para ejecucion los procesos  ejecutables.  A  los  procesos
       planificados  con SCHED_OTHER se les debe asignar la prioridad estatica
       0; los procesos planificados bajo SCHED_FIFO o  SCHED_RR  pueden  tener
       una  prioridad  estatica  en el rango de 1 a 99. Solamente los procesos
       con privilegio de super-usuario pueden obtener una  prioridad  estatica
       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 valido
       de  prioridad  para  una  politica  de  planificacion  de  una   manera
       transportable en todos los sistemas que cumplan POSIX.1b.

       Toda  la  planificacion es apropiativa: si un proceso con una prioridad
       estatica mas alta esta listo para ejecutarse, el  proceso  actual  sera
       apropiado y devuelto a su lista de espera. La politica de planificacion
       solamente  determina  la  clasificacion  en  la   lista   de   procesos
       ejecutables con igual prioridad estatica.

   SCHED_FIFO: Planificaci'on FIFO (1_o en entrar, 1_o en salir).
       SCHED_FIFO  solo  puede emplearse con prioridades estaticas mayores que
       0, lo que significa que cuando un proceso SCHED_FIFO  se  convierte  en
       ejecutable,  siempre  prevalecera  inmediatamente  sobre cualquier otro
       proceso normal  SCHED_OTHER  ejecutandose.   SCHED_FIFO  es  un  simple
       algoritmo  de  planificacion  sin  rodajas  de  tiempo.  Para  procesos
       planificados bajo la politica SCHED_FIFO,  se  aplican  las  siguientes
       reglas: Un proceso SCHED_FIFO que ha sido apropiado por otro proceso de
       mayor prioridad permanecera en la cabeza de la lista para su  prioridad
       y  reanudara  su  ejecucion  tan  pronto  como  todos  los  procesos de
       prioridad mas alta se bloqueen de nuevo. Cuando un  proceso  SCHED_FIFO
       llegue  a  ser  ejecutable,  se  insertara al final de la lista para su
       prioridad. Una llamada a sched_setscheduler o a  sched_setparam  pondra
       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 deberia ir al final de la lista.)   Un
       proceso  que  llame  a  sched_yield sera colocado al final de la lista.
       Ningun otro suceso movera  un  proceso  planificado  bajo  la  politica
       SCHED_FIFO  en  la  lista  de  espera de procesos ejecutables con igual
       prioridad estatica. Un proceso  SCHED_FIFO  se  ejecuta  hasta  que  es
       bloqueado  por  una  peticion  de  E/S,  hasta que sea apropiado por un
       proceso de mas alta prioridad, o hasta que llame a sched_yield.

   SCHED_RR: Planificaci'on circular (Round Robin).
       SCHED_RR es una mejora simple de SCHED_FIFO. Todo  lo  descrito  arriba
       para  SCHED_FIFO  se  aplica  tambien  a  SCHED_RR,  excepto que a cada
       proceso solo se le permite  ejecutarse  durante  un  cuanto  de  tiempo
       maximo.   Si  un  proceso  SCHED_RR  ha  estado ejecutandose durante un
       periodo de tiempo igual o mayor que el cuanto de tiempo, sera puesto al
       final  de  la  lista para su prioridad. Un proceso SCHED_RR que ha sido
       apropiado por un proceso  de  mas  alta  prioridad  y  subsecuentemente
       reanuda  su  ejecucion  como  un  proceso  en  ejecucion, completara la
       porcion no expirada de su cuanto de tiempo de asignacion en  rueda.  La
       cantidad    del    cuanto    de   tiempo   puede   ser   obtenida   con
       sched_rr_get_interval.

   SCHED_OTHER: Planificaci'on predeterminada de Linux en t.c.
       SCHED_OTHER solamente puede emplearse  con  la  prioridad  estatica  0.
       SCHED_OTHER  es el planificador estandar de Linux en tiempo compartido,
       pensado para todos los procesos que no requieren mecanismos  especiales
       de  prioridad  estatica  en  tiempo  real.   El proceso a ejecutarse se
       escoge de la lista de prioridad estatica  0  basado  en  una  prioridad
       dinamica  que se determina solamente dentro de esta lista. La prioridad
       dinamica 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 esta listo para la ejecucion, 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 interrupcion de "interrupcion
       lenta".

   Miscel'anea
       Los procesos hijos heredan el algoritmo y parametros de planificacion a
       traves de un fork.

       Usualmente  se  necesita un bloqueo de memoria para que los procesos en
       tiempo real puedan evitar demoras en la paginacion; esto puede  hacerse
       con mlock o mlockall.

       Como  un  bucle  infinito  no bloqueante en un proceso planificado bajo
       SCHED_FIFO o SCHED_RR, bloqueara para siempre todos  los  procesos  con
       baja  prioridad,  un desarrollador de software deberia siempre mantener
       disponible en la  consola  un  shell  planificado  bajo  una  prioridad
       estatica  mayor  que  la de la aplicacion en pruebas. Esto permitira 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, solo los procesos
       de root tienen permiso para activar estas politicas 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 exito, sched_setscheduler devuelve cero.  En caso de  exito,
       sched_getscheduler  devuelve  la politica 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  politicas  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 super-usuario.

       EINVAL La  politica  de  planificacion  no  es  una  de  las  politicas
              reconocidas, o el parametro p no tiene sentido para la politica.

CONFORME A

       POSIX.1b (antiguamente POSIX.4)

FALLOS

       En  Linux-1.3.81,  SCHED_RR  no habia sido aun probada cuidadosamente y
       pudiera ser que  no  se  comportara  exactamente  como  se  describe  o
       requiere por POSIX.1b.

NOTA

       El  Linux  estandar  es  un  sistema operativo de proposito general que
       puede manejar procesos en segundo plano,  aplicaciones  interactivas  y
       aplicaciones  flexibles  de  tiempo real (aplicaciones que necesitan de
       forma usual cumplir limites temporales). Esta  pagina  de  manual  esta
       dirigida a esos tipos de aplicaciones.

       El Linux estandar no esta disenado para soportar aplicaciones estrictas
       de tiempo real, es decir, aplicaciones en las se deben  garantizar  los
       plazos  (a  menudo  mucho  mas  breves  que  un  segundo)  o el sistema
       fracasara catastroficamente.  Como todos  los  sistemas  operativos  de
       proposito  general,  Linux  esta disenado 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 mas
       pobre que su caso medio, sus distintos cerrojos del nucleo (como los de
       SMP)  producen  tiempos  de  espera de maxima duraccion y muchas de sus
       tecnicas para  mejorar  el  rendimiento  decrementan  el  tiempo  medio
       incrementando el tiempo del peor caso.  Para la mayoria de situaciones,
       eso es lo que usted quiere, pero si realmente  esta  desarrollando  una
       aplicacion  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 disenado
       especificamente para aplicaciones estrictas de tiempo real.

V'EASE TAMBI'EN

       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 (estandar POSIX.1b)
       ISO/IEC 9945-1:1996 - Esta es la nueva revision de 1996 de POSIX.1, que
       contiene   en   un   solo   estandar   POSIX.1(1990),   POSIX.1b(1993),
       POSIX.1c(1995), y POSIX.1i(1995).