bionic (2) sched_getscheduler.2.gz

Provided by: manpages-es_1.55-10_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).