2.2 Modelo multi-hilo

Son unidades básicas de ejecución dentro de un proceso que comparten el mismo espacio de direcciones y recursos del sistema, como memoria y archivos. Los hilos permiten que un proceso se ejecute de manera concurrente, facilitando la realización de múltiples tareas y operaciones simultáneamente.

Tipos de modelos multihilos

Los hilos se gestionan completamente en el espacio de usuario sin intervención del sistema operativo.

  • Ventajas: Mayor flexibilidad y eficiencia en la gestión de hilos, ya que las operaciones de creación, planificación y sincronización se realizan a nivel de usuario.
  • Desventajas: Limitaciones en la escalabilidad y gestión de hilos en entornos multinúcleo o multiprocesador, debido a la falta de soporte y cooperación del sistema operativo.

Los hilos se gestionan y soportan directamente por el sistema operativo a nivel de kernel.

  • Ventajas: Mayor eficiencia y escalabilidad en la gestión de hilos, ya que el sistema operativo puede planificar y coordinar hilos de manera más efectiva en entornos multinúcleo y multiprocesador.
  • Desventajas: Mayor complejidad y sobrecarga debido a la necesidad de sincronización y comunicación entre hilos a través de llamadas al sistema y operaciones de cambio de contexto.
Clasificación de modelos multihilos

Son una combinación de hilos a nivel de usuario y a nivel de kernel, donde múltiples hilos de usuario se asignan a un número menor de hilos del sistema operativo. Estos proporcionan un equilibrio entre la eficiencia y la flexibilidad, permitiendo una gestión óptima de recursos y una adaptabilidad a diferentes cargas de trabajo y requisitos del sistema.

Los hilos gestionados completamente a nivel de usuario, sin soporte directo del sistema operativo. Ofrecen una implementación más ligera y eficiente de hilos, adecuada para aplicaciones con requisitos de hilos flexibles y operaciones de E/S intensivas.

Estos hilos gestionados y soportados directamente por el sistema operativo a nivel de kernel. Proporcionan un mayor nivel de control y gestión de hilos, adecuados para aplicaciones con requisitos de hilos intensivos y operaciones de cálculo intensivo.


A continuación se presenta un ejemplo de código implementado en lenguaje de programación C utilizando hilos ligeros.

        // Importación de librerías

        #include <stdio.h>                            // Librería de entrada y salida estándar
        #include <pthread.h>                          // Librería POSIX estándar en lenguaje C para Linux

        // Función que se ejecutará en el primer hilo

        void* funcionHilo1(void* arg) {
            for (int i = 1; i <= 5; ++i) {               // Ciclo for inicializado en 1 con condición de paro cuando el contador es mayor a 5
                printf("Hilo 1: Mensaje %d\n", i);      // Impresión en pantalla de mensajes del primer hilo
            }
            return NULL;                               // Se retorna NULL para finalizar la ejecución de la función
        }
    
        // Función que se ejecutará en el segundo hilo
        
        void* funcionHilo2(void* arg) {
            for (int i = 1; i <= 5; ++i) {               // Ciclo for inicializado en 1 con condición de paro cuando el contador es mayor a 5
                printf("Hilo 2: Mensaje %d\n", i);      // Impresión en pantalla de mensajes del segundo hilo
            }
            return NULL;                              // Se retorna NULL para finalizar la ejecución de la función
        }
    
        int main() {
            // Declaración de identificadores de hilos
            pthread_t hilo1, hilo2;                              // Se declaran 2 estructuras de datos con pthread_t
    
            // Creación de hilos
            pthread_create(&hilo1, NULL, funcionHilo1, NULL);   // Se crea proceso, el cual hilo1 ejecuta con la rutina funcionHilo1
            pthread_create(&hilo2, NULL, funcionHilo2, NULL);   // Se crea proceso, el cual hilo2 ejecuta con la rutina funcionHilo2
    
            // Espera a que los hilos terminen su ejecución
            pthread_join(hilo1, NULL);                          // Se espera a que hilo1 termine su ejecución
            pthread_join(hilo2, NULL);                          // Se espera a que hilo2 termine su ejecución
    
            printf("Programa principal: Hilos finalizados\n");  // Impresión en pantalla de finalización de programa principal
    
            return 0;
        }
            
Código 1. Hilos ligeros.

Este programa crea dos hilos (hilo1 y hilo2) utilizando la función pthread_create. Cada hilo ejecuta su propia función (funcionHilo1 y funcionHilo2) que imprime mensajes en la consola. La función pthread_join se utiliza para esperar a que los hilos terminen su ejecución antes de que el programa principal imprima el mensaje "Programa principal: Hilos finalizados". Recuerda que la salida exacta puede variar debido a la concurrencia de los hilos.


La ejecución del programa puede variar, ya que depende del sistema operativo y de cómo el planificador de hilos decida asignar tiempo de CPU a cada hilo.

Error al cargar imagen figura_6.png

Figura 6. Abstracción de hilos.

Reflexiona la siguiente pregunta que será tratada en la sesión de clase.

¿Hay diferencia en llamar a un proceso como hilo?