Académique Documents
Professionnel Documents
Culture Documents
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.
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
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.