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

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,  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).