7  Los hilos (threads) y el TCB

7.1 ¿Qué es un Hilo?

Un hilo (thread, en inglés) es la unidad básica de utilización de la CPU. Es una secuencia de instrucciones que puede ejecutarse de forma independiente dentro del contexto de un proceso. Mientras que un proceso incluye recursos como memoria, archivos abiertos y espacio de direcciones, los hilos comparten estos recursos con otros hilos del mismo proceso, pero mantienen su propio:

  • Contador de programa
  • Pila de ejecución
  • Conjunto de registros
flowchart TD
    Proceso[Proceso] --> Recursos[Recursos Compartidos]
    subgraph Hilos [Hilos del Proceso]
        Hilo1[Hilo 1]
        Hilo2[Hilo 2]
        Hilo3[Hilo 3]
    end
    Proceso --> Hilos
    Hilo1 -->|Propio| Pila1[Pila]
    Hilo1 -->|Propio| Registros1[Registros]
    Hilo2 -->|Propio| Pila2[Pila]
    Hilo2 -->|Propio| Registros2[Registros]
    Hilo3 -->|Propio| Pila3[Pila]
    Hilo3 -->|Propio| Registros3[Registros]



Figura 7.1: Un hilo puede ejecutarse de forma independiente.

En esencia, un hilo es considerado un proceso ligero que facilita la ejecución concurrente dentro de un mismo programa. Son ampliamente utilizados en aplicaciones modernas para mejorar el rendimiento y la capacidad de respuesta, especialmente en entornos multitarea.

7.1.1 Ejemplo Didáctico: Hilos en una Aplicación Móvil

Imaginemos una aplicación móvil que realiza varias tareas al mismo tiempo. Estas tareas se distribuyen entre diferentes hilos para mejorar el rendimiento y la experiencia del usuario:

flowchart TD
    App[Aplicación Móvil] --> Hilo1[Hilo 1: Interfaz Gráfica]
    App --> Hilo2[Hilo 2: Descargar Imágenes]
    App --> Hilo3[Hilo 3: Guardar Progreso]

    subgraph Recursos Compartidos
        Memoria[Memoria Compartida]
        Archivos[Archivos Abiertos]
    end

    Hilo1 -->|Acceso| Memoria
    Hilo1 -->|Acceso| Archivos
    Hilo2 -->|Acceso| Memoria
    Hilo2 -->|Acceso| Archivos
    Hilo3 -->|Acceso| Memoria
    Hilo3 -->|Acceso| Archivos




Figura 7.2: Esquema de ejecución multihilo
  • Un hilo se encarga de mostrar la interfaz gráfica, asegurando que la aplicación responda rápidamente a las interacciones del usuario.
  • Otro hilo se dedica a descargar imágenes desde internet, permitiendo cargar contenido sin bloquear la aplicación.
  • Un tercer hilo se encarga de guardar automáticamente el progreso del usuario, garantizando que los datos estén seguros.

Gracias a esta separación, si la descarga de imágenes falla o se demora, la interfaz sigue funcionando sin interrupciones, y el progreso del usuario se guarda correctamente.

7.2 Thread Control Block (TCB)

El Thread Control Block (TCB) es una estructura fundamental que los sistemas operativos utilizan para gestionar y controlar la ejecución de cada hilo (thread) de manera individual. En un entorno multitarea donde múltiples hilos pueden ejecutarse de forma concurrente dentro de un mismo proceso, el TCB actúa como la “ficha de identidad” de cada hilo, almacenando toda la información necesaria para que el sistema operativo pueda planificarlo, pausarlo, reanudarlo o finalizarlo según corresponda.

flowchart TB
    TCB["Thread Control Block"] --> TID["Identificador TID"] & PC["Contador de Programa"] & Registros["Registros de CPU"] & SP["Puntero de Pila"] & Estado["Estado del Hilo"] & Prioridad["Prioridad"] & PCB["Enlace al PCB"]


Figura 7.3: Esquema del TCB

Cada hilo tiene su propio TCB, lo cual permite que el sistema lleve un control preciso del estado de ejecución, recursos asociados y prioridades. Gracias a esta estructura, los hilos pueden ejecutarse de forma independiente dentro del mismo proceso sin interferirse mutuamente.

7.3 Comunicación entre Procesos (IPC)

La Comunicación entre Procesos, conocida como IPC (Inter-Process Communication), abarca un conjunto de mecanismos que permiten a los procesos de un sistema operativo intercambiar información y coordinar sus acciones.

Estos mecanismos son fundamentales para lograr que múltiples procesos trabajen de forma cooperativa o sin interferirse entre sí.

En sistemas Unix/Linux, los principales métodos de IPC incluyen:

  • Señales: Permiten a un proceso notificar a otro sobre un evento. Por ejemplo, al presionar Ctrl+C para detener un programa, se está enviando una señal al proceso.

  • Pipes (tuberías): Conectan la salida de un proceso con la entrada de otro. El símbolo | en la línea de comandos representa esta conexión y permite encadenar comandos fácilmente.

  • Semáforos: Sirven para sincronizar procesos y evitar errores por acceso simultáneo a recursos compartidos, como las condiciones de carrera.

  • Colas de mensajes: Permiten enviar mensajes estructurados entre procesos, conservando el orden de envío.

  • Memoria compartida: Facilita que varios procesos accedan a una misma región de memoria, lo que permite una comunicación rápida, aunque requiere mecanismos de sincronización para evitar conflictos.