From c1d83410fde14ebdceff650839e73703f5a3040d Mon Sep 17 00:00:00 2001 From: Leandro Lucarella Date: Fri, 9 Jun 2006 05:40:11 +0000 Subject: [PATCH] =?utf8?q?Peque=C3=B1o=20documento=20con=20el=20dise=C3=B1?= =?utf8?q?o=20de=20exclusi=C3=B3n=20mutua=20para=20requerimientos=20concur?= =?utf8?q?rentes.?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- practicas/diseno_concurrente.rst | 43 ++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 practicas/diseno_concurrente.rst 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. + -- 2.43.0