Hilos
De Wiki de Sistemas Operativos
Revisión del 18:11 4 nov 2011 de Lorruimor (discusión | contribuciones)
- Hilo = "proceso ligero" = línea de ejecución
- En general, el planificador de procesos da el mismo tratamiento a los hilos y a los procesos.
- Proceso inicialmente parte con un único hilo
- El sistema operativo ofrece llamadas al sistema para crear hilos. Desde el código del programa, puedo hacer uso de estas llamadas al sistema para crear y destruir hilos.
- Cuando se crea un hilo, se le indica qué código se quiere que ejecute.
- Dos o más hilos, de un mismo proceso, comparten espacio de memoria.
- La conmutación de hilos es menos costosa que la conmutación de procesos.
Veamos un ejemplo diseñado para un solo procesador:
PA1 | .--- . . . PA2 | . ---. . . | . . . . PB | . . .---. | . . . . Pla |--. .--. . |__.______.__.___.>t
Con multiprocesamiento podemos ejecutar diferentes procesos a la vez. Si tenemos uno solo podemos desdoblarlo en hilos, usando técnicas de programación apoyadas en APIS (como POSIX threads).
Las principales ventajas del uso de hilos son:
- Menor penalización en cuanto a conmutación.
- Dos hilos de un mismo proceso pueden compartir memoria aprovechando mejor los recursos y eliminando los mecanismos de comunicación necesarios para soluciones implementadas en varios procesos.
- Con un solo procesador es posible que una línea de proceso haga uso de una llamada al sistema bloqueante. En este caso se puede llamar a otro hilo del mismo proceso en lugar de conmutar a otro proceso externo, ahorrando así tiempo de conmutación asociado a la ejecución del planificador de procesos.
Ejemplo
El siguiente es un código en C de ejemplo en el que se muestra la creación de dos hilos. Se hace uso de la llamada al sistema sleep que hace que el proceso pase a estado bloqueado durante N segundos. Nótese que al compartir la variable a, ambos hilos modifican su valor.
#include <stdio.h>
#include <pthread.h>
int a = 10;
void *codigo_hilo1(void *arg)
{
sleep(10);
a = a - 2;
printf("Soy el hilo 1 y la variable a vale %d\n", a);
return NULL;
}
void *codigo_hilo2(void *arg)
{
sleep(5);
a++;
printf("Soy el hilo 2 y la variable a vale %d\n", a);
return NULL;
}
int main(void)
{
pthread_t hilo1, hilo2;
pthread_create(&hilo1, NULL, codigo_hilo1, NULL);
pthread_create(&hilo2, NULL, codigo_hilo2, NULL);
pthread_join(hilo1, NULL);
pthread_join(hilo2, NULL);
}
Este ejemplo se compila en un terminal escribiendo: gcc -lpthread archivo.c