]> git.llucax.com Git - z.facultad/75.74/practicos.git/commitdiff
Pequeño documento con el diseño de exclusión mutua para requerimientos
authorLeandro Lucarella <llucax@gmail.com>
Fri, 9 Jun 2006 05:40:11 +0000 (05:40 +0000)
committerLeandro Lucarella <llucax@gmail.com>
Fri, 9 Jun 2006 05:40:11 +0000 (05:40 +0000)
concurrentes.

practicas/diseno_concurrente.rst [new file with mode: 0644]

diff --git a/practicas/diseno_concurrente.rst b/practicas/diseno_concurrente.rst
new file mode 100644 (file)
index 0000000..81d5816
--- /dev/null
@@ -0,0 +1,43 @@
+===============================
+Sistemas Distribuidos I (75.74)
+===============================
+
+-------------------------------------------------
+Diseño de exclusión mutua de procesos concurentes
+-------------------------------------------------
+
+:Author: Leandro Lucarella (77891)
+
+Diseño
+======
+
+La solución más sencilla que se puede plantear es la utilización de un semáforo
+inicializado en 1 y una variable entera en memoria compartida, también
+inicializada en 1. Cada operación (request) tiene asociado un número de
+secuencia, que empieza en 1 y un booleano que indica si es el último (marca de
+fin). Cada proceso al comenzar hace un wait() al semáforo y verifica la variable
+compartida (turno) para ver si coincide con su número de secuencia. Si coincide
+es su turno y procesa el pedido. Finaliza aumentando el turno en 1 y haciendo un
+signal() al semáforo, de manera de despertar al próximo proceso. De esta forma
+nos aseguramos que los procesos se ejecuten en orden. El último proceso tendría
+asegurado que todos los demás se ejecutaron antes que él y podría realizar su
+procesamiento y enviar la respuesta sin problemas.
+
+Otra solución que no asegura orden pero puede aumentar la concurrencia sería
+tener una variable compartida (procesando) y un semáforo inicializado en 0.
+Todos los procesos, menos el que tiene la marca de fin, hacen el siguiente
+procesamiento::
+
+  ++cantidad;
+  procesar();
+  --cantidad;
+  if (cantidad == 0)
+      signal(semaforo);
+
+De manera que en cantidad siempre mantengo la cantidad de procesos que hay
+procesando. Al llegar a 0 (no hay más procesando), hago un signal() al semáforo
+para "despertar" al último proceso (el de la marca de fin), quien se quedaría
+esperando con un wait() sobre el semáforo apenas comienza. Al ser despertado,
+sabe que todo el resto de los procesos terminaron y que puede finalizar el
+procesamiento y enviar la respuesta.
+