Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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:
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:
PROGRAM problema5;
CONST NCTAS=20; c1:=RANDOM(NCTAS-1)+1;
kRunTime = 120; c2:=RANDOM(NCTAS-1)+1;
kSleepTime = 10; Writeln('Cuentas Aleatorias',c1,' y',c2);
cant:=0;
VAR Cuenta:array[1..NCTAS] of integer; IF(Cuenta[c1]>10) THEN cant:=RANDOM(10);
i: Integer; Cuenta[c1]:=Cuenta[c1] - cant;
finished : boolean; Writeln('Nuevo Monto para Cuenta',c1,' es:',Cuenta[c1]);
flag1 : boolean; Cuenta[c2]:=Cuenta[c2] - cant;
flag2 : boolean; Writeln('Nuevo Monto para Cuenta',c2,' es:',Cuenta[c2]);
turn : integer; flag2 := false;
end;
PROCESS ContarSaldos; END;
VAR ci, Total: INTEGER;
BEGIN
while not finished do PROCESS AUDITOR;
begin begin
flag1 := true; while not finished do
turn := 2; begin
while (flag2 and (turn = 2)) do sleep(random(kSleepTime));
begin writeln('Un Momento...');
null; end;
end; end;
Total:=0;
FOR ci:=1 TO NCTAS DO process supervisor;
Total:=Total + Cuenta[ci]; begin
Writeln('Total del Banco:',Total); sleep(kRunTime);
finished := true;
flag1 := false; end;
end;
(*MAIN*)
END; BEGIN
(*INICIAMOS LOS MONTOS DE 100 SOLES PARA
CADA CUENTA*)
For i:=1 TO NCTAS DO Cuenta[i]:=100;
finished := false;
PROCESS Operacion; flag1 := false;
VAR c1, c2, cant: Integer; flag2 := false;
BEGIN turn := 1;
while not finished do
begin (*EMPEZAMOS LOS PROCESOS*)
flag2 := true; COBEGIN
turn := 1; supervisor;
while (flag1 and (turn = 1)) do auditor;
begin Operacion;
null; ContarSaldos;
end;
COEND
sleep(1); 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.
Cuentas Aleatorias 5y 10
Nuevo Monto para Cuenta 5 es: 95
Nuevo Monto para Cuenta 10 es: 95
Total del Banco: 1990
Cuentas Aleatorias 3y 5
Nuevo Monto para Cuenta 3 es: 99
Nuevo Monto para Cuenta 5 es: 94
Total del Banco: 1988
Cuentas Aleatorias 8y 14
Nuevo Monto para Cuenta 8 es: 90
Nuevo Monto para Cuenta 14 es: 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;
COEND
END.