Las
mejores preguntas (y algunas respuestas)
En
esta página se irán recopilando las mejores preguntas realizadas tanto en clase
como por mail, sobre Paralelismo y Concurrencia en Sistemas. Si usted desea
hacer una pregunta, responder alguna, enviar una pregunta interesante junto con
su respuesta, o realizar algún comentario sobre alguna de las respuestas
ofrecidas, simplemente envíe un e-mail.
Obs:
Si desea que su nombre NO figure junto con la pregunta, aclárelo en el mail y
la pregunta será incluida en forma anónima.
Pregunta: Fernando Sagui (en clase 27/8/03)
¿Si varios procesos hacen
LOCK(S) y quedan esperando (spinning) se tiene en cuenta el orden de llegada
cuando
algún otro proceso hace
UNLOCK(S)?
Respuesta:
La pregunta
es muy interesante porque de no existir ese orden, entonces podría darse el
caso que un proceso se quede para siempre esperando un UNLOCK y siempre haber
otro proceso que se lo “roba”.
Según la
definición de LOCK como un bucle de “busy waiting” no habría ningún orden
asociado,
sin embargo,
parecería ser que la implementación de Multi-Pascal si conserva el orden de
llegada y los procesos son liberados en ese orden.
Ejecute el
programa spin.mp y observe como se liberan los procesos.
Pregunta: Guillermo Ayala (mail 4/9/03)
La operación C? sobre un
canal ¿es exclusiva? o puede suceder por ejemplo en
IF C? THEN e:=C;
si el canal
tiene un único elemento, dos procesos pasen la condición del IF y uno consuma
el elemento y el otro se quede esperando.
Si es así, la solución sería poner el IF entre un Lock y Unlock y así
evitar deadlocks
Respuesta:
Es cierto,
varios procesos pueden sensar un canal con C? y cuando van a leer el elemento
otro proceso ya lo sacó.
La propuesta
de Guillermo es correcta.
El programa canal.mp fue construido para ejemplificar esta situación.
Pregunta: Dana Urribarri (en clase 30/8/04)
¿Qué valores de ‘ i ’ lee
el procedimiento “PutinPlace” si no usa parámetro en la versión de “rank sort”
del libro de Lester93?
Respuesta:
Claramente,
para que el procedimiento lea los valores correctos de ‘ i ’ debe usar un
parámetro. Pero, cuando no lo utiliza y se declara la variable ‘ i ’ como
global, ¿qué pasa?
Si en
“FORALL i:= 1 TO N DO…” tuviéramos el comportamiento de un FOR convencional, el
procedimiento podría leer N (si el proceso padre terminó de crear todos sus
hijos) o algún valor intermedio.
Sin embargo,
el entorno del índice del FORALL está limitado al cuerpo de la sentencia del
FORALL, y no modifica el valor de la variable global. Esto es, dentro del
cuerpo del FORALL, la variable ‘ i ’ se comporta como una variable local.
Entonces, el
procedimiento va a leer el valor que tenía ‘ i ’ antes de la ejecución
del FORALL. Incluso, al terminar el FORALL, la variable no queda en N sino en
su valor previo a la ejecución del FORALL (no se modifica).
El planteo
de Dana fue correcto.
Las
variantes de este problema se encuentran en cuatro pequeños programas que
demuestran el comportamiento explicado: forall1.mp, forall2.mp, forall3.mp, forall4.mp.
Pregunta: Virginia Perez (clase 30/8/04)
Al simular
un spinlock con un channel como plantea [Lester93], si un proceso hace varios
“unlocks” seguidos antes de un “lock”, ¿no se acumularían los “unlocks” en el
channel, produciendo un efecto diferente al del verdadero unlock con spinlocks?
Respuesta: Si.
Se
produciría un efecto diferente. La única forma de garantizar que sea
equivalente es que
el
programador ponga siempre un “lock” antes de un “unlock”.