1. Qué es un sistema de tiempo real
Un sistema de tiempo real es un sistema en el que la corrección del resultado depende no solo de la lógica (qué se calcula) sino también del tiempo (cuándo se entrega). Un resultado correcto que llega tarde es un resultado incorrecto.
En un sistema de propósito general, lo que importa es el rendimiento promedio: cuánto trabajo se hace por segundo. En un sistema de tiempo real, lo que importa es la predecibilidad: se debe garantizar que cada tarea termina antes de su plazo.
Los sistemas de tiempo real se encuentran en todas partes: control de motores, sistemas de frenado (ABS), marcapasos, sistemas de guía de misiles, control de tráfico aéreo, sistemas de negociación de alta frecuencia (HFT). En todos estos casos, un resultado tardío es inútil o peligroso.
Un sistema de tiempo real no necesita ser rápido; necesita ser predecible. Un sistema que responde en 1 ms el 99 % de las veces pero tarda 100 ms el 1 % no es de tiempo real. Un sistema que responde en 10 ms el 100 % de las veces sí lo es.
2. Tiempo real duro y blando
Los sistemas de tiempo real se clasifican en dos categorías:
| Aspecto | Tiempo real duro (hard) | Tiempo real blando (soft) |
|---|---|---|
| Plazo incumplido | Catastrófico: fallo del sistema, daño físico, pérdida de vidas. | Degradación: pérdida de calidad, pero el sistema sigue funcionando. |
| Garantía | Debe garantizarse al 100 %. | Se garantiza con alta probabilidad, pero no al 100 %. |
| Ejemplos | Marcapasos, control de vuelo, ABS, airbag. | Streaming de video, juegos, telefonía VoIP, audio. |
| Planificación | Algoritmos con garantías formales (RM, EDF). | Algoritmos heurísticos (prioridades, Round Robin). |
La diferencia clave es la consecuencia de incumplir un plazo. En tiempo real duro, un plazo incumplido es un fallo del sistema. En tiempo real blando, un plazo incumplido degrada la calidad pero no es catastrófico.
La mayoría de los sistemas de propósito general (Linux, Windows) son de tiempo real blando: intentan cumplir los plazos pero no lo garantizan. Los sistemas de tiempo real duro requieren hardware y software especializados.
3. Plazos (deadlines)
Un plazo (deadline) es el instante antes del cual una tarea debe terminar. Si la tarea termina después del plazo, se ha incumplido el plazo.
Los plazos se clasifican en:
- Absolutos: la tarea debe terminar antes de un instante fijo (por ejemplo, antes de t = 10).
- Relativos: la tarea debe terminar dentro de un tiempo desde su llegada (por ejemplo, dentro de 5 unidades de su llegada).
En los sistemas de tiempo real, las tareas suelen ser periódicas: se repiten cada cierto período (por ejemplo, cada 10 ms). Cada instancia tiene su propio plazo: el plazo de la instancia i es i·P + D, donde P es el período y D es el plazo relativo.
El tiempo de respuesta de una tarea es el tiempo desde que llega hasta que termina. El plazo se cumple si el tiempo de respuesta ≤ plazo.
4. Latencia
La latencia es el tiempo que pasa desde que ocurre un evento hasta que el sistema responde. En un sistema de tiempo real, la latencia debe ser acotada y predecible.
La latencia se descompone en:
- Latencia de interrupción: tiempo desde que ocurre la interrupción de hardware hasta que se ejecuta el manejador.
- Latencia de despacho: tiempo desde que el planificador decide ejecutar un proceso hasta que realmente se ejecuta (tema 4).
- Latencia de ejecución: tiempo que tarda el proceso en completar su trabajo.
La latencia total es la suma de las tres. En un sistema de tiempo real, cada una debe ser acotada.
Los sistemas de propósito general tienen latencias variables: la latencia de despacho puede ser de 1 μs a 100 ms, dependiendo de la carga. Los sistemas de tiempo real tienen latencias acotadas: la latencia de despacho es siempre menor que un valor fijo (por ejemplo, 1 ms).
5. Rápido vs predecible
La diferencia entre «rápido» y «predecible» es fundamental:
| Aspecto | Rápido | Predecible |
|---|---|---|
| Objetivo | Minimizar el tiempo de respuesta promedio. | Garantizar que el tiempo de respuesta ≤ plazo, siempre. |
| Métrica | Promedio, percentiles. | Peor caso (worst-case). |
| Algoritmos | SJF, Round Robin, CFS. | RM, EDF, SCHED_FIFO. |
| Sistemas | Linux, Windows, macOS. | RTOS, Linux con PREEMPT_RT. |
| Trade-off | Sacrifica predecibilidad por rendimiento. | Sacrifica rendimiento por predecibilidad. |
Un sistema rápido puede ser impredecible: la mayoría de las veces responde en 1 ms, pero ocasionalmente tarda 100 ms. Un sistema predecible siempre responde en 10 ms. Para un sistema de tiempo real, el segundo es mejor.
La predecibilidad requiere:
- Planificación con garantías: algoritmos que garantizan que los plazos se cumplen.
- Latencia acotada: el tiempo de respuesta debe ser ≤ plazo, incluso en el peor caso.
- Sin operaciones no acotadas: no se pueden usar estructuras de datos con tiempo de acceso variable (listas enlazadas sin límite, por ejemplo).
- Sin paginación: los fallos de página introducen latencia impredecible.
6. Tareas periódicas y aperiódicas
Las tareas en un sistema de tiempo real se clasifican en:
| Tipo | Descripción | Ejemplo |
|---|---|---|
| Periódicas | Se repiten cada cierto período. Cada instancia tiene un plazo. | Sensor de temperatura que se lee cada 10 ms. |
| Aperiódicas | Llegan en momentos arbitrarios. Pueden tener plazo o no. | Interrupción de un botón. |
| Esporádicas | Aperiódicas con un tiempo mínimo entre llegadas. | Alarma de un sensor. |
Las tareas periódicas son las más comunes en tiempo real. Se caracterizan por:
- Período (P): tiempo entre instancias consecutivas.
- Tiempo de ejecución (C): tiempo de CPU que necesita cada instancia.
- Plazo (D): tiempo máximo desde la llegada hasta la terminación. Normalmente D = P (plazo implícito).
- Utilización (U): C / P. La fracción de tiempo de CPU que la tarea necesita.
La utilización total es la suma de las utilizaciones de todas las tareas. Si la utilización total > 1, el sistema no puede cumplir todos los plazos (no hay suficiente CPU).
7. Ejemplos de sistemas de tiempo real
| Sistema | Tipo | Plazo típico | Consecuencia de incumplimiento |
|---|---|---|---|
| Marcapasos | Duro | 10-50 ms | Muerte del paciente. |
| Control de vuelo | Duro | 1-10 ms | Accidente aéreo. |
| ABS (frenos) | Duro | 1-5 ms | Accidente. |
| Airbag | Duro | 10-30 ms | Muerte o lesión grave. |
| Control de motor | Duro | 1-10 ms | Daño al motor. |
| Streaming de video | Blando | 33 ms (30 fps) | Frame drop, degradación de calidad. |
| VoIP | Blando | 20-50 ms | Degradación de calidad de voz. |
| Juegos | Blando | 16 ms (60 fps) | Lag, degradación de experiencia. |
| HFT (trading) | Blando/Duro | 1-10 μs | Pérdida financiera. |
8. Requisitos del sistema
Un sistema de tiempo real (especialmente duro) requiere:
- Planificador con garantías: algoritmos que garantizan que los plazos se cumplen (RM, EDF).
- Latencia acotada: el tiempo de despacho debe ser ≤ un valor fijo.
- Sin paginación: los fallos de página introducen latencia impredecible.
- Sin operaciones no acotadas: no se pueden usar estructuras de datos con tiempo de acceso variable.
- Kernel preemptible: el núcleo debe poder ser interrumpido en cualquier momento.
- Prioridades de tiempo real: los procesos de tiempo real tienen prioridad sobre los normales.
Linux con el parche PREEMPT_RT convierte el núcleo en preemptible, reduciendo la latencia máxima de ~100 ms a ~1 ms. Es la base de los sistemas de tiempo real blando en Linux.
9. Tiempo real en Linux
Linux soporta tiempo real a través de:
- SCHED_FIFO: planificación FIFO de tiempo real. El proceso se ejecuta hasta que se bloquea o cede la CPU.
- SCHED_RR: Round Robin de tiempo real. Igual que SCHED_FIFO pero con quantum.
- SCHED_DEADLINE: planificación por plazo. El proceso especifica su plazo y el sistema garantiza que se cumple (si es posible).
- PREEMPT_RT: parche que hace el núcleo preemptible, reduciendo la latencia.
Las políticas de tiempo real tienen prioridad sobre la clase normal (SCHED_OTHER). Un proceso de tiempo real siempre se ejecuta antes que uno normal, siempre que esté listo.
Linux no es un RTOS (Real-Time Operating System) puro, pero con PREEMPT_RT y SCHED_DEADLINE proporciona garantías de tiempo real blando adecuadas para la mayoría de las aplicaciones.
10. Simulador interactivo
Este simulador muestra la diferencia entre un sistema predecible y uno rápido. Un conjunto de tareas periódicas se ejecuta con Round Robin (rápido pero no predecible) y con SCHED_FIFO (predecible). Observa los tiempos de respuesta:
Simulador · tiempo real vs propósito general
Round Robin (rápido, no predecible)
SCHED_FIFO (predecible)
| Tarea | Plazo | RR: respuesta | FIFO: respuesta | RR cumple? | FIFO cumple? |
|---|
11. Resumen
- Un sistema de tiempo real requiere que los resultados lleguen antes de un plazo.
- Tiempo real duro: un plazo incumplido es catastrófico.
- Tiempo real blando: un plazo incumplido degrada la calidad.
- Rápido no es lo mismo que predecible: un sistema rápido puede ser impredecible.
- La latencia debe ser acotada y predecible.
- Las tareas periódicas se caracterizan por período, tiempo de ejecución y plazo.
- La utilización total no debe superar 1.
- Linux soporta tiempo real con SCHED_FIFO, SCHED_RR y SCHED_DEADLINE.
- PREEMPT_RT reduce la latencia del núcleo.
12. Preguntas de repaso
Intenta responder cada una antes de abrir la respuesta.
1. ¿Qué es un sistema de tiempo real?
Un sistema en el que la corrección del resultado depende del tiempo: un resultado correcto que llega tarde es incorrecto.
2. ¿Cuál es la diferencia entre tiempo real duro y blando?
Duro: un plazo incumplido es catastrófico. Blando: un plazo incumplido degrada la calidad pero no es catastrófico.
3. ¿Por qué «rápido» no es lo mismo que «predecible»?
Un sistema rápido puede ser impredecible (la mayoría de las veces rápido, pero ocasionalmente lento). Un sistema predecible siempre responde en el mismo tiempo.
4. ¿Qué es un plazo (deadline)?
El instante antes del cual una tarea debe terminar.
5. ¿Qué es la latencia?
El tiempo desde que ocurre un evento hasta que el sistema responde.
6. ¿Qué es la utilización de una tarea periódica?
C / P, donde C es el tiempo de ejecución y P es el período.
7. ¿Qué ocurre si la utilización total supera 1?
El sistema no puede cumplir todos los plazos: no hay suficiente CPU.
8. ¿Qué políticas de tiempo real soporta Linux?
SCHED_FIFO, SCHED_RR y SCHED_DEADLINE.
9. ¿Qué hace PREEMPT_RT?
Hace el núcleo preemptible, reduciendo la latencia máxima.
10. ¿Por qué los sistemas de tiempo real evitan la paginación?
Porque los fallos de página introducen latencia impredecible.
Para practicar
- Calcula la utilización total para 3 tareas con C=2, P=10; C=3, P=15; C=1, P=5.
- Explica por qué un sistema que responde en 1 ms el 99 % de las veces no es de tiempo real duro.
- Diseña un conjunto de tareas periódicas y calcula si se pueden cumplir todos los plazos.
- Investiga cómo SCHED_DEADLINE garantiza los plazos.
- Explica por qué los sistemas de tiempo real evitan operaciones no acotadas.
- Compara la latencia de Linux con y sin PREEMPT_RT.