Sunteți pe pagina 1din 4

PRACTICA 09 DE 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 losprocesos accedan al recurso cuando este libre Asegurar que procesos fuera de la seccin crticaimpidan el acceso de otros Preservarque todos los procesos hagan uso del recurso en un tiempo limitado No hacersuposiciones de tiempo Tenerpresente 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) PROGRAM Lamport; (* Alg oritmo para Exclusin Mutua n procesos *) CONST nprocs = 5; VAR boleto: ARRAY[1..nprocs] of INTE GER; eleccion: ARRAY[1..nprocs] of BOOLEAN; lp: INTEGER; PROCESS TYPE Proc(esteproc: INT EGER); VAR Idea otroproc: INT EGER; Cada proceso obtie neun nmero FUNCTION max: INTEGER; Necesidad VAR Ordenacin de los procesos i, largo: INTEGER ; BEGIN Criter io de E leccin largo := 0; Sean Pi e Pj con ns A y B. FORi := 1 TO nprocs DO Si A < B Pi IF boleto[i] > largo THEN Si A > B Pj largo := boleto[i]; Si A=B; Si i <j Pi, sino Pj. max := lar go+ 1 END; (* max *) FUNCTION favo reci do(i, j: INTE GER): BOOLEAN; BEGIN IF (boleto[i] = 0) or (boleto[i] > boleto[j]) THEN favorec ido := false ELSE IF boleto[i] < boleto[j] THEN favoreci do := true ELSE favoreci do := (i < j) END; (* fav orecido *) ALGORITMO DE LAMPORT (II) (* Continua cin de la d eclaracin del proceso *) BEGIN ... eleccion [esteproc] := true; bolet o[esteproc] := max; eleccion [esteproc] := false; FOR otroproc := 1 TO nprocs DO BEGIN WHILE eleccion[otroproc] DO null; WHILE favo reci do(otroproc , esteproc) DO nu ll; END; <seccin_crtica>; bolet o[esteproc] := 0 ... END; (* Proc*) VAR p: ARRAY[1..nprocs] OF Proc; BEGIN FOR lp := 1 TO nproc s DO BEGIN boleto[lp] := 0; eleccion [lp] := false; 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.

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