Hilos

De Wiki de Sistemas Operativos
Saltar a: navegación, buscar
  • 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