Академический Документы
Профессиональный Документы
Культура Документы
Objetivos
14 Oct 2011
Pgina 2 de 34
Contenido
Presentacin de los filsofos chinos Especificacin UML Paralelizacin Sincronizacin de espera Sincronizacin bloqueante
14 Oct 2011
Pgina 3 de 34
Presentacindelosfilsofoschinos
4 filsofos
Rojo, azul, amarillo, verde 1 entre cada 2 filsofos Numero de sillas configurable
4 palillos
Gestor de sillas:
14 Oct 2011
14 Oct 2011
Pgina 6 de 34
EspecificacinUML
Diagrama de clases
14 Oct 2011
Pgina 8 de 34
Misiones
Comedor
Palillo
Datos globales Punto de acceso para el resto de las clases Determina si da una silla o no GUI Objetos activos Mantiene la cantidad de sillas libres
Modo polling: Devuelve falso si el palillo est cogido Modo espera: Bloquea hasta que el palillo est libre Instancia el sistema Crea los threads Termina la ejecucin
Prueba secuencial
Filosofo
Gestor de sillas
14 Oct 2011
Pgina 9 de 34
Filosofo
Aunque tiene asociados los palillos, invoca los mtodos coge() y deja() a travs del comedor
14 Oct 2011
Pgina 10 de 34
Comedor
La clase Palillo devuelve si el palillo est libre El Gestor de Sillas simplemente informa es el comedor el que devuelve si s o si no.
14 Oct 2011
Pgina 11 de 34
Palillo
Es decir, es el propio palillo el que maneja su poltica de acceso El atributo privado palilloTomado es el que lleva la cuenta de si hay palillo o no
14 Oct 2011
Pgina 12 de 34
GestorSillas
El cojoSilla() directamenta da el acceso a la silla El atributo privado sillasDisponibles es el que lleva la cuenta de si hay silla libre o no.
14 Oct 2011
Pgina 13 de 34
Programa principal
Instancia los threads y espera a que el tiempo de ejecucin se termine. Define el numero de sillas Define el tiempo de actualizacin
14 Oct 2011
Pgina 14 de 34
14 Oct 2011
Pgina 15 de 34
Paralerizacin (similaralaprctica1)
El main se simplifica a:
14 Oct 2011
Pgina 17 de 34
Cambios en el filsofo
El actualiza() se llama internamente desde el run() Se puede auto-arrancar (si heredamos de Thread)
14 Oct 2011
Pgina 18 de 34
Vamos a ejecutarlo
14 Oct 2011
Pgina 19 de 34
Sincronizacindeespera
Identificamos la sincronizacin
mbito de la sincronizacin
14 Oct 2011
Ya que estn duplicadas en cada thread Mientras no haya ningn escritor a la vez claro (mientras no importe que se haga en un orden u otro) La GUI: SWT mantiene su propio thread para ello Dispositivos: discos duro, pantalla...
14 Oct 2011
Pgina 22 de 34
Si la clase est bien diseada con esto puede bastar Nos aseguramos de que nadie se olvida sincronizar
14 Oct 2011
Pgina 23 de 34
Si s que en cierto estado voy a ser el nico en acceder a la informacin Ej: test_and_set()
Los objetos llamantes no deberan verlo La implementacin es quien debera definir el mbito en funcin de un atributo privado
14 Oct 2011
Pgina 24 de 34
Y no vale con que no hay concurrencia ya que actualiza no deja de ser un planificador cclico...
14 Oct 2011
Pgina 25 de 34
Podra no ser as
Ej: que haya un estado (miro si silla libre) y luego otro (cojo silla).
14 Oct 2011
Pgina 26 de 34
Solucin primera
Funciona?
14 Oct 2011
Pgina 27 de 34
Dos filosofos de frente accederan a coge y deja palillo de manera exclusiva. El tomar la silla tambin impedira a otro filsofo empezar a tomar (o dejar el palillo).
14 Oct 2011
Pgina 28 de 34
Hilamos ms fino
14 Oct 2011
Pgina 29 de 34
Sincronizacinbloqueante
Ventaja 1: Sencillez de implementacin, Ventaja 2: No es bloqueante (ej multicore en ciertos entornos) Inconveniente: Gasto intil de CPU Ventaja: Ahorro de CPU (a veces es relativo) Desventaja: Requiere de ciertos recursos del entorno y de bloqueos
Si nos bloqueamos, el scheduler no nos despierta (no somos proceso del S.O.). Alternativa: Hacemos un pooling y nos volvemos a programar
Miguel Telleria de Esteban telleriam AT unican.es) Pgina 31 de 34
14 Oct 2011
Como lo hacemos
wait(): Nos suspendemos y soltamos el lock notify(): Despertamos a uno y le entregamos el lock notifyAll(): Despertamos a todos y se ejecutarn 1 a 1 atmicamente con el lock tomado. Slo podemos ejecutarlos sobre el objeto en el que estamos sincronizados.
Siempre que hagis un wait() no olvidis que tiene que haber un notify() o notifyAll() correspondiente. Englobar todo en un predicado lgico
Ya que al salir del wait() puede seguir habiendo contencin y nos tenemos que volver a dormir. Esto ocurre siempre con los notifyAll()
Miguel Telleria de Esteban telleriam AT unican.es) Pgina 32 de 34
14 Oct 2011
Wait() y sleep()
Dos diferencias:
Por lo tanto impedimos el acceso al objeto mientras el objeto duerme. wait() vuelve slo cuando se le notifica en ambos casos salta la interrupcin InterruptedException
14 Oct 2011
Pgina 33 de 34
Hagamos la prueba!!
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.
14 Oct 2011
Pgina 34 de 34