dit	

UPM
Algunos	
  derechos	
  reservados.	
  Este	
  documento	
  se	
  distribuye	
  bajo	
  licencia	
  
Crea9ve	
  C...
Programación	
  concurrente	
  —	
  Mecanismos	
  de	
  bajo	
  nivel ©	
  2014	
  Juan	
  A.	
  de	
  la	
  Puente
Refere...
Programación	
  concurrente	
  —	
  Mecanismos	
  de	
  bajo	
  nivel ©	
  2014	
  Juan	
  A.	
  de	
  la	
  Puente
Mecani...
Programación	
  concurrente	
  —	
  Mecanismos	
  de	
  bajo	
  nivel ©	
  2014	
  Juan	
  A.	
  de	
  la	
  Puente
Semáfo...
©	
  2014	
  Juan	
  A.	
  de	
  la	
  PuenteProgramación	
  concurrente	
  —	
  Mecanismos	
  de	
  bajo	
  nivel
java.u2...
©	
  2014	
  Juan	
  A.	
  de	
  la	
  PuenteProgramación	
  concurrente	
  —	
  Mecanismos	
  de	
  bajo	
  nivel
Exclusi...
©	
  2014	
  Juan	
  A.	
  de	
  la	
  PuenteProgramación	
  concurrente	
  —	
  Mecanismos	
  de	
  bajo	
  nivel
Product...
©	
  2014	
  Juan	
  A.	
  de	
  la	
  PuenteProgramación	
  concurrente	
  —	
  Mecanismos	
  de	
  bajo	
  nivel
Comenta...
Programación	
  concurrente	
  —	
  Mecanismos	
  de	
  bajo	
  nivel ©	
  2014	
  Juan	
  A.	
  de	
  la	
  Puente
Cerroj...
Programación	
  concurrente	
  —	
  Mecanismos	
  de	
  bajo	
  nivel ©	
  2014	
  Juan	
  A.	
  de	
  la	
  Puente
Condic...
Programación	
  concurrente	
  —	
  Mecanismos	
  de	
  bajo	
  nivel ©	
  2014	
  Juan	
  A.	
  de	
  la	
  Puente
Resume...
Próxima SlideShare
Cargando en…5
×

Programación concurrente: mecanismos de sincronización de bajo nivel

565 visualizaciones

Publicado el

Semáforos, cerrojos y variables de condición

Publicado en: Software
0 comentarios
0 recomendaciones
Estadísticas
Notas
  • Sé el primero en comentar

  • Sé el primero en recomendar esto

Sin descargas
Visualizaciones
Visualizaciones totales
565
En SlideShare
0
De insertados
0
Número de insertados
15
Acciones
Compartido
0
Descargas
3
Comentarios
0
Recomendaciones
0
Insertados 0
No insertados

No hay notas en la diapositiva.

