Cena de filosofos y sincronizacion java - ctr.unican.es · 14 Oct 2011 Miguel Telleria de Esteban...

34
Cena de filosofos y sincronizacion java Miguel Telleria, Laura Barros, J.M. Drake telleriam AT unican.es Computadores y Tiempo Real http://www.ctr.unican.es Programación concurrente y Distribuída Curso 2011-12

Transcript of Cena de filosofos y sincronizacion java - ctr.unican.es · 14 Oct 2011 Miguel Telleria de Esteban...

Page 1: Cena de filosofos y sincronizacion java - ctr.unican.es · 14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 2 de 34 Programación concurrente y distribuída

Cena de filosofos y sincronizacion java

Miguel Telleria, Laura Barros, J.M. Drake

telleriam AT unican.es

Computadores y Tiempo Real

http://www.ctr.unican.es

Programación concurrente y Distribuída

Curso 2011-12

Page 2: Cena de filosofos y sincronizacion java - ctr.unican.es · 14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 2 de 34 Programación concurrente y distribuída

14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 2 de 34

Cena de filosofos y sincronizacion javaProgramación concurrente y distribuídaComputadores y Tiempo RealUniversidad de Cantabria

Objetivos

● Presentaros la aplicación de “filósofos chinos” con UML

● Practicar lo visto en sincronismo de java

● Prepararos para la practica 2 que es muy similar

Page 3: Cena de filosofos y sincronizacion java - ctr.unican.es · 14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 2 de 34 Programación concurrente y distribuída

14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 3 de 34

Cena de filosofos y sincronizacion javaProgramación concurrente y distribuídaComputadores y Tiempo RealUniversidad de Cantabria

Contenido● Presentación de los filósofos chinos

● Especificación UML

● Paralelización

● Sincronización de espera

● Sincronización bloqueante

Page 4: Cena de filosofos y sincronizacion java - ctr.unican.es · 14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 2 de 34 Programación concurrente y distribuída

Presentación de los filósofos chinos

Page 5: Cena de filosofos y sincronizacion java - ctr.unican.es · 14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 2 de 34 Programación concurrente y distribuída

14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 5 de 34

Cena de filosofos y sincronizacion javaProgramación concurrente y distribuídaComputadores y Tiempo RealUniversidad de Cantabria

Los filósofos chinos● 4 filósofos

● Rojo, azul, amarillo, verde

● 4 palillos● 1 entre cada 2 filósofos

● Gestor de sillas:● Numero de sillas configurable

● Ciclo de cada filosofo: – Pensando

– esperando silla

– esperando palillo derecho

– esperando palillo izquierdo

– comiendo

Page 6: Cena de filosofos y sincronizacion java - ctr.unican.es · 14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 2 de 34 Programación concurrente y distribuída

14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 6 de 34

Cena de filosofos y sincronizacion javaProgramación concurrente y distribuídaComputadores y Tiempo RealUniversidad de Cantabria

Vamos a verla funcionar

Page 7: Cena de filosofos y sincronizacion java - ctr.unican.es · 14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 2 de 34 Programación concurrente y distribuída

Especificación UML

Page 8: Cena de filosofos y sincronizacion java - ctr.unican.es · 14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 2 de 34 Programación concurrente y distribuída

14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 8 de 34

Cena de filosofos y sincronizacion javaProgramación concurrente y distribuídaComputadores y Tiempo RealUniversidad de Cantabria

Diagrama de clases

Page 9: Cena de filosofos y sincronizacion java - ctr.unican.es · 14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 2 de 34 Programación concurrente y distribuída

14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 9 de 34

Cena de filosofos y sincronizacion javaProgramación concurrente y distribuídaComputadores y Tiempo RealUniversidad de Cantabria

Misiones● Comedor

● Datos globales

● Punto de acceso para el resto de las clases

● Determina si da una silla o no● GUI

● Filosofo● Objetos activos

● Gestor de sillas● Mantiene la cantidad de sillas

libres

● Palillo● Modo polling: Devuelve falso

si el palillo está cogido

● Modo espera: Bloquea hasta que el palillo esté libre

● Prueba secuencial● Instancia el sistema● Crea los threads

● Termina la ejecución

Page 10: Cena de filosofos y sincronizacion java - ctr.unican.es · 14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 2 de 34 Programación concurrente y distribuída

14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 10 de 34

Cena de filosofos y sincronizacion javaProgramación concurrente y distribuídaComputadores y Tiempo RealUniversidad de Cantabria

