programación concurrente: fiabilidad

16

Click here to load reader

Upload: juan-antonio-de-la-puente

Post on 30-Jun-2015

60 views

Category:

Software


1 download

DESCRIPTION

Interbloqueos, bloqueos vivos e inanición (hambruna)

TRANSCRIPT

Page 1: Programación concurrente: fiabilidad

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

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

Propiedades  de  los  programas  concurrentes

Page 4: Programación concurrente: fiabilidad

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

Interbloqueos

Page 6: Programación concurrente: fiabilidad

©  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

©  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

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

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

©  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

Bloqueos  vivos  e  inanición

Page 12: Programación concurrente: fiabilidad

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

©  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

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

Resumen

Page 16: Programación concurrente: fiabilidad

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