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