Filosofo● Objeto activo con su ciclo de vida● Decisión de diseño:

● Aunque tiene asociadoslos palillos, invoca losmétodos coge() y deja()a través del comedor

Page 11: Cena de filosofos y sincronizacion java - ctr.unican.es · 14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 2 de 34 Programación concurrente y distribuída

14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 11 de 34

Cena de filosofos y sincronizacion javaProgramación concurrente y distribuídaComputadores y Tiempo RealUniversidad de Cantabria

Comedor● Da acceso al resto de

elementos● Elección de diseño:

● La clase Palillo devuelve si el palillo estálibre

● El Gestor de Sillas simplemente informaes el comedor el que devuelve si sí o sino.

Page 12: Cena de filosofos y sincronizacion java - ctr.unican.es · 14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 2 de 34 Programación concurrente y distribuída

14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 12 de 34

Cena de filosofos y sincronizacion javaProgramación concurrente y distribuídaComputadores y Tiempo RealUniversidad de Cantabria

Palillo● “Se deja” coger o no:

● Es decir, es el propio palillo el quemaneja su política de acceso

● El atributo privado palilloTomado es el quelleva la cuenta de si hay palillo o no

Page 13: Cena de filosofos y sincronizacion java - ctr.unican.es · 14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 2 de 34 Programación concurrente y distribuída

14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 13 de 34

Cena de filosofos y sincronizacion javaProgramación concurrente y distribuídaComputadores y Tiempo RealUniversidad de Cantabria

GestorSillas● Usado para evitar el bloqueo múltiple

● El cojoSilla() directamenta da el acceso ala silla

● El atributo privado sillasDisponibles es elque lleva la cuenta de si hay silla libreo no.

Page 14: Cena de filosofos y sincronizacion java - ctr.unican.es · 14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 2 de 34 Programación concurrente y distribuída

14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 14 de 34

Cena de filosofos y sincronizacion javaProgramación concurrente y distribuídaComputadores y Tiempo RealUniversidad de Cantabria

Programa principal● Instancia los threads y espera a que

el tiempo de ejecución se termine.● Define el numero de sillas● Define el tiempo de actualización

Page 15: Cena de filosofos y sincronizacion java - ctr.unican.es · 14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 2 de 34 Programación concurrente y distribuída

14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 15 de 34

Cena de filosofos y sincronizacion javaProgramación concurrente y distribuídaComputadores y Tiempo RealUniversidad de Cantabria

Estados del filosofo● El filósofo pasa de un

estado a otro medianteel método actualiza().

Page 16: Cena de filosofos y sincronizacion java - ctr.unican.es · 14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 2 de 34 Programación concurrente y distribuída

Paralerización(similar a la práctica 1)

Page 17: Cena de filosofos y sincronizacion java - ctr.unican.es · 14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 2 de 34 Programación concurrente y distribuída

14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 17 de 34

Cena de filosofos y sincronizacion javaProgramación concurrente y distribuídaComputadores y Tiempo RealUniversidad de Cantabria

Cambios en el programa principal● El main() ya no llama a actualiza

● Lo hará el propio thread en su run()

● El main se simplifica a:● Se crean los filosofos

– Se les arrancan (si no se arrancan ellos sólos)

● Se espera un tiempo de ejecución

● Se ejecuta termina() en ellos

Page 18: Cena de filosofos y sincronizacion java - ctr.unican.es · 14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 2 de 34 Programación concurrente y distribuída

14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 18 de 34

Cena de filosofos y sincronizacion javaProgramación concurrente y distribuídaComputadores y Tiempo RealUniversidad de Cantabria

Cambios en el filósofo● El actualiza() se llama internamente desde el run()● Se puede auto-arrancar (si heredamos de Thread)

● Si no nos arranca el que nos crea

Page 19: Cena de filosofos y sincronizacion java - ctr.unican.es · 14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 2 de 34 Programación concurrente y distribuída

14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 19 de 34

Cena de filosofos y sincronizacion javaProgramación concurrente y distribuídaComputadores y Tiempo RealUniversidad de Cantabria

Vamos a ejecutarlo● ¿Se respeta el número de sillas?

● ¿Se mantiene el acceso exclusivo a los palillos?

Page 20: Cena de filosofos y sincronizacion java - ctr.unican.es · 14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 2 de 34 Programación concurrente y distribuída

Sincronización de espera

Page 21: Cena de filosofos y sincronizacion java - ctr.unican.es · 14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 2 de 34 Programación concurrente y distribuída

14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 21 de 34

