Práctica: Cálculo Multiproceso usando cerrojos

El área bajo la curva $ y = \frac{1}{1+x^2}$ entre 0 y $ 1$ nos proporciona un método para calcular $ \pi $:

$\displaystyle \int_{0}^{1} \frac{4}{(1+x^2)} dx = 4 \arctan(x) \vert _{0}^{1} = 4 ( \frac{\pi}{4} - 0) = \pi $

Esta integral puede aproximarse por la suma:

$\displaystyle \pi \simeq \sum_{i=0}^{N-1} \frac{4}{N \times \left (1+ (\frac{i+0.5}{N})^2 \right)}$ (3.1)

La suma puede hacerse en paralelo.

Escriba un programa Perl que calcule $ \pi $ usando varios procesos cada uno de los cuales calcula una parte de la suma asociada con la integral anterior. Utilice flock para sincronizar los procesos. Observe si hay diferencia entre ejecutarlo en un entorno NFS o no.

Casiano Rodríguez León
2010-03-22
O_APPEND Añadir O_TRUNC Truncar O_EXCL Parar si el fichero existe O_NONBLOCK Sin bloqueo

Ejercicio 3.5.1   Lea la columna Cleaning Up Log files http://www.stonehenge.com/merlyn/UnixReview/col23.html de Randall Schwartz para ams ejemplos de como usar flock.



Subsecciones
Casiano Rodríguez León
2010-04-19
waitpid de la línea 33 cosecha posteriormente al zombi resultante de p1. Observe que bajo estas circunstancias la condición de la línea 36 'defined $child_registry{$child}{return_value}' es cierta.

Por último se calcula el valor de retorno. La variable $return_values contendrá un hash anónimo con las parejas formadas por el nombre lógico del proceso y su valor de retorno si la llamada a prun usó el formato con nombres. En otro caso $return_values contiene una referencia a un array con los valores de retorno. Para ordenar los valores de retorno (líneas 52 y 53) es necesario usar el criterio de comparación numérica ($a->{name} <=> $b->{name}).

49     # store return values using appropriate data type
50     $return_values = $named
51         ? { map { $_->{name} => $_->{return_value} } values %child_registry }
52         : [ map { $_->{return_value} } sort { $a->{name} <=> $b->{name} } 
53                 values %child_registry 
54           ];
55 
56     my $num_blocks = keys %blocks;
57     return 1 if ( $successes == $num_blocks );  # all good!
58 
59     $error = "only $successes of $num_blocks blocks completed successfully";
60     return 0;  # sorry... better luck next time
61 }
El número de claves en %blocks es el número total de procesos.

Ejercicio 3.8.1   Lea en avance la sección 3.3. Use el debugger de perl para estudiar la conducta de un programa con forks de manera que le ayude a comprender el código de prun.

Casiano Rodríguez León
2010-04-20