La era de la informatica

Saturday, March 03, 2007

Solucion problema 2

Hola de nuevo. Ya ha terminado el plazo de 1 semana que di para resolver este segundo problema. Como habreis comprobado es algo trivial. Ambos codigos hacen algo parecido, esto es, mantener 2 hilos ejecutandose a la vez, uno de ellos se ejecuta primero, modificando una variable global y luego la imprime por pantalla. El otro hilo espera a que el primero termine y luego imprime la misma variable global por pantalla.

Esta es la salida del primer codigo por pantalla:
value = 5
value = 0

Esta es la salida del segundo codigo por pantalla:
value = 5
value = 5

La diferencia entre el primer codigo y el segundo es la llamada que se hace en el primer codigo a la función fork().

Como sabeis la llamada a la función fork crea un proceso "hijo" del proceso que se está ejecutando, copiando todo su espacio de direcciones en un nuevo lugar, de forma que con el mismo codigo se crean 2 procesos con ejecuciones totalmente independientes y con un espacio en memoria igual pero independiente.

En el primer codigo la creacion del hilo se hace dentro del proceso "hijo". Mientras el proceso padre espera a que el hijo termine. El hilo del proceso hijo modifica la variable global llamada "value", la imprime por pantalla y termina. Como esto se hace dentro del proceso hijo, aunque la variable global sea la misma (el espacio de memoria es igual), este cambio no se ve reflejado en el proceso padre (los espacios de memoria son iguales pero independientes), ya que se trata solo de una copia.

En el segundo codigo se ejecuta un solo proceso. En este proceso se crea un hilo que hace lo mismo que en el primer codigo, modificar la variable global "value" e imprimirla por pantalla. Ya que no llamamos a fork, la API de hilos no crea un espacio de memoria independiente, sino que permite que en el mismo proceso haya 2 hios de ejecucion sobre el mismo codigo y la misma memoria, es decir compartiendo absolutamente todo el espacio de memoria. Por tanto al modificar el hilo la variable global este cambio es "visto" por todos los hilos del proceso en ejecucion. Por tanto en el segundo codigo ambos hilos de ejecucion imprimen por pantalla el nuevo valor de la variable "value".

Como veis este problema era muy sencillo, solo hacia falta saber que con fork se copia el espacio de direcciones de un proceso y se crea un proceso hijo con un espacio de direcciones igual pero independiente. Mientras que al crear simplemente hilos se crean 2 ejecuciones independientes pero compartiendo el mismo espacio de direcciones ambas. Lo cual permite que se compartan recursos facilmente entre varios procesos, pero esto se debe de hacer con cautela, ya que el acceso simultaneo de varios procesos a la misma zona de memoria puede acabar en resultados indeseados.

Hasta la proxima

0 Comments:

Post a Comment

<< Home