Diferencia entre revisiones de «Hilos»

De Wiki de Sistemas Operativos
Saltar a: navegación, buscar
 
(No se muestran 24 ediciones intermedias de 14 usuarios)
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.
+
Un hilo es una línea de ejecución de un proceso. Todo proceso parte inicialmente con un único hilo principal, aunque el sistema operativo ofrece llamadas al sistema que permiten al programador crear y destruir hilos. Por tanto, un proceso está compuesto por uno o más hilos.
  
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.
+
Los estados de un hilo son iguales a los de un proceso, por tanto, un hilo puede estar en estado preparado, bloqueado o activo en un cierto instante de tiempo. La conmutación entre hilos de un proceso es menos costosa que la conmutación de procesos, por tanto, el [[Planificador_de_procesos|planificador]] tiende a conmutar entre hilos de un proceso siempre que el proceso en su conjunto no haya agotado el tiempo máximo de asignación del procesador.
  
É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.
+
Los hilos nos permiten aprovechar la existencia de más de un procesador en el sistema, puesto que podemos asignar un hilo a cada uno de los procesadores que haya disponibles. Si hay más de un procesador, dos hilos de un mismo proceso pueden estar en estado activo simultáneamente. Por tanto, la programación con hilos nos permite sacar partido de las arquitecturas de multiprocesador que predominan en la actualidad.
  
El concepto de '''hilo''' aparece para arreglar estos problemas:
+
Cuando se crea un hilo, el programador indica qué código ejecuta. Los hilos de un mismo proceso comparten el mismo espacio de memoria, por tanto, dos hilos del mismo proceso pueden compartir estructuras de datos,variables, código, archivos abiertos... Al acceder a los recursos del sistema de manera compartida, las tareas realizan un consumo de recursos inferior.
  
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.
+
Veamos un ejemplo diseñado para un solo procesador:
  
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.
+
[[Archivo:Uso_del_procesador_hilos.svg]]
  
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.
+
Con multiprocesamiento podemos ejecutar diferentes procesos a la vez. Si tenemos un solo proceso podemos desdoblarlo en múltiples hilos.
 +
Para aumentar su eficiencia, un programa en ejecución debe crear tantos hilos como el doble del número de procesadores de los que disponga el sistema. Por ejemplo: 4 hilos para un programa ejecutado con 2 procesadores.  -> Número de hilos = Número de tareas realizadas "simultáneamente".  
  
El mismo sistema operativo usa el sistema de hilos para la programación de sus actividades.
+
Las principales ventajas del uso de hilos son:
  
Veamos un ejemplo diseñado para un solo procesador:
+
*'''Menor penalización''' en cuanto a conmutación. Ya que sólo se produce un salto en la ejecución de código del proceso, no interviene el planificador de procesos.
 +
 
 +
*Dos hilos de un mismo proceso '''comparten 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 que haga que el proceso pase a estado bloqueado. 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.
 +
 
 +
¿Tareas simultaneas? EXPLICACIÓN:
 +
 
 +
Aunque un núcleo solo puede realizar una tarea a la vez, podemos usar los hilos para hacer creer al usuario ( y al ordenador ) que sí se puede hacer más de una tarea al mismo tiempo. En lugar de realizar una tarea al completo, se divide en porciones ( cada hilo se encarga de un aspecto concreto del programa ), de modo que se van alternando entre porciones de distintas tareas para que parezca que ambas se están ejecutando simultáneamente.
 +
 
 +
 
 +
= 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);
  
PA1 |  .---  .  .  . 
+
pthread_join(hilo1, NULL);
PA2 |  .  ---.  .  .
+
pthread_join(hilo2, NULL);
    |  .      .  .  .   
+
}
PB  |  .      .  .---.   
+
</source>
    |  .      .  .  .
 
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).
+
Este ejemplo se compila en un terminal escribiendo: '''gcc archivo.c  -lpthread'''
  
Las principales ventajas del uso de hilos son:
 
  
*Menor penalización en cuanto a conmutación.
+
[[Ejercicios_Procesos | Ejercicios]]
  
*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, ahorrando asi tiempo de espera al no ejecutar el planificador.
+
4.1.[[Planificación de procesos| La planificación de procesos]]

Revisión actual del 18:23 2 abr 2020

Un hilo es una línea de ejecución de un proceso. Todo proceso parte inicialmente con un único hilo principal, aunque el sistema operativo ofrece llamadas al sistema que permiten al programador crear y destruir hilos. Por tanto, un proceso está compuesto por uno o más hilos.

Los estados de un hilo son iguales a los de un proceso, por tanto, un hilo puede estar en estado preparado, bloqueado o activo en un cierto instante de tiempo. La conmutación entre hilos de un proceso es menos costosa que la conmutación de procesos, por tanto, el planificador tiende a conmutar entre hilos de un proceso siempre que el proceso en su conjunto no haya agotado el tiempo máximo de asignación del procesador.

Los hilos nos permiten aprovechar la existencia de más de un procesador en el sistema, puesto que podemos asignar un hilo a cada uno de los procesadores que haya disponibles. Si hay más de un procesador, dos hilos de un mismo proceso pueden estar en estado activo simultáneamente. Por tanto, la programación con hilos nos permite sacar partido de las arquitecturas de multiprocesador que predominan en la actualidad.

Cuando se crea un hilo, el programador indica qué código ejecuta. Los hilos de un mismo proceso comparten el mismo espacio de memoria, por tanto, dos hilos del mismo proceso pueden compartir estructuras de datos,variables, código, archivos abiertos... Al acceder a los recursos del sistema de manera compartida, las tareas realizan un consumo de recursos inferior.

Veamos un ejemplo diseñado para un solo procesador:

Uso del procesador hilos.svg

Con multiprocesamiento podemos ejecutar diferentes procesos a la vez. Si tenemos un solo proceso podemos desdoblarlo en múltiples hilos. Para aumentar su eficiencia, un programa en ejecución debe crear tantos hilos como el doble del número de procesadores de los que disponga el sistema. Por ejemplo: 4 hilos para un programa ejecutado con 2 procesadores. -> Número de hilos = Número de tareas realizadas "simultáneamente".

Las principales ventajas del uso de hilos son:

  • Menor penalización en cuanto a conmutación. Ya que sólo se produce un salto en la ejecución de código del proceso, no interviene el planificador de procesos.
  • Dos hilos de un mismo proceso comparten 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 que haga que el proceso pase a estado bloqueado. 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.

¿Tareas simultaneas? EXPLICACIÓN:

Aunque un núcleo solo puede realizar una tarea a la vez, podemos usar los hilos para hacer creer al usuario ( y al ordenador ) que sí se puede hacer más de una tarea al mismo tiempo. En lugar de realizar una tarea al completo, se divide en porciones ( cada hilo se encarga de un aspecto concreto del programa ), de modo que se van alternando entre porciones de distintas tareas para que parezca que ambas se están ejecutando simultáneamente.


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 archivo.c -lpthread


Ejercicios


4.1. La planificación de procesos