Diferencia entre revisiones de «Hilos»
De Wiki de Sistemas Operativos
(actualización) |
|||
Línea 1: | Línea 1: | ||
− | + | * 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 | + | * 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 | + | * La conmutación de hilos es menos costosa que la conmutación de procesos. |
− | |||
− | |||
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 | + | *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);
}