programación concurrente: fiabilidad
DESCRIPTION
Interbloqueos, bloqueos vivos e inanición (hambruna)TRANSCRIPT
![Page 1: Programación concurrente: fiabilidad](https://reader038.vdocuments.mx/reader038/viewer/2022100603/5592570e1a28ab36248b457f/html5/thumbnails/1.jpg)
dit UPM
Algunos derechos reservados. Este documento se distribuye bajo licencia Crea9ve Commons Reconocimiento-‐NoComercial-‐Compar9rIgual 3.0 Unported. hBp://crea9vecommons.org/licenses/by-‐nc-‐sa/3.0/deed.es
Programación concurrente FiabilidadJuan Antonio de la Puente <[email protected]>
20141009
![Page 2: Programación concurrente: fiabilidad](https://reader038.vdocuments.mx/reader038/viewer/2022100603/5592570e1a28ab36248b457f/html5/thumbnails/2.jpg)
Programación concurrente — Fiabilidad © 2014 Juan A. de la Puente
Referencias
•ScoB Oaks & Henry WongJava Threads O'Reilly Media; 3rd ed (2004) !
•Kathy Sierra & Bert Bates Head First Java, ch. 15O'Reilly Media; 2nd ed (2005)
2
![Page 3: Programación concurrente: fiabilidad](https://reader038.vdocuments.mx/reader038/viewer/2022100603/5592570e1a28ab36248b457f/html5/thumbnails/3.jpg)
Propiedades de los programas concurrentes
![Page 4: Programación concurrente: fiabilidad](https://reader038.vdocuments.mx/reader038/viewer/2022100603/5592570e1a28ab36248b457f/html5/thumbnails/4.jpg)
Programación concurrente — Fiabilidad © 2014 Juan A. de la Puente
Propiedades de los programas concurrentes
• Corrección (correctness) ‣ los resultados de los cálculos son correctos
• Seguridad (safety) ‣ «nunca suceden cosas malas»
• Vivacidad (liveness) ‣ «en algún momento ocurrirá algo bueno»
• Equidad (fairness) ‣ ninguna hebra se ve perjudicada por el progreso de las otras
4
![Page 5: Programación concurrente: fiabilidad](https://reader038.vdocuments.mx/reader038/viewer/2022100603/5592570e1a28ab36248b457f/html5/thumbnails/5.jpg)
Interbloqueos
![Page 6: Programación concurrente: fiabilidad](https://reader038.vdocuments.mx/reader038/viewer/2022100603/5592570e1a28ab36248b457f/html5/thumbnails/6.jpg)
© 2014 Juan A. de la PuenteProgramación concurrente — Fiabilidad
Interbloqueos (deadlocks)
• Situación en la que varias hebras están suspendidas esperando unas a otras y ninguna puede avanzar ‣ es un problema de seguridad
• Se puede dar cuando se usan recursos de forma exclusiva y se asignan a dis9ntas hebras ‣ se dice que hay espera circular
6
t1 t2
x
y
t1 bloquea x
t2 bloquea y
t2 intenta x
t1 intenta y
![Page 7: Programación concurrente: fiabilidad](https://reader038.vdocuments.mx/reader038/viewer/2022100603/5592570e1a28ab36248b457f/html5/thumbnails/7.jpg)
© 2014 Juan A. de la PuenteProgramación concurrente — Fiabilidad
Ejemplo
// hebra 1 … synchronized(X){ // acceso exclusivo a x synchronized(y){…} // acceso exclusivo a y } … !// hebra 2 … synchronized(y){ // acceso exclusivo a y synchronized(x){…} // acceso exclusivo a x } … !// también puede pasar con monitores
7
![Page 8: Programación concurrente: fiabilidad](https://reader038.vdocuments.mx/reader038/viewer/2022100603/5592570e1a28ab36248b457f/html5/thumbnails/8.jpg)
Programación concurrente — Fiabilidad © 2014 Juan A. de la Puente
Condiciones de Coffman
• Condiciones necesarias para que se produzca un interbloqueo ‣ Exclusión mutua en el uso de recursos ‣ Tener y esperar: una hebra 9ene recursos y los man9ene mientras espera conseguir otros ‣ Sin expulsión: no se puede quitar un recurso a una hebra ‣ Espera circular: hay un conjunto de hebras con recursos, esperando por otros recursos, formando una cadena circular
8
t1 t2
x
y
t1 bloquea x
t2 bloquea y
t2 intenta x
t1 intenta y
![Page 9: Programación concurrente: fiabilidad](https://reader038.vdocuments.mx/reader038/viewer/2022100603/5592570e1a28ab36248b457f/html5/thumbnails/9.jpg)
Programación concurrente — Fiabilidad © 2014 Juan A. de la Puente
Cómo prevenir interbloqueos
• Los interbloqueos no se pueden detectar mediante pruebas (tests) ‣ sólo ocurren de vez en cuando ‣ un programa puede pasar las pruebas y dar problemas más tarde
!
• Para prevenir interbloqueos hay que evitar que se dé alguna de las condiciones necesarias ‣ La más sencilla es evitar la espera circular es acceder a los recursos siempre en el mismo orden -‐ requiere disciplina por parte de los programadores -‐ ponerse de acuerdo en seguir algunas reglas
9
![Page 10: Programación concurrente: fiabilidad](https://reader038.vdocuments.mx/reader038/viewer/2022100603/5592570e1a28ab36248b457f/html5/thumbnails/10.jpg)
© 2014 Juan A. de la PuenteProgramación concurrente — Fiabilidad
Ejemplo// hebra 1 !synchronized(X){ // acceso exclusivo a x synchronized(y){…} // acceso exclusivo a y } !// hebra 2 !synchronized(x){ // acceso exclusivo a x synchronized(y){…} // acceso exclusivo a y }
10
t1 t2
x
y
t1 bloquea x t2 intenta x
t1 bloquea y
¡Ahora no hay interbloqueo!
![Page 11: Programación concurrente: fiabilidad](https://reader038.vdocuments.mx/reader038/viewer/2022100603/5592570e1a28ab36248b457f/html5/thumbnails/11.jpg)
Bloqueos vivos e inanición
![Page 12: Programación concurrente: fiabilidad](https://reader038.vdocuments.mx/reader038/viewer/2022100603/5592570e1a28ab36248b457f/html5/thumbnails/12.jpg)
Programación concurrente — Fiabilidad © 2014 Juan A. de la Puente
Bloqueos “vivos”
• Podemos intentar evitar interbloqueos invalidando la condición de “tener y esperar” !
• Ejemplo
12
enum Estado {LIBRE, OCUPADO} estado recurso[] = {Estado.LIBRE, Estado.LIBRE}; boolean success = false;
![Page 13: Programación concurrente: fiabilidad](https://reader038.vdocuments.mx/reader038/viewer/2022100603/5592570e1a28ab36248b457f/html5/thumbnails/13.jpg)
© 2014 Juan A. de la PuenteProgramación concurrente — Fiabilidad
Ejemplo (con9nuación)while (!success) { while (true) { // adquirir recurso 0 synchronized(recurso[0]) { if (recurso[0] == Estado.LIBRE) { recurso[0] = Estado.OCUPADO; break; } } } ! synchronized (recurso[1]) { // adquirir recurso 1 if (recurso[1] == Estado.LIBRE) { recurso[1] = Estado.OCUPADO; success = true; } else { // devolver recurso 0 synchronized (recurso[0]) { recurso[0] = Estado.LIBRE; } } } }
13
![Page 14: Programación concurrente: fiabilidad](https://reader038.vdocuments.mx/reader038/viewer/2022100603/5592570e1a28ab36248b457f/html5/thumbnails/14.jpg)
Programación concurrente — Fiabilidad © 2014 Juan A. de la Puente
Análisis
• Si hay mala suerte, uno de los procesos no conseguirá nunca los recursos: inanición (starva6on)
• Si hay peor suerte, ninguno conseguirá los recursos: bloqueo “vivo” (livelock)
• Siempre que se busca evitar el interbloqueo, hay que tener mucho cuidado de no meterse en estos problemas
14
![Page 15: Programación concurrente: fiabilidad](https://reader038.vdocuments.mx/reader038/viewer/2022100603/5592570e1a28ab36248b457f/html5/thumbnails/15.jpg)
Resumen
![Page 16: Programación concurrente: fiabilidad](https://reader038.vdocuments.mx/reader038/viewer/2022100603/5592570e1a28ab36248b457f/html5/thumbnails/16.jpg)
Programación concurrente — Fiabilidad © 2014 Juan A. de la Puente
Resumen
• El uso de recursos compar9dos puede causar problemas divciles de detectar ‣ Interbloqueo (deadlock) — problema de seguridad -‐ evitar espera circular y asignar recursos de forma ordenada
‣Bloqueo vivo (livelock) — problema de vivacidad ‣ Inanición (starva6on) — problema de equidad
16