Publicado el 14 de Enero del 2017
705 visualizaciones desde el 14 de Enero del 2017
530,3 KB
40 paginas
Creado hace 13a (15/11/2011)
Watchdog y Timers
Programación concurrente y Distribuída
Curso 2011-12
Miguel Telleria, Laura Barros, J.M. Drake
telleriam AT unican.es
Computadores y Tiempo Real
http://www.ctr.unican.es
Computadores y Tiempo Real
Universidad de Cantabria
Programación concurrente y distribuída
Watchdog y Timers
Contenido
● Patrón de watchdog e implementaciones
● Uso del watchdog en la cena de los filósofos
● Timer casero
24 Oct 2011
Miguel Telleria de Esteban telleriam AT unican.es)
Página 2 de 40
Patrón de Watchdog
Computadores y Tiempo Real
Universidad de Cantabria
Programación concurrente y distribuída
Watchdog y Timers
Ejemplo: Conductor de tren dormido
● Elemento que se activa por
omisión de acción.
● El conductor ha de pulsar un
botón cada cierto tiempo
indicando que está activo.
● En cuanto transcurra un
intervalo de un periodo sin que
el conductor haya mandado la
señal, el watchdog asume que
el conductor está muerto y
detiene el tren.
24 Oct 2011
Miguel Telleria de Esteban telleriam AT unican.es)
Página 4 de 40
Computadores y Tiempo Real
Universidad de Cantabria
Programación concurrente y distribuída
Watchdog y Timers
Modos de funcionamiento del Watchdog
● OneShot:
● Cuando se pasa el periodo sin actividad se dispara una vez y
automáticamente se desarma.
● Si el periodo de actividad se duplica o triplica no se vuelve a disparar.
● Es necesario volver a armarlo para que vuelva a dispararse.
● Continuo
● Una vez armado siempre que haya un periodo de inactividad se dispara.
● Cada vez que el periodo de inactividad se duplica se vuelve a disparar
● Para que cese de dispararse es necesario desarmarlo.
24 Oct 2011
Miguel Telleria de Esteban telleriam AT unican.es)
Página 5 de 40
Computadores y Tiempo Real
Universidad de Cantabria
Programación concurrente y distribuída
Watchdog y Timers
Diagrama de clases
24 Oct 2011
Miguel Telleria de Esteban telleriam AT unican.es)
Página 6 de 40
Computadores y Tiempo Real
Universidad de Cantabria
Programación concurrente y distribuída
Watchdog y Timers
OneShot (izda) Continuo (dcha)
24 Oct 2011
Miguel Telleria de Esteban telleriam AT unican.es)
Página 7 de 40
Computadores y Tiempo Real
Universidad de Cantabria
Programación concurrente y distribuída
Watchdog y Timers
API del Watchdog
● boolean arma(callback, timeout, continuidad)
● Arma el watchdog en el modo dado por continuidad (CONTINUO o
ONESHOT) para que se dispare si hay un intervalo de intactividad de
timeout.
● Para cambiar los parámetros del timer hay que desarmarlo antes.
● void i_m_alive()
● Señala al watchdog que el cliente está vivo. Si el watchdog está
armado resetea el timer de inactividad.
● void desarma()
● Desarma el timer, por lo que no se disparará hasta que vuelva a ser
armado.
● void termina()
● Termina el timer liberando los recursos. No se puede volver a armar.
24 Oct 2011
Miguel Telleria de Esteban telleriam AT unican.es)
Página 8 de 40
Computadores y Tiempo Real
Universidad de Cantabria
Programación concurrente y distribuída
Watchdog y Timers
Condiciones
● Mientras el watchdog esté armado no se puede volver a armar.
● Es necesario que se desarme (en el caso de oneShot también vale una
expiración) para poder cambiar los parámetros.
● El callback es llamado desde el thread interno del watchdog.
● Cuando el timer está desarmado el i_m_alive() no produce
ningún efecto.
● Las acciones
● arma(), desarma(), i_m_alive(), expiración, termina()
son susceptibles de venir de threads distintos y por lo tanto
deben estar protegidas para que se ejecuten atómicamente.
24 Oct 2011
Miguel Telleria de Esteban telleriam AT unican.es)
Página 9 de 40
Computadores y Tiempo Real
Universidad de Cantabria
Programación concurrente y distribuída
Watchdog y Timers
arma (izda) y i_m_alive (dcha)
24 Oct 2011
Miguel Telleria de Esteban telleriam AT unican.es)
Página 10 de 40
Computadores y Tiempo Real
Universidad de Cantabria
Programación concurrente y distribuída
Watchdog y Timers
expira_timer (izda) y desarma (dcha)
24 Oct 2011
Miguel Telleria de Esteban telleriam AT unican.es)
Página 11 de 40
Computadores y Tiempo Real
Universidad de Cantabria
Programación concurrente y distribuída
Watchdog y Timers
set_timer y termina
24 Oct 2011
Miguel Telleria de Esteban telleriam AT unican.es)
Página 12 de 40
Computadores y Tiempo Real
Universidad de Cantabria
Programación concurrente y distribuída
Watchdog y Timers
Implementaciones
● Proponemos 3 implementaciones en función del timer interno
● Con la clase Timer de java
● Con un ThreadPool de un único thread
● Con un “timer casero” construido con un thread y locks de wait() y
notify()
● Todas las implementaciones son similares
24 Oct 2011
Miguel Telleria de Esteban telleriam AT unican.es)
Página 13 de 40
Computadores y Tiempo Real
Universidad de Cantabria
Programación concurrente y distribuída
Watchdog y Timers
Watchdog Timer: Objetos internos
public class Watchdog implements Disparable
{
private long timeout_ms;
private Continuidad continuidad;
private Monitorizable observado;
// Lock de operaciones del watchdog
private Object lock_watchdog;
private boolean watchdog_armado;
// Temporizador interno (en este caso un timer)
private Timer timer;
private ExpiraTimerTask expira_timertask;
public Watchdog()
{
this.timer = new Timer();
lock_watchdog = new Object();
watchdog_armado = false;
}
...
private class ExpiraTimerTask extends TimerTask
{
public void run()
{
...
}
}
24 Oct 2011
}
Miguel Telleria de Esteban telleriam AT unican.es)
Página 14 de 40
Computadores y Tiempo Real
Universidad de Cantabria
Programación concurrente y distribuída
Watchdog y Timers
Watchdog Timer: Lock watchdog
public boolean arma(controlado,
timeout_ms,
continuidad)
{
synchronized(lock_watchdog)
{
...
}
}
public void i_m_alive()
{
synchronized(lock_watchdog)
{
...
public void desarma()
{
synchronized(lock_watchdog)
{
...
}
}
public void termina()
{
synchronized(lock_watchdog)
{
...
}
}
}
}
private class ExpiraTimerTask extends TimerTask
{
public void run()
{
synchronized(lock_watchdog)
{
...
}
}
}
24 Oct 2011
Miguel Telleria de Esteban telleriam AT unican.es)
Página 15 de 40
Computadores y Tiempo Real
Universidad de Cantabria
Programación concurrente y distribuída
Watchdog y Timers
Watchdog timer: arma
public boolean arma(Monitorizable controlado,
long timeout_ms,
Continuidad continuidad)
{
synchronized(lock_watchdog)
{
if (watchdog_armado)
{
// No armamos el watchdog sin cancelarlo antes
return false;
}
watchdog_armado = true;
this.observado = controlado;
this.timeout_ms = timeout_ms;
this.continuidad = continuidad;
set_timer();
return true;
}
}
24 Oct 2011
Miguel Telleria de Esteban telleriam AT unican.es)
Página 16 de 40
Computadores y Tiempo Real
Universidad de Cantabria
Programación concurrente y distribuída
Watchdog y Timers
watchdog Timer: set_timer
private void set_timer()
{
// Necesario porque en los timers una vez el timertask esta
// cancelado no se puede volver a planificar
expira_timertask = new ExpiraTimerTask();
if (continuidad == Continuidad.CONTINUO)
{
timer.scheduleAtFixedRate(expira_timertask, timeout_ms,
}
else if (continuidad == Continuidad.ONESHOT)
{
timer.schedule(expira_timertask, timeout_ms);
timeout_ms);
}
}
24 Oct 2011
Miguel Telleria de Esteban telleriam AT unican.es)
Página 17 de 40
Computadores y Tiempo Real
Universidad de Cantabria
Programación concurrente y distribuída
Watchdog y Timers
Expiracion del timer
private class ExpiraTimerTask extends TimerTask
{
public void run()
{
synchronized(lock_watchdog)
{
if (continuidad == Continuidad.ONESHOT)
{
watchdog_armado = false;
}
observado.accion_recuperacion();
}
}
}
24 Oct 2011
Miguel Telleria de Esteban telleriam AT unican.es)
Página 18 de 40
Computadores y Tiempo Real
Universidad de Cantabria
Programación concurrente y distribuída
Watchdog y Timers
i_m_alive, desarma, termina
public void i_m_alive()
{
synchronized(lock_watchdog)
{
if (watchdog_armado)
{
expira_timertask.cancel();
set_timer();
}
}
}
public void termina()
{
synchronized(lock_watchdog)
{
timer.cancel();
}
}
public void desarma()
{
}
}
synchronized(lock_watchdog)
{
watchdog_armado = false;
expira_timertask.cancel();
24 Oct 2011
Miguel Telleria de Esteban telleriam AT unican.es)
Página 19 de 40
Computadores y Tiempo Real
Universidad de Cantabria
Programación concurrente y distribuída
Watchdog y Timers
Diferentes implementaciones
Timer
ThreadPool
Timer casero
timer
Timer
(java.lang.Timer)
ScheduledThreadPoolEx
ecutor(1)
TimerCasero
expiraTask
TimerTask
Runnable (con futurible)
Expirable
timer.set_one_shot
new TimerTask()
timer.schedule()
executor.schedule()
timer.set_timer_one_shot()
timer.set_fixed_rate()
new TimerTask()
timer.scheduleAtFixedR
ate()
executor.scheduleAtFixe
dRate()
timer.set_timer_continuo()
timer.schedule_cancel(
)
timertask.cancel()
futurible.cancel()
timer.cancela_timer()
timer.terminate()
timer.cancel()
executor.shutdown()
timer.termina()
24 Oct 2011
Miguel Telleria de Esteban telleriam AT unican.es)
Página 20 de 40
Computadores y Tiempo Real
Universidad de Cantabria
Programación concurrente y distribuída
Watchdog y Timers
Cena de filósofos con watchdog
● Objetivo:
● Una vez el bloqueo producido, resolverlo obligando a uno de los
filósofos a liberar el recurso.
● Idea
● Un watchdog vigila que haya actividad (por ejemplo cogiendo los
palillos).
● Si el watchdog expira, el comedot toma las medidas necesarias.
24 Oct 2011
Miguel Telleria de Esteban telleriam AT unican.es)
Página 21 de 40
Computadores y Tiempo Real
Universidad de Cantabria
Programación concurrente y distribuída
Watchdog y Timers
Estrategia
● El watchdog se arma...
● En el comedor al inicializarse con un timeout suficientemente gra
Comentarios de: Watchdog y timers (0)
No hay comentarios