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]
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
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
- 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"]
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.