3. Primer algoritmo de Dekker PROGRAMA UNO; Variables turno: Entero; Inicialización turno = 1; La variable turno obliga a que los procesos tengan que alternar turnos de acceso a la RC, si existen procesos lentos y rápidos se tiene el problema que los procesos lentos atrasen a los procesos rápidos, por lo que se presenta el problema de SINCRONIZACIÓN FORZADA. Repeat Repeat Hace_Cosas(); Hace_Algo(); While turno = 2 Do; While turno = 1 Do; REGION_CRITICA(); REGION_CRITICA(); turno = 2; turno = 1; Hace_mas_cosas(); Hace_algo_mas(); Until Fin Until Fin PROCESO UNO PROCESO DOS
4. Segundo algoritmo de Dekker PROGRAMA DOS; Variables P1QE, P2QE: Bool; Inicialización P1QE = false; P2QE = false; Si el Quantum de tiempo de los procesos finaliza precisamente después del cambio de la variable P#QE, pero antes de la validación del While, puede darse que las dos condiciones sean verdaderas y los procesos se queden en un ciclo infinito, a este problema se le conoce como INTERBLOQUEO. Repeat Repeat Hace_Cosas(); Hace_Cosas(); P1QE = true; P2QE = true; While P2QE Do; While P1QE Do; REGION_CRITICA(); REGION_CRITICA(); P1QE = False; P2QE = False; Hace_mas_cosas(); Hace_mas_cosas(); Until Fin Until Fin PROCESO UNO PROCESO DOS
5. Tercer algoritmo de Dekker PROGRAMA TRES; Variables P1A, P2A: Bool; Inicialización P1A = false; P2A = false; Si el Quantum de tiempo de los procesos finaliza precisamente después de la validación del While justo cuando ambas banderas tiene como valor “false” , pero antes del cambio en la variable P#A, puede presentarse el problema que ambos procesos ingresen a la región crítica al mismo tiempo, por lo que este algoritmo NO GARANTIZA EXCLUSIÓN MUTUA. 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 PROCESO UNO PROCESO DOS
6. Cuarto algoritmo de Dekker PROGRAMA CUATRO; Variables P1QE, P2QE: Bool; Inicialización P1QE = false; P2QE = false; El utilizar un tiempo random para forzar la salida en el ciclo While puede ser un tiempo muy largo o corto de sincronización que podría no darse en el peor de los casos, a este problema se le conoce como POSTERGACIÓN INDEFINIDA. Repeat Repeat Hace_Cosas(); Hace_Cosas(); P1QE = true; P2QE = true; While P2QE Do Begin P1QE = false; Delay (random()); P1QE = true; end; While P1QE Do Begin P2QE = false; Delay (random()); P2QE = true; end; REGION_CRITICA(); REGION_CRITICA(); P1QE = False; P2QE = False; Hace_mas_cosas(); Hace_mas_cosas(); Until Fin Until Fin PROCESO UNO PROCESO DOS
7.
8. Quinto algoritmo de Dekker PROGRAMA CINCO; Variables P1QE, P2QE: Bool; turno: Entero; Inicialización P1QE = false; P2QE = false; turno = 1; Combinación entre el algoritmo 1 y algoritmo 4 Repeat Repeat Hace_Cosas(); Hace_Cosas(); P1QE = true; P2QE = true; While P2QE Do Begin if(turno = 2) Begin P1QE = false; Delay (random()); P1QE = true; end; end; While P1QE Do Begin if(turno = 1) Begin P2QE = false; Delay (random()); P2QE = true; end; end; REGION_CRITICA(); REGION_CRITICA(); turno = 2; P1QE = False; turno = 1; P2QE = False; Hace_mas_cosas(); Hace_mas_cosas(); Until Fin Until Fin PROCESO UNO PROCESO DOS