]> git.llucax.com Git - z.facultad/75.74/practicos.git/blob - practicas/diseno_concurrente.rst
Pequeño documento con el diseño de exclusión mutua para requerimientos
[z.facultad/75.74/practicos.git] / practicas / diseno_concurrente.rst
1 ===============================
2 Sistemas Distribuidos I (75.74)
3 ===============================
4
5 -------------------------------------------------
6 Diseño de exclusión mutua de procesos concurentes
7 -------------------------------------------------
8
9 :Author: Leandro Lucarella (77891)
10
11 Diseño
12 ======
13
14 La solución más sencilla que se puede plantear es la utilización de un semáforo
15 inicializado en 1 y una variable entera en memoria compartida, también
16 inicializada en 1. Cada operación (request) tiene asociado un número de
17 secuencia, que empieza en 1 y un booleano que indica si es el último (marca de
18 fin). Cada proceso al comenzar hace un wait() al semáforo y verifica la variable
19 compartida (turno) para ver si coincide con su número de secuencia. Si coincide
20 es su turno y procesa el pedido. Finaliza aumentando el turno en 1 y haciendo un
21 signal() al semáforo, de manera de despertar al próximo proceso. De esta forma
22 nos aseguramos que los procesos se ejecuten en orden. El último proceso tendría
23 asegurado que todos los demás se ejecutaron antes que él y podría realizar su
24 procesamiento y enviar la respuesta sin problemas.
25
26 Otra solución que no asegura orden pero puede aumentar la concurrencia sería
27 tener una variable compartida (procesando) y un semáforo inicializado en 0.
28 Todos los procesos, menos el que tiene la marca de fin, hacen el siguiente
29 procesamiento::
30
31   ++cantidad;
32   procesar();
33   --cantidad;
34   if (cantidad == 0)
35       signal(semaforo);
36
37 De manera que en cantidad siempre mantengo la cantidad de procesos que hay
38 procesando. Al llegar a 0 (no hay más procesando), hago un signal() al semáforo
39 para "despertar" al último proceso (el de la marca de fin), quien se quedaría
40 esperando con un wait() sobre el semáforo apenas comienza. Al ser despertado,
41 sabe que todo el resto de los procesos terminaron y que puede finalizar el
42 procesamiento y enviar la respuesta.
43