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; }
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.
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?