Diferencia entre revisiones de «Hilos»

De Wiki de Sistemas Operativos
Saltar a: navegación, buscar
(actualización)
Línea 1: Línea 1:
En un sistema basado en '''hilos''', los procesos poseen internamente varias líneas (hilos) de ejecución, en contraposición de la visión clásica de la ejecución lineal.
+
* Hilo = "proceso ligero" = línea de ejecución
  
Dentro de los programas, con frecuencia, aparecen ciertos sectores independientes entre sí. En un sistema con multiprogramación, podemos tomar cada sección como procesos independientes ya que la permutación en el orden de ejecución no altera el resultado final. Si alguna de estas secciones presentase algún estado de bloqueo, se sumaría al tiempo global de todo el proceso. Éste tiempo se vería reducido al encontrarnos en un sistema multiprogramado.
+
* En general, el planificador de procesos da el mismo tratamiento a los hilos y a los procesos.
  
Ésta división en múltiples procesos provoca que en memoria se deba reservar un espacio para cada uno y que tras la consecución de cada uno, haya que reunirs todos los resultados en un único espacio de memoria. Otra opción para evitar este problema es el uso de un espacio de memoria común, pero esta solución acarrea consigo problemas de violación de privilegios y protección de memoria.
+
* Proceso inicialmente parte con un único hilo
  
El concepto de '''hilo''' aparece para arreglar estos problemas:
+
* 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.
  
Las líneas internas del proceso se desarrollan sobre el mismo espacio de memoria (la asignada al proceso original). Al ser líneas de ejecución diferentes, poseen su puntero de instrucción, sus valores para los registros de trabajo y su propia pila. No existe la protección entre las diferentes líneas de ejecución, por lo que una sola línea podría destruir el trabajo de las demás, de forma que es el programador el que tiene la responsabilidad de proteger la memoria entre los distintos hilos.
+
* Cuando se crea un hilo, se le indica qué código se quiere que ejecute.
  
Al usar un espacio de memoria común, la comunicación entre los hilos es más directa que entre procesos independientes con su propio espacio reservado.
+
* Dos o más hilos comparten espacio de memoria.
  
La implantación del concepto de hilo desemboca en la necesidad de llamadas al sistema específicas para el tratamiento de hilos, tales como: creación de hilos, destrucción de hilos, suspensión, esperas, etc.
+
* La conmutación de hilos es menos costosa que la conmutación de procesos.
 
 
El mismo sistema operativo usa el sistema de hilos para la programación de sus actividades.
 
  
 
Veamos un ejemplo diseñado para un solo procesador:
 
Veamos un ejemplo diseñado para un solo procesador:
Línea 34: Línea 32:
 
*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.
 
*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 llame 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.
+
*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.
 +
 
 +
<source lang="c">
 +
#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);
 +
}
 +
</source>

Revisión del 11:04 14 oct 2011

  • 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 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);
}