2. Sistemas operativos utilizados en sistemas automáticos industriales

2.3. ¿Cómo administra un Sistema Operativo los recursos computacionales?

Responder esta pregunta requiere introducir el concepto de unidad de ejecución.

Cuando un usuario desarrolla una aplicación, escribe un conjunto de instrucciones almacenadas en un archivo fuente. Sin embargo, ese código por sí solo no puede ejecutarse. Antes de utilizar el procesador debe transformarse en una entidad administrable por el sistema operativo.

Dependiendo de la arquitectura utilizada, dicha entidad puede recibir distintos nombres:

  • Programa
  • Proceso
  • Tarea (Task)
  • Hilo de ejecución (Thread)

Aquí una unidad de ejecución es el componente de software más pequeño que el sistema operativo puede planificar, controlar y asignar a un núcleo del procesador (CPU) para que realice un trabajo.

Se caracteriza por:

  • Ser dinámica: A diferencia del programa estático, la unidad de ejecución tiene un estado activo (ejecutándose, en espera o lista).
  • Tener contexto: Posee su propio contador de programa, registros de CPU y una pila para rastrear qué instrucciones está resolviendo.
  • Es el destino del planificador: El sistema operativo (específicamente el scheduler) decide en fracciones de milisegundos qué unidad de ejecución toma el control de la CPU.

En los sistemas operativos modernos, la unidad de ejecución por excelencia es el hilo de ejecución (thread).

 
Programa

Un programa es un conjunto organizado de instrucciones almacenadas en un medio de memoria.

En otras palabras, un programa constituye una descripción estática de un algoritmo.

Mientras permanece almacenado en memoria secundaria (Flash, SSD, disco rígido, etc.) no consume tiempo de procesador ni ejecuta ninguna acción.

Por ejemplo:

  • Un archivo .exe en Windows.
  • Un proyecto compilado en CODESYS.
  • El programa almacenado en la memoria Flash de un PLC.

Todos ellos representan programas.

Podría decirse que un programa es simplemente software almacenado, aún sin ejecutar.

ejecutables: lenguaje objeto, compilación, debugging - Malware SA

Proceso

Cuando el sistema operativo carga un programa en memoria y comienza su ejecución, dicho programa pasa a convertirse en un proceso.

Un proceso representa una instancia en ejecución de un programa.

Además del código ejecutable, un proceso posee:

  • memoria asignada;
  • variables;
  • pila (stack);
  • contador de programa;
  • registros del procesador;
  • recursos abiertos.

Cada proceso constituye una entidad independiente administrada por el sistema operativo.

Por ejemplo, en una computadora industrial pueden ejecutarse simultáneamente:

  • SCADA
  • Base de datos
  • Servidor OPC-UA
  • Node-RED

Aunque todos fueron desarrollados como programas, durante su ejecución se convierten en procesos independientes.

2.2.1. Gestión de procesos — documentación de Linuxnomicón - rolling

En síntesis, un proceso representa una aplicación en ejecución. Sin embargo, muchas aplicaciones modernas requieren realizar varias actividades de manera concurrente. Para ello, los sistemas operativos introducen el concepto de hilo de ejecución.

Hilo de ejecución (Thread)

Un hilo de ejecución (Thread) es la unidad básica de ejecución dentro de un proceso.

Mientras que un proceso dispone de su propio espacio de memoria y recursos del sistema, varios hilos pertenecientes a un mismo proceso comparten dichos recursos y pueden ejecutarse concurrentemente.

Cada hilo posee su propio:

  • Contador de programa (Program Counter).
  • Conjunto de registros.
  • Pila (Stack).
  • Estado de ejecución.

Sin embargo, comparte con los demás hilos del mismo proceso:

  • Código del programa.
  • Variables globales.
  • Memoria dinámica.
  • Archivos abiertos.
  • Recursos de comunicación.

En consecuencia, los hilos constituyen una alternativa más eficiente que los procesos cuando diferentes actividades deben ejecutarse dentro de una misma aplicación.

Sistemas Operativos

En sistemas operativos de propósito general, como Linux y Windows, una aplicación suele implementarse como uno o más procesos, cada uno de los cuales puede contener múltiples hilos de ejecución.

Tareas (Tasks)

En sistemas embebidos y sistemas operativos de tiempo real, la unidad fundamental de planificación suele denominarse tarea (Task).

Una tarea representa una secuencia de instrucciones que puede ejecutarse de manera independiente respecto de otras tareas.

Por ejemplo, en un sistema de monitoreo industrial podrían definirse las siguientes tareas:

Tarea Período
Adquisición de sensores 2 ms
Control PID 5 ms
Comunicación Modbus 20 ms
Registro histórico 100 ms
Actualización HMI 200 ms

Cada una de ellas posee requerimientos temporales diferentes.

El sistema operativo será el encargado de decidir cuándo ejecutar cada una.

1.3 FreeRTOS Basic

Durante su ciclo de vida una tarea puede encontrarse en diferentes estados.

Los más habituales son:

  • Ready
  • Running
  • Blocked
  • Suspended

En numerosos sistemas embebidos y sistemas operativos de tiempo real (RTOS), el concepto tradicional de proceso pierde relevancia debido a que, habitualmente, toda la aplicación se ejecuta dentro de un único espacio de memoria compartido. En este contexto, la unidad fundamental de planificación pasa a ser la tarea (Task), administrada directamente por el scheduler del sistema operativo.

En FreeRTOS, por ejemplo, una aplicación está compuesta por un conjunto de tareas concurrentes que comparten el mismo espacio de memoria y los recursos globales del sistema. Cada tarea dispone de su propio contexto de ejecución, prioridad y pila (stack), lo que permite que sean planificadas de manera independiente por el scheduler.

Desde el punto de vista conceptual, una Task puede considerarse una unidad independiente de ejecución, funcionalmente equivalente a un hilo de ejecución (Thread) en un sistema operativo de propósito general. No obstante, su implementación depende de la arquitectura del sistema operativo y del modelo de ejecución adoptado por cada RTOS.

Scheduler

Constituye el componente del sistema operativo encargado de asignar el procesador a las diferentes tareas según una política de planificación determinada.

Entre sus funciones principales se encuentran:

  • seleccionar la próxima tarea;
  • cambiar de contexto;
  • administrar prioridades;
  • garantizar tiempos de respuesta;
  • optimizar la utilización del procesador.

Podría decirse que el Scheduler funciona como un "planificador" del procesador.

Cuando el Scheduler decide ejecutar una nueva tarea debe:

  • guardar el estado de la tarea actual;
  • cargar el estado de la siguiente;
  • continuar la ejecución.

Este procedimiento recibe el nombre de Cambio de Contexto (Context Switch).

En sistemas de tiempo real el tiempo requerido para realizar este cambio constituye un parámetro importante de desempeño.