Programación concurrente: mecanismos de sincronización de bajo nivel

  1. 1. 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  — Mecanismos  de  sincronización   de  bajo  nivel Juan  Antonio  de  la  Puente     <jpuente@dit.upm.es>                           20141009
  2. 2. Programación  concurrente  —  Mecanismos  de  bajo  nivel ©  2014  Juan  A.  de  la  Puente Referencias •ScoB  Oaks  &  Henry  Wong
 Java  Threads
 O'Reilly  Media;  3rd  ed  (2004)     ! •Kathy  Sierra  &  Bert  Bates
 Head  First  Java,  ch.  15
 O'Reilly  Media;  2nd  ed  (2005) 2
  3. 3. Programación  concurrente  —  Mecanismos  de  bajo  nivel ©  2014  Juan  A.  de  la  Puente Mecanismos  de  sincronización  de  bajo  nivel • Con  monitores  se  pueden  construir  programas   concurrentes  correctos  para  todo  9po  de  situaciones   • A  veces  se  usan  otros  mecanismos  de  sincronización  de   menor  nivel  de  abstracción   -­‐ por  razones  de  costumbre    o  de  eficiencia   ‣ semáforos   ‣ cerrojos  explícitos   ‣ variables  de  condición   • Son  digciles  de  usar  correctamente  y  pueden  dar  lugar  a   problemas  complicados 3
  4. 4. Programación  concurrente  —  Mecanismos  de  bajo  nivel ©  2014  Juan  A.  de  la  Puente Semáforos • Un  semáforo  es  un  objeto  que  9ene  un  valor  
 entero  no  nega9vo   • Su  valor  sólo  se  puede  alterar  mediante  dos  operaciones   atómicas   ‣ adquirir:  decrementa  el  valor  del  semáforo   -­‐ si  es  0,  la  hebra  que  lo  invoca  se  suspende   ‣ liberar:  incrementa  el  valor  del  semáforo   -­‐ si  hay  hebras  esperando,  con9núa  una  de  ellas   ✓ el  valor  del  semáforo  no  se  modifica   • Es  un  mecanismo  elemental  de  sincronización   ‣ interés  histórico:  inventado  por  Edsger  Dijkstra  hacia  1965   4
  5. 5. ©  2014  Juan  A.  de  la  PuenteProgramación  concurrente  —  Mecanismos  de  bajo  nivel java.u2l.concurrent.Semaphore public class Semaphore … { ! /* constructor */ public Semaphore(int permits); /* adquirir */ public void acquire() throws InterruptedException; ! /* liberar */ public void release(); … } 5
  6. 6. ©  2014  Juan  A.  de  la  PuenteProgramación  concurrente  —  Mecanismos  de  bajo  nivel Exclusión  mutua  con  semáforos Semaphore mutex = new Semaphore(1); ! // thread 1 // thread 2 … mutex.acquire(); mutex.acquire(); // región crítica // región crítica mutex.release(); mutex.release(); … 6 • El  valor  inicial  indica  que  se  dispone  de  1  permiso  para   acceder  a  un  recurso  (por  ejemplo,  variable  compar9da)   • No  pude  haber  más  de  una  hebra  en  su  región  crí9ca
  7. 7. ©  2014  Juan  A.  de  la  PuenteProgramación  concurrente  —  Mecanismos  de  bajo  nivel Productor-­‐consumidor  con  semáforos public class Buffer<E> { ! private E almacen; Semaphore mutex = new Semaphore(1); // exclusión mutua Semaphore sitio = new Semaphore(1); // sitio para 1 dato Semaphore datos = new Semaphore(0); // no hay datos en buffer ! public void enviar(E dato) throws InterruptedException { sitio.acquire(); // espera que haya sitio mutex.acquire(); // acceso exclusivo al almacén almacen = dato; mutex.release(); // libera acceso exclusivo datos.release(); // avisa de que hay datos disponibles } ! public E recibir() throws InterruptedException { E dato = null; datos.acquire(); // espera que haya datos mutex.acquire(); // acceso exclusivo al almacén dato = almacen; mutex.release(); // libera acceso exclusivo sitio.release(); // avisa de que hay sitio return dato; } } 7
  8. 8. ©  2014  Juan  A.  de  la  PuenteProgramación  concurrente  —  Mecanismos  de  bajo  nivel Comentarios • Más  complicado  de  usar  y   entender   • Es  fácil  cometer  errores.     ‣ acquire()  sin  release();   ‣ orden  incorrecto   ‣ muchos  errores,  digciles  de   detectar   • En  general,  es  mejor  usar   métodos  sincronizados 8 public void enviar(E dato) … { mutex.acquire(); sitio.acquire(); almacen = dato; datos.release(); mutex.release(); } ! public E recibir() ... { … mutex.acquire(); datos.acquire(); dato = almacen; sitio.release(); mutex.release(); ... } Ejemplo ¿por  qué  es  incorrecto?
  9. 9. Programación  concurrente  —  Mecanismos  de  bajo  nivel ©  2014  Juan  A.  de  la  Puente Cerrojos  explícitos • Como  los  que  se  usan  de  forma  implícita  en  synchronized   ‣ y  otras  formas  con  propiedades  algo  diferentes   • Se  definen  en  java.u2ls.concurrent.locks   ! ! ! ! • Varias  implementaciones   ‣ ReentrantLock,  etc. 9 public interface Lock { void lock(); // bloquea el cerrojo void unlock(); // desbloquea la RC ... }
  10. 10. Programación  concurrente  —  Mecanismos  de  bajo  nivel ©  2014  Juan  A.  de  la  Puente Condiciones • Permiten  la  sincronización  mediante  condiciones   explícitas   • Se  definen  en     ! ! ! ! • Varias  implementaciones  en  java.u2l.concurrent.locks   • Digcil  de  usar,  mejor  usar  notify()  y  notifyAll() 10 public interface Condition { void await() // libera cerrojo y espera throws InterruptedException; void signal(); // desbloquea un thread void signalAll(); // desbloquea todos }
  11. 11. Programación  concurrente  —  Mecanismos  de  bajo  nivel ©  2014  Juan  A.  de  la  Puente Resumen • A  veces  se  usan  mecanismos  de  sincronización  con  un   nivel  de  abstracción  menor  que  los  monitores   ‣ semáforos   ‣ cerrojos   ‣ variables  de  condición   ! • Razones  históricas  o  código  heredado   ‣ todo  se  puede  hacer  con  monitores   ‣ mayor  nivel  de  abstracción,  menos  errores 11

×