Dekker
Dekker
Dekker
Una vez que un proceso ha puesto su señal en verdadero, el otro proceso no puede
entrar en la sección critica hasta que el primer proceso salga de ella.
Variables
P1A, P2A: Bool;
Inicialización
P1A = false;
P2A = false;
P1 (Proceso 1) P2 (Proceso 2)
Repeat Repeat
Hace_Cosas(); Hace_Cosas();
While P2A Do; While P1A Do;
P1A = true; P2A = true;
REGION_CRITICA(); REGION_CRITICA();
P1A = False; P2A = False;
Hace_mas_cosas(); Hace_mas_cosas();
Until Fin Until Fin
Variables
P1, P2: Bool;
Inicialización
P1 = false;
P2 = false;
P1 (Proceso 1) P2(Proceso 2)
Repeat Repeat
Hace_Cosas(); Hace_Cosas ();
P1 = true; P1 = true;
While P2 Do; While P2 Do;
Begin Begin
P1 = false; P2 = false;
Delay (random()); Delay (random());
P1 = true; P2 = true;
end; end;
REGION_CRITICA(); REGION_CRITICA();
P1 = False; P2 = False;
Hace_mas_cosas(); Hace_mas_cosas();
Until Fin Until Fin
Prueba escritorio V4
Para cada proceso una variable, v0 para P0 y v1 para P1 respectivamente, que
indica si el correspondiente proceso está usando el recurso.
P0 P1
a: Bucle Bucle
b: Establecer v0 en verdadero Establecer v1 en verdadero
c: Espera hasta que v1 sea falso Espera hasta que v0 sea falso
d: SECCION CRITICA SECCION CRITICA
e: Establecer v0 en falso Establecer v0 en falso
f: SECCION NO CRITICA SECCION NO CRITICA
g: Fin del bucle Fin del bucle
Variables
P1, P2: Bool;
turno: Entero;
Inicialización
P1 = false;
P2 = false;
turno = 1;
P1 (Proceso 1) P2 (Proceso 2)
Repeat Repeat
Hace_Cosas(); Hace_Cosas();
P1 = true; P2 = true;
While P2 Do While P1 Do
Begin Begin
if(turno = 2) if(turno = 1)
Begin Begin
P2 = false; P1 = false;
Delay (random()); Delay (random());
P2 = true; P1 = true;
end; end;
end; end;
REGION_CRITICA(); REGION_CRITICA();
turno = 1; turno = 2;
P2 = False; P1 = False;
Hace_mas_cosas(); Hace_mas_cosas();
Until Fin Until Fin
Se realiza las tareas iniciales, luego se verifica si hay otro procesos que puede
entrar, si lo hay se entra al ciclo y si es el turno de algún otro proceso, cambia su
estado a ya no poder entrar a la sección crítica y nuevamente verifica si es el turno
de algún otro proceso, si lo es se queda en un ciclo hasta que se da un cambio de
turno, luego nuevamente retoma su estado de poder entrar a la sección critica,
regresa al ciclo y verifica si hay otro proceso que puede entrar entonces
nuevamente entra al ciclo, de lo contrario entra a la sección critica.
Quinta versión del algoritmo de Dekker Algoritmo Optimo, este algoritmo es una
combinación del algoritmo 1 y 4, este algoritmo garantiza la exclusión mutua, el
progreso y tiene una espera limitada.
ALGORITMO DE PETERSON.
bandera[0] = false
bandera[1] = false
turno // No es necesario asignar un turno
p0: bandera[0] = true p1: bandera[1] = true
turno = 1 turno = 0
while( bandera[1] && turno == 1 ); while( bandera[0] && turno == 0 );
{ //no hace nada; espera. } { //no hace nada; espera. }
// sección crítica // sección crítica
// fin de la sección crítica // fin de la sección crítica
bandera[0] = false bandera[1] = false
Algoritmos para N procesos
REFERENCIAS
https://es.wikipedia.org/wiki/Algoritmo_de_Dekker
http://aprendiendo-software.blogspot.com/2011/12/algoritmo-de-dekker-version-
5.html
http://algoritmosdekker.blogspot.com/2018/02/versiones-del-algoritmo-de-
dekker.html