Secciones crı́ticas y exclusión mutua Lecturas: Andrews, secciones 3.1, 3.2, 3.3, 3.4 Ben-Ari, sección 2.2 Manuel Carro Universidad Politécnica de Madrid Este texto se distribuye bajo los términos de la Creative Commons License M. Carro (UPM) Exclusión mutua 1/1 Secciones crı́ticas El primer problema a resolver Código fuente −→ Código compilado X := X + X; (a) Load MemPos1, Accum (b) Add MemPos1, Accum (c) Sto Accum, MemPos1 Regular acceso a X := X + X Sólo una tarea a la vez: exclusión mutua Sección crı́tica del programa (reduce número ejecuciones posibles) Esquema Protocolo de entrada Sección crı́tica Protocolo de salida M. Carro (UPM) Exclusión mutua 2/1 Secciones crı́ticas Sección crı́tica Soluciones software y hardware I I Hardware: instrucciones especializadas (Test and Set y Swap) Software: algoritmos exclusión mutua / soporte S.O. Muchos algoritmos de exclusión mutua I I I I Peterson (lo veremos) Dekker (Ben-Ari, Cáp. 3) Panaderı́a, Tickets (Andrews, Cáp. 3) etc. M. Carro (UPM) Exclusión mutua 3/1 Secciones crı́ticas Exclusión mutua Ejemplo de necesidad de exclusión mutua: shvar without mutex.adb I I Variables vistas por varios procesos Accesos indiscriminados −→ resultados erróneos Intentaremos implementación protocolos entrada / salida Supondremos atomicidad sentencias Ada Suposición: procesos no mueren en I Sección crı́tica I Protocolos entrada / salida M. Carro (UPM) Protocolo de entrada Sección crı́tica Protocolo de salida Exclusión mutua 4/1 Desarrollo de un algoritmo El tren de los Andes (andes{1,2,3,4,5}.adb) Dos trenes cruzan el mismo puente Diferentes velocidades / recorridos Sincronización entrada / salida puente M. Carro (UPM) Exclusión mutua 5/1 Desarrollo de un algoritmo El tren de los Andes Primer intento de exclusión mutua type Tipo Turno is (Dcha, Izq); T: Tipo Turno:= Dcha; loop while ( T / = I z q ) loop null ; end loop ; .... T : = Dcha ; end loop ; M. Carro (UPM) loop while ( T / = Dcha ) loop null ; end loop ; .... T := Izq ; end loop ; Exclusión mutua 6/1 Desarrollo de un algoritmo El tren de los Andes Segundo intento de exclusión mutua B o t e I z q : Boolean : = False ; Bote Dcho : Boolean : = False ; loop while Bote Dcho loop null ; end loop ; B o t e I z q : = True ; .... B o t e I z q : = False ; end loop ; loop while B o t e I z q loop null ; end loop ; Bote Dcho : = True ; .... Bote Dcho : = False ; end loop ; Bote i = True sii tren i está cruzando M. Carro (UPM) Exclusión mutua 7/1 Desarrollo de un algoritmo El tren de los Andes Tercer intento de exclusión mutua B o t e I z q : Boolean : = False ; Bote Dcho : Boolean : = False ; loop B o t e I z q : = True while Bote Dcho loop null ; end loop ; .... B o t e I z q : = False ; end loop ; loop Bote Dcho : = True while B o t e I z q loop null ; end loop ; .... Bote Dcho : = False ; end loop ; M. Carro (UPM) Exclusión mutua 8/1 Desarrollo de un algoritmo El tren de los Andes Cuarto intento de exclusión mutua B o t e I z q : Boolean : = False ; Bote Dcho : Boolean : = False ; loop B o t e I z q : = True ; while Bote Dcho loop B o t e I z q : = False ; B o t e I z q : = True ; end loop ; .... B o t e I z q : = False ; end loop ; loop Bote Dcho : = True ; while B o t e I z q loop Bote Dcho : = False ; Bote Dcho : = True ; end loop ; .... Bote Dcho : = False ; end loop ; M. Carro (UPM) Exclusión mutua 9/1 Desarrollo de un algoritmo El tren de los Andes Quinto intento de exclusión mutua Turno : Tipo Turno := Dcha; B o t e I z q : Boolean : = False ; Bote Dcho : Boolean : = False ; loop B o t e I z q : = True ; Turno : = Der ; while Bote Der and ( Turno = Der ) loop null ; end loop ; −− Secci ón c r ı́ t i c a B o t e I z q : = False ; end loop ; loop Bote Dcho : = True ; Turno : = I z q ; while B o t e I z q and ( Turno = I z q ) loop null ; end loop ; −− Secci ón c r ı́ t i c a Bote Dcho : = False ; end loop ; M. Carro (UPM) Exclusión mutua 10 / 1 Desarrollo de un algoritmo Prueba Bote_Dcho: Boolean := False; Observaciones: Tren i cruzando (en s.c.) −→ Botei = True Turno resuelve conflictos Algún proceso es el último en cambiar Turno loop Bote_Dcho:= True; Turno:= Izq; while Bote_Izq and (Turno = Izq) loop null; end loop; -- Sección crı́tica Bote_Dcho := False; end loop; Exclusión mutua: Supongamos ambos trenes en sección crı́tica Entonces Bote Izquierdo = Bote Derecho = True La condición de entrada es sólo cierta para uno Éste debe haber entrado primero Y al estar aún en s.c. no puede haberle dado el turno al otro Contradicción M. Carro (UPM) Exclusión mutua 11 / 1 Desarrollo de un algoritmo Prueba (Cont.) Bote_Dcho: Boolean := False; Cadencia correcta: Treni “está de paseo” Entonces Botei = False Por tanto el otro tren puede entrar loop Bote_Dcho:= True; Turno:= Izq; while Bote_Izq and (Turno = Izq) loop null; end loop; -- Sección crı́tica Bote_Dcho := False; end loop; Ausencia de interbloqueo: Tren Derecho y Tren Izquierdo bloqueados en bucle entrada Imposible: o bien Turno = Derecha o bien Turno = Izquierda Uno de los dos puede continuar M. Carro (UPM) Exclusión mutua 12 / 1 Desarrollo de un algoritmo Prueba (Cont.) Ausencia de inanición: Treni entra s.c. repetidamente: I Al salir da oportunidad al otro tren (con Botei ) Treni puede intentar reentrar antes que el otro: I I Pero al intentar reentrar se quita Turno a sı́ mismo Y el otro proceso ha solicitado paso (con Botej ) M. Carro (UPM) Bote_Dcho: Boolean := False; loop Bote_Dcho:= True; Turno:= Izq; while Bote_Izq and (Turno = Izq) loop null; end loop; -- Sección crı́tica Bote_Dcho := False; end loop; Exclusión mutua 13 / 1 Desarrollo de un algoritmo Propiedades vistas Seguridad: Ausencia de interbloqueo (normalmente necesaria) Exclusión mutua Vivacidad: Cadencia correcta (acceso recurso si está libre y proceso intenta) Ausencia de inanición (asegurar acceso recurso a todos los procesos) M. Carro (UPM) Exclusión mutua 14 / 1 Desarrollo de un algoritmo Espera activa Algoritmo Peterson (y otros): espera activa Tareas esperando entrar realizan trabajo Válidos como idea inicial I Sólo algunas veces usados en casos muy particulares (multiprocesadores, R.C. muy pequeñas, sistemas con hardware dedicado) No útiles en la mayor parte de los casos Mecanismos de más bajo nivel (S.O. suspende tareas) ¡Huid de la espera activa! M. Carro (UPM) Exclusión mutua 15 / 1 Desarrollo de un algoritmo Ejercicio Ben-Ari, Principles of Concurrent Programming, ejercicio 3.4 Dos procesos P1 y P2 Demostrar corrección o encontrar contraejemplo M. Carro (UPM) c1 , c2 : I n t e g e r : = 1 ; loop −− Proceso P1 loop c1 : = 1 − c2 ; e x i t when c2 / = 0 ; end loop ; . . . . −− Secci ón c r ı́ t i c a c1 : = 1 ; end loop ; Exclusión mutua 16 / 1