Vous êtes sur la page 1sur 4

Practica 05-Algoritmos paralelos Realice un programa concurrente con uso de sincronizacin variable compartida (algoritmo de Dekker o Peterson), que

e simula la actividad del banco, en la cual las dos operaciones son realizadas por procesos diferentes. Suponga que el proceso se repite infinitamente. El programa concurrente se debe realizar en PascalFC. Planteamiento del problema El Banco. Supongamos un banco que tiene 20 cuentas, numeradas del 1 al 20, y cada cuenta tiene, inicialmente, S/. 100 de saldo. Por lo tanto, el banco tiene S/. 2 000. El banco realiza dos operaciones: 1. Contabiliza los saldos de todas las cuentas (cada minuto). 2. Traspasos de una cuenta a otra (cuentas elegidas aleatoriamente y el saldo aleatorio entre 0 y 10). ACTIVIDADES 1. Aplicar uno a uno los intentos de exclusion mutua y sincronizacion indicados en la teora. 2. Analizar las dos soluciones propuestas a continuacin.

Solucin 1: Aplicaremos el Algoritmo de Peterson con sincronizacin y exclusin mutua:


PROGRAM problema5; CONST NCTAS=20; kRunTime = 120; kSleepTime = 10; VAR Cuenta:array[1..NCTAS] of integer; i: Integer; finished : boolean; flag1 : boolean; flag2 : boolean; turn : integer; PROCESS ContarSaldos; VAR ci, Total: INTEGER; BEGIN while not finished do begin flag1 := true; turn := 2; while (flag2 and (turn = 2)) do begin null; end; Total:=0; FOR ci:=1 TO NCTAS DO Total:=Total + Cuenta[ci]; Writeln('Total del Banco:',Total); flag1 := false; end; END; (*MAIN*) BEGIN (*INICIAMOS LOS MONTOS DE 100 SOLES PARA CADA CUENTA*) For i:=1 TO NCTAS DO Cuenta[i]:=100; finished := false; flag1 := false; flag2 := false; turn := 1; (*EMPEZAMOS LOS PROCESOS*) COBEGIN supervisor; auditor; Operacion; ContarSaldos; COEND sleep(1); END.

c1:=RANDOM(NCTAS-1)+1; c2:=RANDOM(NCTAS-1)+1; Writeln('Cuentas Aleatorias',c1,' y',c2); cant:=0; IF(Cuenta[c1]>10) THEN cant:=RANDOM(10); Cuenta[c1]:=Cuenta[c1] - cant; Writeln('Nuevo Monto para Cuenta',c1,' es:',Cuenta[c1]); Cuenta[c2]:=Cuenta[c2] - cant; Writeln('Nuevo Monto para Cuenta',c2,' es:',Cuenta[c2]); flag2 := false; end; END; PROCESS AUDITOR; begin while not finished do begin sleep(random(kSleepTime)); writeln('Un Momento...'); end; end; process supervisor; begin sleep(kRunTime); finished := true; end;

PROCESS Operacion; VAR c1, c2, cant: Integer; BEGIN while not finished do begin flag2 := true; turn := 1; while (flag1 and (turn = 1)) do begin null; end;

En cdigo mostrado, se toman en cuenta dos operaciones: Operacin que son la operacin que se realiza entre dos cuenta aleatorias y ContarSaldos que es la cuenta recursiva cada minuto del proceso de saldo del banco. Le proceso de supervisor y auditor son patrones tomados del algoritmo de Peterson. Se muestra a continuacin los resultados del programa:
- Interpreter Version P5.3 Program banco ... execution begins ... Cuentas Aleatorias 5y Nuevo Monto para Cuenta Nuevo Monto para Cuenta Total del Banco: 1990 Cuentas Aleatorias 3y Nuevo Monto para Cuenta Nuevo Monto para Cuenta Total del Banco: 1988 Cuentas Aleatorias 8y Nuevo Monto para Cuenta Nuevo Monto para Cuenta 10 5 es: 10 es: 5 3 es: 5 es: 14 8 es: 14 es:

95 95 99 94 90 90

Solucin 2: Otro aplicando otro algoritmo de exclusin mutua de Dekker:


PROGRAM banco; CONST NCTAS=20; VAR Cuenta:array[1..NCTAS] of integer; i: Integer; finished : boolean; flag1 : boolean; flag2 : boolean;

PROCESS ContarSaldos; VAR ci, Total: INTEGER; BEGIN while not finished do begin sleep(1); while flag1 do begin null; end; flag2 := true; Total:=0; FOR ci:=1 TO NCTAS DO Total:=Total + Cuenta[ci]; Writeln('Total del Banco:',Total); flag2 := false; end; END;

PROCESS Operacion; VAR c1, c2, cant: Integer; BEGIN while not finished do begin while flag2 do begin null; end; (* flag1 := true; *) c1:=RANDOM(NCTAS-1)+1; c2:=RANDOM(NCTAS-1)+1; Writeln('Cuentas Aleatorias',c1,' y',c2); cant:=0; IF(Cuenta[c1]>10) THEN cant:=RANDOM(10); Cuenta[c1]:=Cuenta[c1] - cant; Writeln('Nuevo Monto para Cuenta',c1,' es:',Cuenta[c1]); Cuenta[c2]:=Cuenta[c2] + cant; Writeln('Nuevo Monto para Cuenta',c2,' es:',Cuenta[c2]); (* flag1 := false; *) end; END; (*MAIN*) BEGIN (*INICIAMOS LOS MONTOS DE 100 SOLES PARA CADA CUENTA*) For i:=1 TO NCTAS DO Cuenta[i]:=100; finished := false; flag1 := false; flag2 := false; (*EMPEZAMOS LOS PROCESOS*) COBEGIN Operacion; ContarSaldos; COEND END.

Vous aimerez peut-être aussi