4.2. Programación de CPU
El programador es responsable de mantener las CPU en el sistema ocupado. El programador de Linux implementa un número de políticas de programación, las cuales determinan cuándo y por cuánto tiempo se ejecuta un hilo en un núcleo de CPU particular.
Las políticas de programación se dividen en dos categorías principales:
- Políticas de Realtime
- SCHED_FIFO
- SCHED_RR
- Políticas normales
- SCHED_OTHER
- SCHED_BATCH
- SCHED_IDLE
4.2.1. Políticas de programación Realtime
Los hilos de Realtime se programan primero y luego los hilos normales después de que todos los hilos Realtime hayan sido programados.
Las políticas de realtime sirven para tareas críticas de tiempo que deben completarse sin interrupciones.
SCHED_FIFO
- Esta política también se conoce como programación de prioridad estática, porque define una prioridad fijada (entre 1 y 99) para cada hilo. El programador escanea una lista de hilos SCHED_FIFO en orden de prioridad y programa el hilo con prioridad más alta listo para ejecutarse. Este hilo se ejecuta hasta que se bloquea, sale o es prevaciado por una prioridad mayor que está lista para ejecutarse.La prioridad inferior del hilo de tiempo real será programada por antes de cualquier hilo con una política de no-realtime; si únicamente existe un hilo de tiempo real, el valor de prioridad
SCHED_FIFO
no es problema. SCHED_RR
- Una variante round-robin de la política
SCHED_FIFO
. Los hilos deSCHED_RR
también reciben una prioridad fijada entre 1 y 99. Sin embargo, los hilos con la misma prioridad se reprograman al estilo round-robin dentro de un cierto quantum, o porción de tiempo. La llamada de sistemasched_rr_get_interval(2)
retorna el valor de la porción de tiempo, pero la duración de la porción del tiempo no puede ser establecida por usuario. Esta política es útil si se necesita múltiples hilos con la misma prioridad.
Para obtener mayor información sobre la semántica definida de políticas de programación de tiempo real, consulte IEEE 1003.1 POSIX standard en Interfaces del sistema — Realtime, disponible en http://pubs.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_08.html.
La mejor práctica para definir prioridad de hilos es iniciar a una prioridad baja y aumentarla únicamente cuando se identifique latencia legítima. Los hilos de tiempo real no se dividen como los hilos normales. Los hilos
SCHED_FIFO
se ejecutan hasta que se bloqueen, salgan, o sean prevaciadas por un hilo con una prioridad superior. Por lo tanto, establecer una prioridad de 99 no se recomienda, ya que esto sitúa su proceso al mismo nivel de prioridad como hilos de migración y vigilancia. Si estos hilos se bloquean debido a que su hilo va a un bucle de computación, no podrán ejecutarse. Los sistemas de un procesador, terminarán bloqueándose en esta situación.
En el kernel de Linux, la política
SCHED_FIFO
incluye un mecanismo de capa de banda ancha. Esto protege a los programadores de aplicaciones de tiempo real de las tareas de tiempo real que podrían monopolizar la CPU. Este mecanismo puede ajustarse mediante los siguientes parámetros del sistema de archivos /proc
:
/proc/sys/kernel/sched_rt_period_us
- Define el periodo de tiempo para considerarse cien por ciento de ancho de banda de CPU, en microsegundos ('us' siendo el equivalente más cercano a 'µs' en texto plano). El valor predeterminado es 1000000µs, o 1 segundo.
/proc/sys/kernel/sched_rt_runtime_us
- Define el periodo de tiempo dedicado a la ejecución de hilos en tiempo real, en microsegundos (siendo 'us' la forma más cercana en texto plano a 'µs'). El valor predeterminado es 950000µs, o 0.95 segundos.