Cena de filosofos y sincronizacion javaProgramación concurrente y distribuídaComputadores y Tiempo RealUniversidad de Cantabria

Identificamos la sincronización● Que Objetos tenemos que sincronizar

● Información compartida concurrentemente

● Y que es posible que entre en incoherencia

● Limitación de las secciones críticas● ¿Lectura?, ¿Escritura?

● Atomicidad

● Ámbito de la sincronización● Que objetos tienen que esperar

● No sobresincronizar

Page 22: Cena de filosofos y sincronizacion java - ctr.unican.es · 14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 2 de 34 Programación concurrente y distribuída

14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 22 de 34

Cena de filosofos y sincronizacion javaProgramación concurrente y distribuídaComputadores y Tiempo RealUniversidad de Cantabria

Cosas que no hace falta sincronizar● Variables locales (ej estado)

● Ya que están duplicadas en cada thread

● Acceso concurrente en sólo lectura● Mientras no haya ningún escritor a la vez claro

● Accesos ya gestionado por una librería o sistema operativo● (mientras no importe que se haga en un orden u otro)

● La GUI: SWT mantiene su propio thread para ello

● Dispositivos: discos duro, pantalla...

Page 23: Cena de filosofos y sincronizacion java - ctr.unican.es · 14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 2 de 34 Programación concurrente y distribuída

14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 23 de 34

Cena de filosofos y sincronizacion javaProgramación concurrente y distribuídaComputadores y Tiempo RealUniversidad de Cantabria

Métodos synchronized vs bloque synchronized● El método synchronized es equivalente a:

● Envolver todo el código del método con

synchronize(this)

● Si la clase está bien diseñada con esto puede bastar● Nos aseguramos de que “nadie se olvida” sincronizar

● Con que uno se olvidase no se mantiene la exclusión mutua

Page 24: Cena de filosofos y sincronizacion java - ctr.unican.es · 14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 2 de 34 Programación concurrente y distribuída

14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 24 de 34

Cena de filosofos y sincronizacion javaProgramación concurrente y distribuídaComputadores y Tiempo RealUniversidad de Cantabria

Métodos synchronized vs bloque synchronized● Sin embargo a veces esto no siempre es posible

● La sincronización (duración o ámbito) puede depender de un argumento, un estado, un instante...

– Si sé que en cierto estado voy a ser el único en acceder a la información

● A veces la sección crítica abarca más de un método

– Ej: test_and_set()

● Buen diseño: poner el mutex lo más profundo posible● Los objetos llamantes no deberían verlo

● La implementación es quien debería definir el ámbito en función de un atributo privado

– Si es necesario se pone synchronize(this) en parte del código

● Caso test_and_set(), dar un método sincronizado que englobe los dos.

Page 25: Cena de filosofos y sincronizacion java - ctr.unican.es · 14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 2 de 34 Programación concurrente y distribuída

14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 25 de 34

Cena de filosofos y sincronizacion javaProgramación concurrente y distribuídaComputadores y Tiempo RealUniversidad de Cantabria

¿Es necesario sincronizar en la implementación secuencial?

● ¿Si?, ¿No?, ¿Por qué?● Y no vale con que “no hay concurrencia” ya que actualiza no deja de

ser un planificador cíclico...

Page 26: Cena de filosofos y sincronizacion java - ctr.unican.es · 14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 2 de 34 Programación concurrente y distribuída

14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 26 de 34

Cena de filosofos y sincronizacion javaProgramación concurrente y distribuídaComputadores y Tiempo RealUniversidad de Cantabria

¿Es necesario sincronizar en la implementación secuencial? (respuesta)

● NO es necesario

● Puesto que todas las llamadas a actualiza()● Se ejecutan de manera atómica● Dejan las variables en estado coherente

● Podría no ser así● Ej: que haya un estado (miro si silla libre) y luego otro (cojo silla).

Page 27: Cena de filosofos y sincronizacion java - ctr.unican.es · 14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 2 de 34 Programación concurrente y distribuída

14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 27 de 34

Cena de filosofos y sincronizacion javaProgramación concurrente y distribuídaComputadores y Tiempo RealUniversidad de Cantabria

Solución primera● Puesto que todos usamos el comedor

● Hacemos los métodos del comedor synchronized

● ¿Funciona?

● ¿Que inconvenientes presenta?

Page 28: Cena de filosofos y sincronizacion java - ctr.unican.es · 14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 2 de 34 Programación concurrente y distribuída

14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 28 de 34

