Sunteți pe pagina 1din 9

Prctica 08: Ejercicio01 Programacin concurrente donde se crea dos procedimientos, que compara el mayor de dos nmeros, y donde

se define relacin de precedencia de cuatro Instrucciones.


(*Programa secuencial que muestra el orden de ejecucin de 4 Instrucciones *) program maxmincon; process type min(var min,n1,n2:real); begin if n1<n2 then min:=n1 else min:=n2; end; process type max(var max,n1,n2:real); begin if n1>n2 then max:=n1 else max:=n2; end; var n1,n2,nmax,nmin:real; pMax:max; pMin:min; begin n1:=17; n2:=8; (*I0*) cobegin pMin(nmin,n1,n2); (*I1*) pMax(nmax,n1,n2); (*I2*) coend; writeln(nmax,nmin) (*I3*) end.

Se Pide: a) Edita, Compila y Ejecuta el Programa b) Analiza y comenta los resultados c) Modifique el programa secuencial de modo que se ingrese los dos nmeros desde el teclado. Luego compile y ejecute el programa.

Ejercicio 02: Programacin concurrente en Pascal-FC. Implementacin de programas de sincronizacin condicional con espera activa. Implementar un programa concurrente en PascalFC que tenga los siguientes requisitos: El programa consta de 2 procesos. Cada proceso escribe por pantalla varias letras y termina. El proceso 1 debe escribir la letra PA1 y la letra PA2. El proceso 2 debe escribir la letra PB1 y la letra PB2. Los procesos deben sincronizarse para que se cumplan las siguientes relaciones de precedencia:

La sincronizacin condicional se deber implementar con espera activa. Algunas de las posibles salidas de este programa son: PA1 PA2 PB1 PB2 PA1 PB1 PA2 PB2 PB1 PA1 PA2 PB2 PB1 PA1 PB2 PA2 Algunas de las posibles salidas invlidas de este programa son: PB1 PB2 PA1 PA2 Solucin:
(*Programa secuencial que muestra el orden de ejecucin de 4 Instrucciones *)

program sinccond; process type tPA(var continuar:boolean); begin write('PA1 '); continuar := true; write('PA2 '); end; process type tPB(var continuar:boolean); begin write('PB1 '); while not continuar do ; write('PB2 ');

end;

var continuar: boolean; procA:tPA; procB:tPB; begin continuar := false; cobegin procA(continuar); procB(continuar); coend; end.

EXCLUSIN MUTUA Definicin del Problema Exclusin Mutua. Necesidad de asegurar que un nico proceso acceda a un conjunto de instrucciones que acceden un recurso compartido. Este conjunto de instrucciones se denominar Seccin Crtica. En que consiste el problema? Si dos procesos P1 y P2 utilizan una varia ble compar tida X, si ambos desean realizar alguna actualizacin de sta en alguna parte de su cdigo, tendramos: Process P1 Process P2 ... ... X := X+1 Seccin Crtica X:=X+1 ... ... Si ambos ejecuta n esa instruccin a la vez, podra oc urrir el escenario:

Solucin general <Fase denegociacin> Seccin Crtica <Fase deliberacin> Caractersticas Asegurar la Exclusin Mutua Permitir que los procesos accedan al recurso cuando este libre Asegurar que procesos fuera de la seccin crtica impidan el acceso de otros Preservar que todos los procesos hagan uso del recurso en un tiempo limitado No hacer suposiciones de tiempo

Tener presente el indeterminismo Problemas asociados Falta de Exclusin Interbloqueo (deadlock). Acceden a la SC pero ninguno progresa Espera indefinida (livelock). Ninguno Accede a al SC Postergacin indefinida (starvation/liveness/fairness)

PRESENTAR PARA EL INFORME:


Aplicando al caso de estudio del auditor banquero Implementar intentos de exclusin mutua con variables compartidas siguientes: Primer intento: alternancia Segundo intento: falta de exclusin Tercer intento: interbloqueo Cuarto intento: espera indefinida

Implementar los algoritmos con variables compartidas siguientes: Dekker, Peterson, Lamport, Dijkstra

ALGORITMO DE DEKKER PROGRAM Dekker; (* Sol ucin para 2 pr ocesos al problema de la exclusin mutua *) VAR turno: integer; p1quiere, p 2quiere : boolean; PROCESS P1; BEGIN ... p1quiere := true; WHILE p2quiere DO BEGIN p1quiere := false; WHILE turno = 2 DO null; p1quiere := true END; <Seccin_Crtica> turn o := 2; p1quiere := false ... END; (* P1 *) BEGIN turno := 1; p1quiere:=false; p2quiere:=false; COBEGIN P1;P2 COEND; END. PROCESS P 2; BEGIN ... p2quiere := true ; WHILE p1quiere DO BEGIN p2quiere := false; WHILE turno = 1 DO null; p2quiere := true END; <Seccin_Crtica> turno := 1; p2quiere := false ... END; (* P2 *)

