From: Leandro Lucarella Date: Fri, 9 Jun 2006 05:40:11 +0000 (+0000) Subject: Pequeño documento con el diseño de exclusión mutua para requerimientos X-Git-Tag: svn_import~46 X-Git-Url: https://git.llucax.com/z.facultad/75.74/practicos.git/commitdiff_plain/c1d83410fde14ebdceff650839e73703f5a3040d?hp=659563a75d668130df84664e7e6b1220667cbc28 Pequeño documento con el diseño de exclusión mutua para requerimientos concurrentes. --- diff --git a/practicas/diseno_concurrente.rst b/practicas/diseno_concurrente.rst new file mode 100644 index 0000000..81d5816 --- /dev/null +++ b/practicas/diseno_concurrente.rst @@ -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. +