Cena de filosofos y sincronizacion javaProgramación concurrente y distribuídaComputadores y Tiempo RealUniversidad de Cantabria

Inconvenientes de la solución primera● Dos filosofos de frente accederían a coge y deja palillo de

manera exclusiva.

● El tomar la silla también impediría a otro filósofo empezar a tomar (o dejar el palillo).

● Tenemos “sobre-sincronización” al usar un único lock global

Page 29: Cena de filosofos y sincronizacion java - ctr.unican.es · 14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 2 de 34 Programación concurrente y distribuída

14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 29 de 34

Cena de filosofos y sincronizacion javaProgramación concurrente y distribuídaComputadores y Tiempo RealUniversidad de Cantabria

Hilamos más fino● Cada filosofo retendrá el lock del objeto que esté usando

● No habrá contención en palillos enfrentados

● No habrá contención entre palillos y sillas

Page 30: Cena de filosofos y sincronizacion java - ctr.unican.es · 14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 2 de 34 Programación concurrente y distribuída

Sincronización bloqueante

Page 31: Cena de filosofos y sincronizacion java - ctr.unican.es · 14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 2 de 34 Programación concurrente y distribuída

14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 31 de 34

Cena de filosofos y sincronizacion javaProgramación concurrente y distribuídaComputadores y Tiempo RealUniversidad de Cantabria

Esperas activa vs espera bloqueante● Independientemente del ámbito, duración y datos protegidos

tenemos 2 estrategias de actuación:● Espera activa: Se pregunta reiteradamente el estado de un recurso

opcionalmente con un sleep.

– Ventaja 1: Sencillez de implementación,

– Ventaja 2: No es bloqueante (ej multicore en ciertos entornos)

– Inconveniente: Gasto inútil de CPU

● Espera bloqueante: Se queda dormido a la espera de ser notificado

– Ventaja: Ahorro de CPU (a veces es relativo)

– Desventaja: Requiere de ciertos recursos del entorno y de bloqueos

● En la mayoría de los casos preferiremos la espera bloqueante.● Ejemplo donde no: Las interrupciones hardware

– Si nos bloqueamos, el scheduler no nos despierta (no somos proceso del S.O.).

– Alternativa: Hacemos un pooling y nos volvemos a programar

Page 32: Cena de filosofos y sincronizacion java - ctr.unican.es · 14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 2 de 34 Programación concurrente y distribuída

14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 32 de 34

Cena de filosofos y sincronizacion javaProgramación concurrente y distribuídaComputadores y Tiempo RealUniversidad de Cantabria

Como lo hacemos ● Comportamiento de variable de condición + mutex:

● wait(): Nos suspendemos y soltamos el lock

● notify(): Despertamos a uno y le entregamos el lock

● notifyAll(): Despertamos a todos y se ejecutarán 1 a 1 atómicamente con el lock tomado.

● Cosas a tener en cuenta:● Sólo podemos ejecutarlos sobre el objeto en el que estamos

sincronizados.

– Por lo tanto tenemos que estar en ámbito synchronized

● Siempre que hagáis un wait() no olvidéis que tiene que haber un notify() o notifyAll() correspondiente.

● Englobar todo en un predicado lógico

– Ya que al salir del wait() puede seguir habiendo contención y nos tenemos que volver a dormir. Esto ocurre siempre con los notifyAll()

Page 33: Cena de filosofos y sincronizacion java - ctr.unican.es · 14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 2 de 34 Programación concurrente y distribuída

14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 33 de 34

Cena de filosofos y sincronizacion javaProgramación concurrente y distribuídaComputadores y Tiempo RealUniversidad de Cantabria

Wait() y sleep()● Dos diferencias:

● sleep() no suelta el lock

– Por lo tanto impedimos el acceso al objeto mientras el objeto duerme.

● sleep() vuelve inmediatamente de un interrupt()

– wait() vuelve sólo cuando se le notifica

– en ambos casos salta la interrupción InterruptedException

Page 34: Cena de filosofos y sincronizacion java - ctr.unican.es · 14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 2 de 34 Programación concurrente y distribuída

14 Oct 2011 Miguel Telleria de Esteban telleriam AT unican.es) Página 34 de 34

Cena de filosofos y sincronizacion javaProgramación concurrente y distribuídaComputadores y Tiempo RealUniversidad de Cantabria

¡¡Hagamos la prueba!!● Diferencias entre palillo y gestor de sillas

● El objeto palillo puede hacer el wait() el mismo

● La clase sillas no puede hacer el wait() a menos de que tome la responsabilidad de gestionar su propio acceso.