ALGORITMO DE PERTERSON PROGRAM Peterson; (* solucn para dosprocesos a l problemade la exc lusin mutua *) VAR turn o : integer; band1, band2: boolean; PROCESS P1 ; BEGIN ... (* anuncia el intento de entrar *) band1:= true; (* le da prioridad a lotro proceso *) turno:= 2; while band2 and (turno = 2) do null; <seccin_crtica> band1:= false ... END; BEGIN turno := 1; band1 := false; band2 := false; COBEGIN P1; P2 COEND; END. PROCESS P 2; BEGIN ... (* anuncia el intento de en trar *) band2:= true ; turno:= 1; (* le da prioridad al otro proces o *) while band1 and (turno = 1) do null; <seccin_crtica> band2:= false ... END;

ALGORITMO DE LAMPORT (I) (* Alg oritmo para Exclusin Mutua n procesos *) PROGRAM Lamport; BEGIN (* Continua cin de la d eclaracin del CONST nprocs = 5; proceso *) VAR ... boleto: ARRAY[1..nprocs] of INTE GER; eleccion [esteproc] := true; eleccion: ARRAY[1..nprocs] of BOOLEAN; bolet o[esteproc] := max; lp: INTEGER; eleccion [esteproc] := false; FOR otroproc := 1 TO nprocs DO PROCESS TYPE Proc(esteproc: INT EGER); BEGIN VAR otroproc: INT EGER; WHILE eleccion[otroproc] DO null; WHILE favo reci do(otroproc , FUNCTION max: INTEGER; esteproc) DO nu ll; VAR i, largo: INTEGER ; END; Idea BEGIN <seccin_crtica>; Cada proceso obtiene uno[esteproc] := 0 largo := 0; bolet FOR i := 1 TO nprocs DO ... nmero IF boleto[i] > largo THEN END; (* Proc*) Necesidad largo := boleto[i]; VAR Ordenacin de los procesos max := lar go+ 1 p: ARRAY[1..nprocs] OF Proc; END; (* max *) Criter io de E leccin FUNCTION favorecido(i, j: INTE GER): Si A < B -> Pi BOOLEAN; BEGIN Si A > B -> Pj IF (boleto[i] = 0) or (boleto[i] > boleto[j]) Si A=B; Si i <j THEN favorec ido := false ELSE IF boleto[i] < boleto[j] THEN favorecido := true ELSE favorecido := (i < j) END; (* fav orecido *)

Sean Pi e Pj con nsBEGIN A y B. ->

FOR lp := 1 TO nproc s DO BEGIN boleto[lp] := 0; [lp] := false; Pi, sino eleccion Pj. END; COBEGIN FOR lp := 1 TO nprocs DO p[lp](lp) COEND; END.

ALGORITMO DE DIJKSTRA PROGRAM Dijkstra; (* Algoritmo para la excl usin mutua n procesos *) CONST nprocs=3; VAR b, c: ARRAY[0..nprocs] of BOOLEAN; turno: INTEGER ; i, : INTEGER ; PROCEDURE lock (pnum: INTEGER) ; VAR ok: BOOLEAN; j: I NTEGER; BEGIN b[pnum] := false ; REPEAT WHILE turno <> pnum DO BEGIN c[pnum]:= true; IF b[ turno] THEN turno := pnum END; (* wh ile *) c[pnum] := false ; ok := true; FOR j := 0 TO nprocs DO IF j <> pnum THEN ok := ok and c[j] UNTIL ok END; (* lock *) PROCEDURE unl ock(pnum: INTEGER); BEGIN c[pnum] := tr ue; b[pnum] := tr ue; turno := 0 END; (* unlock *)

PROCESS TYPE t(n:INTEGER); BEGIN ... lock( n); <seccin_crtica>; unlock(n) ... END; (* t *) VAR p: ARRAY[0..nprocs] OF t; BEGIN FOR turno := 0 TO nprocs DO BEGIN b[turno] := true; c[turno] := true END; turno := 0; COBEGIN FOR i := 0 TO nprocs DO p[i](i) COEND; END.

PETERSON

PROGRAM primerointentobanco; CONST NCTAS=20; VAR Cuenta : array[1..NCTAS] of integer; i,turno: integer; band1, band2: boolean; PROCESS Auditor; VAR ci, Total:INTEGER; BEGIN REPEAT band1:= true; (* le da prioridad a lotro proceso *) turno:= 2; while band2 and (turno = 2) do null; Total:=0; FOR ci:=1 TO NCTAS DO Total:= Total + Cuenta[ci]; Writeln('Total : ', Total); turno := 2; band1 := false; writeln('auditor'); FOREVER

END;

PROCESS banquero; VAR c1, c2, cant: Integer; BEGIN (* anuncia el intento de en trar *) band2:= true ; turno:= 1; (* le da prioridad al otro proces o *) while band1 and (turno = 1) do null; c1 := RANDOM(NCTAS-1)+1; (* Origen *) c2 := RANDOM(NCTAS-1)+1; (* Destino *) cant:=0; IF (Cuenta[c1]>10) THEN cant := RANDOM(10); Cuenta[c1] := Cuenta[c1] - cant ; Cuenta[c2] := Cuenta[c2] + cant ; band2:= false; write('banquero'); END; BEGIN (* Principal *) For i:= 1 TO NCTAS DO cuenta[i]:=100; turno:=1; band1 := false; band2 := false; COBEGIN writeln ('PROGRAMA BANQUERO - AUDITOR');

Auditor; Banquero; COEND END.

S-ar putea să vă placă și