Download Lenguaje Java
Document related concepts
no text concepts found
Transcript
Lenguaje Java Especificación para Tiempo Real José Manuel Pérez Lobato 2001/2002 ARCOS- UC3M 1 Especificación Java TR • El grupo que definió la Especificación para Tiempo Real en Java (RTSJ) empezó a trabajar a mediados de 1998 • La versión actual es la primera y se publico en Junio de 2000 • Se puede encontrar en http://www.rtj.org/ • API: javax.realtime, extiende las clases estándar de java para dar características de tiempo real ARCOS- UC3M 2 Principios básicos de RTSJ • • • • Aplicable a entornos java Compatibilidad con versiones anteriores Ejecución predecible Definir lo básico ahora y permitir introducir características avanzadas para cuando la práctica haya permitido verificar su necesidad • No hay extensiones sintácticas (ejem. la sintáxis de la clausula synchronized permanece invariable aunque su interpretación difiera) • Permite variaciones en las decisiones de implementación • WORA ARCOS- UC3M 3 Especificación Java TR • Define la API (javax.realtime) que deben cumplir las maquinas virtuales que utilicen Java TR e incluye los siguientes aspectos: – – – – – – – Planificación de tareas (hilos, threads) Gestión de memoria Sincronización y utilización compartida de recursos Utilización de eventos asíncronos Transferencia asíncrona de control Terminación asíncrona de tareas Acceso a la memoria física • Existen pocas JVM que lo implementen, se puede encontrar una en: – http://timesys.com/rtj/ ARCOS- UC3M 4 1.- Planificación • JVM: – 10 niveles de prioridad – No hay garantías de cumplimiento de prioridades • RTJ – Al menos 28 niveles de prioridad – Permite definir algoritmos de planificación ARCOS- UC3M 5 Planificación • Se pueden definir varios tipos de scheduler que tendrán como nombre el tipo de política aplicable seguida de la palabra Scheduler (ejem. EDFScheduler). – La clase genérica de planificadores es class Scheduler • El Scheduler básico es el PriorityScheduler • Los Scheduler se encargan de: – Verificar si las tareas que deben planificar son factibles de acuerdo con la pOlítica utilizada – Gestionar la ejecución de objetos planificables (interface Schedulable) ARCOS- UC3M 6 Planificación • Existen 3 tipos de objetos planificables : – RealtimeThread: Menor prioridad que el garbage colector (GC) – NoHeapRealtimeThread. Similar al anterior pero no coloca objetos en el heap y por tanto puede ejecutar siempre antes que el recolector de basura. – AsyncEventHandler: Gestor de eventos asíncronos. • Deben existir al menos 28 niveles de prioridad en el scheduler básico • La algoritmo de planificación, por defecto, será preemtivo (con desalojo) y con prioridades fijas. • La política que se utiliza para comprobar si es factible una determinada planificación de tareas será, por defecto, RMA ARCOS- UC3M 7 RealtimeThread • Hereda de java.lang.Thread por tanto su forma de utilizarla es similar (crear una clase que herede de Realtimethread e incluir en ella un método run() con las instrucciones que se deben ejecutar) • Constructor: – RealtimeThread ([SchedulingParameters scheduling,] [ReleaseParameters release,] [MemoryParameters memory, MemoryArea area,] [ProcessingGroupParameters]); ARCOS- UC3M 8 RealtimeThread • SchedulingParameters son los parámetros para ser utilizados por el Scheduler., su subclase más importante es PriorityParameters que sirve para definir la prioridad que se le asigna al thread. • ReleaseParameters son los parámetros relativos al comportamiento del thread, dependiendo del tipo de thread que se use (periodico, esporádico, etc.) se utiliza una u otra de sus subclases, • ProcessingGroupParameters: definen un grupo de tareas aperiodicas que no podrán consumir más de un determinado tiempo en cada periodo de ejecución indicado • Parámetros de Memoria (MemoryParameters y MemoryArea) definen la utilización de la memoria que realizará el thread ARCOS- UC3M 9 SchedulingParameters • Constructor SchedulingParameters(); • Clase utilizada: PriorityParameters – public class PriorityParameters extends SchedulingParameters(); – Constructor: PriorityParameters(int prioridad): define el nivel de prioridad; ARCOS- UC3M 10 • Constructor ReleaseParameters ReleaseParameters ( RelativeTime coste, RelativeTime deadline, AsyncEventHandler overrunHandler, AsyncEventHandler missHandler); – coste : tiempo de cpu utilizado por el thread – deadline : plazo de respuesta – overrunHandler: Gestor del desbordamiento en el coste indicado – missHandler: Gestor del desbordamiento en el deadline indicado • Las subclases que permiten añadir otras características son – PeriodicParameters : para tareas periódicas. – AperiodicParameters : para tareas aperiódicas (pueden activarse en cualquier momento) – SporadicParameters : para tareas esporadicas (existe un tiempo mínimo entre 2 activaciones consecutivas) ARCOS- UC3M 11 ReleaseParameters (subclases) • Constructor de PeriodicParameters PeriodicParameters ( HighResolutionTime start, RelativeTime periodo, RelativeTime coste, RelativeTime deadline, AsyncEventHandler overrunHandler, AsyncEventHandler missHandler); donde además de los parámetros de la clase ReleaseParameters tenemos el relativo al tiempo de activación (start) y al periodo • La clase AperiodicParameters incluye los mismos atributos que ReleaseParameters • La clase SporadicParameters añade como primer parámetro (a los de ReleaseParameters) el RelativeTime intervaloMinimo que refleja el tiempo mínimo entre 2 activaciones consecutivas. ARCOS- UC3M 12 RealtimeThread • Métodos básicos – public void addToFeasibility() : añade el thread al scheduler por defecto para que éste analice si es factible – public void removeFromFeasibility(): elimina el thread al scheduler por defecto para que éste no analice si es factible – public static void sleep([Clock clock], HighResolutionTime time) – public boolean waitForNextPeriod() Deja el thread suspendido hasta que le toque el siguiente periodo de activación (sólo para threads periódicos) • Para comenzar la ejecución del thread se debe invocar el método start() que llamará al método run() redefinido. ARCOS- UC3M 13 Class Scheduler • Clase abstracta que gestiona la ejecución de objetos planificables e implementa algoritmos de factibilidad • Métodos básicos – protected abstract void addToFeasibility (Schedulable schedulable) : añade el objeto schedulable al planificador – protected abstract void removeToFeasibility (Schedulable schedulable) : elimina el objeto schedulable del planificador – public abstract boolean isFeasible (): true si los objs. planificables con los que cuenta (añadidos con addToFeasibilitiy()) permiten una planificación factible. – Public abstract java.lang.String getPolicyName(): Devuelve el nombre de la política de planificación utilizada – public static void setDefaultScheduler (Scheduler scheduler) : define el scheduler indicado como el utilizado por defecto – public static Scheduler getDefaultScheduler (Scheduler scheduler) : devuelve una referencia al scheduler por defecto, que si no se ha definido lo contrario será un PriorityScheduler ARCOS- UC3M 14 Class PriorityScheduler • Scheduler preemtivo con prioridades fijas • Métodos básicos: – public void fireSchedulable (Schedulable schedulable) : Dispara la ejecución del objeto schedulable – public int getXXXPriority() Dependiendo de si XXX es Max, Min o Norm devolverá la máxima, mínima o normal prioridad disponible para un thread gestionado por este scheduler – public static int getXXXPriority(java.lang.Thread thread) Si el thread indicado es planificable por el scheduler y dependiendo de si XXX es Max, Min o Norm devolverá la máxima, mínima o normal prioridad que puede tener un thread gestionado por este scheduler, Si el thread no es planificable por este scheduler se devuelve Thread.YYY_Priority (YYY= MAX, MIN o NORM) – public static PriorityScheduler instance () : devuelve un puntero a una instancia de un PriorityScheduler ARCOS- UC3M 15 Ejemplo 1a import java.lang.*; import javax.realtime.*; public class SensorTemp extends RealtimeThread{ int numero; SensorTemp (int numero, SchedulingParameters scheduling, ReleaseParameters release) { super (scheduling, release); this.numero=numero; } public void run ( ) { // instrucciones de inicializacion (sólo ejecutan 1 vez) while(condicion) { acciones a repetir periodicamente waitForNextPeriod(); } // instrucciones de finalización (sólo ejecutan 1 vez) } ARCOS- UC3M } 16 import javax.realtime.*; import java.lang.reflect.*; class Gestor{ public static void main (String []arg) throws InterruptedException { PriorityParameters ppst1 = new PriorityParameters(20); PriorityParameters ppst2 = new PriorityParameters(22); PeriodicParameters perpst = new PeriodicParameters( new RelativeTime(100+0*v,0),new RelativeTime(10*v,0), new RelativeTime(1*v,100),new RelativeTime(10*v,0), null,null); SensorTemp st1= new SensorTemp(1, 30,40,v, ppst1,perpst, ds); SensorTemp st2= new SensorTemp(2, 20,80,v, ppst2,perpst, ds); PriorityScheduler ps =getDefaultScheduler(); Ejemplo 1b System.out.println ("INICIO"); st1.addToFeasibility(); ps.fireSchedulable(st1); st2.addToFeasibility(); ps.fireSchedulable(st2); } } ARCOS- UC3M 17 2.- Gestión de Memoria • Permite : – Definir zonas de memoria • Fuera del heap, • Con una duración temporal asociada (lifetime) • Asociadas a determinada posición física – Limitar el tamaño máximo de memoria a utilizar por un thread ARCOS- UC3M 18 MemoryArea • Es una zona de memoria en la que se pueden almacenar objetos • Cuando se crea se debe definir su tamaño.. • Tipos: – HeapMemory: la del heap de Java – InmortalMemory: para objetos que existan durante toda la vida de la aplicación, está compartida por todos los threads y sus objetos nunca son eliminados por el recolector de basura. – InmortalPhysicalMemory : con las características de la InmortalMemory pero asociada a una posición de memoria física determinada. – ScopedMemory :Memoria con ámbito definido, útil para tratar objetos que tienen su tiempo de vida definido por su ámbito de utilización. Éste está definido entre la utilización del método enter(Runnnable r) y la finalización del thread r ARCOS- UC3M 19 • Métodos básicos: MemoryArea – protected MemoryArea (long tamanoEnBytes): constructor que define el tamaño del área. – public void enter (java.lang.Runnable logic) Asocia el área de memoria al thread indicado durante la ejecución de su método run(), que es disparado por este método. Durante esa ejecución del método run() los objetos que se creen lo harán en esa zona de memoria – public static MemoryArea getMemoryArea (java.lang.Object obj) : devuelve el área de memoria en la que está el objeto. – public long memoryConsumed(): Nº de bytes utilizados – public long memoryRemaining(): Nº de bytes disponibles – public synchronized java.lang.Object newArray (java.lang.Class type, int num): crea un array de num elementos del tipo indicado – public synchronized java.lang.Object newinstance(java.lang.Class type, int num): crea un objeto del tipo indicado ARCOS- UC3M 20 HeapMemory e InmortalMemory • Métodos básicos. Ambas clases aplican el patrón singleton No se utilizan constructores para obtener un objeto de las mismas, sino que se deben utilizar los métodos: – public static HeapMemory instance() – public static InmortalMemory instance() que devuelven la instancia correspondiente del tipo de área indicado. ARCOS- UC3M 21 ScopedMemory • Es una clase abstracta de la que heredan:VTMemory y LTMemory (no sujetas al recolector de basura => pueden ser utilizadas por NoHeapRealtimeThread) y ScopedPhysicalMemory • Métodos para asociar un área de memoria de ámbito a un thread – Colocar el área como uno de los parámetros que se pasan al crear el thread – Ejecutar el método enter() • Los objetos creados mientras esta asociada un ScopedMemory a un thread se crearán en dicho área. • Cuando se termina de utilizar el área se ejecutan los métodos finalize de cada uno de los objetos del área • Métodos básicos. – public ScopedMemory (long tamaño): Constructor – public void enter (java.lang.Runnable logic): similar al descrito en la clase MemoryArea ARCOS- UC3M 22 ScopedMemory (subclases) • VTMemory: Tiempo de reserva de espacio variable. – public VTMemory(int inicial, int maximo): constructor que define el tamaño asociado inicial y el máximo que puede llegar a tener dicho área. • LTMemory: Garantiza un tiempo lineal (dependiente del tamaño del objeto) de reserva de espacio para los objetos que se creen en ella. No se garantiza que esté disponible el tamaño máximo cuando se necesita. – public LTMemory(long inicial, long maximo): constructor que define el tamaño asociado inicial y el máximo que puede llegar a tener dicho área. • ScopedPhysicalMemory: Memoria de ámbito asociada a una determinada zona de memoria física. Describiremos sus métodos más adelante. ARCOS- UC3M 23 Gestión de la Memoria Física • Es posible asociar áreas de memoria a zonas físicas de la memoria. • Existe un gestor encargado de realizar la asociación y buscar el tipo de memoria indicado (dma, shared, byteswap) y el lugar: class PhysicalMemoryFactory • Métodos: – protected synchronized java.lang.Object create(java.lang.Object tipoDeMemoria, java.lang.ClassphysMemType, long base, long size) Crea una zona de memoria con las características indicadas. – protected synchronized java.lang.Object getTypedMemoryBase (java.lang.Object tipoDeMemoria, java.lang.ClassphysMemType, long base, long size): devuelve la dirección física del trango de memoria del tipo indicado que tiene como mínimo el tamaño especificado • Tipos de áreas de memoria física : – ImmortalPhysicalMemory – ScopedPhysicalMemory – RawMemoryAccess • RawMemoryFloatAccess ARCOS- UC3M 24 ImmortalPhysicalMemory • Immortal: La vida de los objetos es mayor que la de la aplicación • Physical: Permite asociar objetos a una determinada posición de memoria física. • Métodos: – protected ImmortalPhysicalMemory ([ImmortalPhysicalMemory memoria,] long base, long tamano): constructor , utilizado por el MemoryObjectFactory, que define la dirección física (base) y el tamaño del área que será creada – public static ImmortalPhysicalMemory create (java.lang.Object tipo, [long base, ,] long tamano) Crea un área del tipo (dma, shared,..) indicado en la dirección física (base) y con el tamaño en bytes solicitado. – public static void setFactory (PhysicalMemoryFactory factory): define quien será el encragado de generar las instancias de ImmortalPhysicalMemory ARCOS- UC3M 25 ScopedPhysicalMemory • Métodos – protected ScopedPhysicalMemory(long base, long tamano): constructor , utilizado por el MemoryObjectFactory, que define la dirección física (base) y el tamaño del área que será creada – public static ScopedPhysicalMemory create (java.lang.Object tipo, long base, long tamano) Crea un área del tipo (dma, shared,..) indicado en la dirección física (base) y con el tamaño en bytes solicitado. – public static void setFactory (PhysicalMemoryFactory factory): define quien será el encragado de generar las instancias de ScopedPhysicalMemory ARCOS- UC3M 26 RawMemoryAccess • Modela una zona de memoria física como una secuencia de byte • No sirve para almacenar objetos sino para ser usada como una zona de memoria de acceso crudo (por ejem. para guardar imágenes de I/O, drivers, etc.) • Métodos: – protected RawMemoryAccess ([ImmortalPhysicalMemory memoria,] long base, long tamano): constructor , utilizado por el MemoryObjectFactory. – public static RawMemoryAccess create (java.lang.Object tipo,[long base,] long tamano) Crea un área del tipo (dma, shared,..) indicado en la dirección física (base) y con el tamaño en bytes solicitado. ARCOS- UC3M 27 RawMemoryAccess • Métodos – public byte getByte(long offset): devuelve el byte que se encuentra en el desplazamiento indicado, existen métodos similares para Int, Long, y Short y para arrays – public void setByte(long offset, byte valor): coloca el valor en el byte que se encuentra en el desplazamiento indicado, existen métodos similares para Int, Long, y Short y para arrays – public long map([long base,] [long tamano]):Mapea el rango de direcciones físico del RawMemoryAccess a la zona de memoria virtual indicada en base con el tamaño indicado. Devuelve la dirección de memoria virtual a la que ha sido mapeada. – Public long getMappedAddress(): Devuelve la localización de la memoria virtual en la que está mapeada el dicho RawAccessMemory – public void unmap(): Elimina el mapeado realizado sobre la memoria virtual ARCOS- UC3M 28 MemoryParameters • Son utilizados para definir las características de memoria asociadas a RealtimeThreads y AsyncEventHandler • Métodos: – public MemoryParameters (long Tammaximo, long maxImmortal [, long allocationRate]):Crea un objeto con : • el límite máximo de tamaño de memoria indicado en tamMaximo • el límite máximo del tamaño de memoria inmortal indicado en maxImmortal. Ambos parámetros son en bytes y NO_MAX indica sin límite • la velocidad de colocación, en bytes/sec. de datos en el heap indicada en allocationRate. (NO_MAX para no especificar límite y 0 para no permitir almacenamiento en el heap) ARCOS- UC3M 29 Memoria Inmortal Ejem 1a import javax.realtime.*; /** Uso de memoria "Inmortal" en un proceso periódico. No se usa el heap para evitar la sobrecarga del recolector de basura */ public class ImmortalMemoryExample { public static void main(String[] Args) { NoHeapRealtimeThread t = null; // Defino el proceso con una periodicidad de 10 msg y 1 msec de cómputo PeriodicParameters timeParams = new PeriodicParameters(); timeParams.cost = new RelativeTime(1, 0); Params.period = new RelativeTime(10, 0); // Defino la immortal memory; el tamaño es dado por el RealtimeSystem MemoryParameters memParams = new MemoryParameters(ImmortalMemory.instance()); ARCOS- UC3M 30 Memoria Inmortal Ejem 1b Runner r = new Runner(); /* Creo un NoHeapRealtimeThread con parámetros periódicos y de ImmortalMemory. */ try { t = new NoHeapRealtimeThread(timeParams, memParams, r); } catch (AdmissionControlException e) {} // Arranco el proceso t.start(); }} /** Realizó el proceso periódico en memoria Inmortal*/ class Runner implements Runnable { public void run() { // código de procesamiento ARCOS- UC3M }} 31 import javax.realtime.*; RawMemory Ejem 1a /** subclass of RawMemoryAccess para acceder al espacio de I/O de un Intel x86 para direccionar directamente la memoria. Este ejemplo proporciona un interfaz para el Intel 8253 Programmable Interval Timer*/ public class IOAccess extends RawMemoryAccess { /* ... */ } public class I8253Example { /* ... */ private long counter0Offset = 0; private long counter1Offset = 1; private long counter2Offset = 2; private long controlWordOffset = 3; private byte controlWord0 = 0x00; private byte controlWord1 = 0x00; private byte controlWord2 = 0x00; ARCOS- UC3M 32 RawMemory Ejem 1b /** Crea una instancia de la clase I8253 * @param baseAddr dirección base*/ IOAccess iox; public I8253Example(long baseAddr) { iox = IOAccess.create(baseAddr, (long)8); } /* ... */ /** Escribe un valor de 16 bits (el contador 2) . * @param value valor para el contador 2*/ public void setCounter2(short value) { setControlWord(controlWord2); iox.setByte(counter2Offset, (byte)(value & 0xFF)); iox.setByte(counter2Offset, (byte)(value >> 8)); ARCOS- UC3M } 33 RawMemory Ejem 1c /** Escribe un byte en el registro de control * @param value valor para el registro de control*/ public void setControlWord(byte value) { iox.setByte(controlWordOffset, value); } /* ... */ /** Lee un valor de 16 bits del contador2. * @return valor del contador2*/ public short getCounter2() { short value; setControlWord(COUNTER2); value = (short)iox.getByte(counter2Offset); value |= ((short)iox.getByte(counter2Offset) << 8); return value; } } ARCOS- UC3M 34 3.- Sincronización • La clausula synchronized, que protege el acceso a recursos compartidos puede provocar el típico problema de los STR de inversión de prioridad. • ¿Cómo subsanarlo? => RTSJ modifica la interpretación de dicha clausula definiendo MonitorControl como clase base para la política de elección threads cuando puede darse ese problema de forma que se evite la inversión de prioridad • Cuando varios threads acceden a una zona sincronizada se aplica, por defecto, una política de herencia de prioridad, pero es posible utilizar también un protocolo de emulación de techo de prioridad • Los threads que desean usar recursos compartidos (syncronized) se ordenan por prioridad (dentro de igual prioridad con FIFO) • Se deben utilizar mecanismos adicionales para evitar el bloqueo con threads de menor prioridad que el GC ARCOS- UC3M 35 MonitorControl • Clase base para los objetos de control de la política de control de monitores • Métodos: – public MonitorControl() – public static void setMonitorControl(MonitorControl politica); define la política aplicable cuando se accede a recursos comunes (synchronize) – public static void setMonitorControl(java.lang.Object monitor, MonitorControl politica): define la política aplicable cuando se accede a recursos comunes, sólo para el objeto indicado. ARCOS- UC3M 36 MonitorControl (subclases) • PriorityCeilingEmulation – public PriorityCeilingEmulation(int ceiling): crea un objeto de esta clase con el techo indicado. – public int getDefaultCeiling () • PriorityInheritance – public PriorityInheritance(): – public static PriorityInheritance instance (): devuelve un puntero al objeto único (singleton) PriorityInheritance. ARCOS- UC3M 37 Comunicación entre Threads • La modificación de la interpretación de la clausula synchronize no soluciona el problema cuando alguno de los threads tiene menor prioridad que el GC => se han creado colas libres de espera para facilitar el acceso compartido a los objetos: – WaitFreeWriteQueue – WaitFreeReadQueue – WaitFreeDequeue ARCOS- UC3M 38 WaitFreeWriteQueue • Para comunicar y sincronizar, RealtimeThreads y java.lang.Threads sincronizados en lectura • Métodos básicos: – public WaitFreeWriteQueue(java.lang.Thread escritor, java.lang.Thread lector, int max, MemoryArea mem): Crea una cola que tendrá como maximo max elementos que se almacenarán en mem – public void bind (java.lang.Thread escritor, java.lang.Thread lector, MemoryArea mem): añade 2 nuevos threads con acceso a la cola, sino tienen áreas de memoria comunes sólo podrán almacenar objetos inmortales en la cola. – public boolean write(java.lang.Object objeto): Intenta insertar el objeto en la cola. No se bloquea si la cola está llena, devuelve false. Si 2 threads lo utilizan a la vez deben asegurarse su sincronización. – public synchronized java.lang.Object read(): este método se bloquea si la cola está vacía. Es sincronizado y puede ser llamado por 2 o más threads ARCOS- UC3M 39 WaitFreeReadQueue • Para comunicar y sincronizar, RealtimeThreads y java.lang.Threads sincronizados en escritura • Métodos básicos: – public WaitFreeReadQueue(java.lang.Thread escritor, java.lang.Thread lector, int max, MemoryArea mem [, boolean notify]): Crea una cola que tendrá como maximo max elementos que se almacenarán en mem. Si se coloca true en notify se notificará al lector cuando se añaden elementos – public synchronized boolean write(java.lang.Object objeto): Intenta insertar el objeto en la cola. Se bloquea si la cola está llena y espera hasta que haya sitio. Es sincronizado y puede ser llamado por 2 o más threads – public java.lang.Object read(): Devuelve el siguiente elemento de la cola o null si está vacia. No se bloquea. Si 2 threads lo utilizan a la vez deben asegurarse su sincronización. – Public void waitForData(): espera hasta que se la cola tiene algún elemento ARCOS- UC3M 40 WaitFreeDequeue • Para comunicar y sincronizar, RealtimeThreads y java.lang.Threads sincronizados o no en escritura y en lectura. Crea una WaitFreeWriteQueue y una WaitFreeReadQueue • Métodos básicos: – public WaitFreeDequeue(java.lang.Thread escritor, java.lang.Thread lector, int max, MemoryArea mem ): Crea una cola que tendrá como maximo max elementos que se almacenarán en mem. – public boolean blockingWrite(java.lang.Object objeto): llamada al write de WaitFreeReadQueue (sincronizado) – public java.lang.Object blockingRead(): llamada al read de WaitFreeWriteQueue (sincronizado) – public java.lang.Object nonBlockingRead(): llamada al read de WaitFreeReadQueue (no sincronizado) – public boolean nonBlockingWrite(java.lang.Object objeto): llamada al write de WaitFreeWriteQueue (no sincronizado) ARCOS- UC3M 41 4.- Eventos Asíncronos • Se pueden definir eventos (AsyncEvent) y manejadores (AsyncEventHandler) para los mismos que se ejecutarán cuando los primeros se disparen. • Pueden asociarse varios manejadores a un mismo evento. Estos se ejecutarán en el orden definido por sus Scheduling y Release parameters • Se garantiza que por cada vez que se dispara el evento habrá una ejecución de cada uno de los manejadores asociados • Si el manejador tiene asociado SporadicParameters, se asegura que no habrá 2 ejecuciones del mismo en menos del tiempo entre ejecuciones consecutivas indicado. • Pueden definirse zonas en las que tengan efecto los eventos producidos (métodos con throws AsynchronouslyInterruptedException) y zonas en las que no • Existen eventos POSIX definidos ARCOS- UC3M 42 class AsyncEvent • Métodos básicos: – public AsyncEvent() :Constructor – public synchronized void addHandler (AsyncEventHandler handler) : Añade el manejador (handler) como uno (puede haber varios) de los asociados a este evento. Cuando se produzca el evento se ejecutará el método run() del dicho manejador – public void bindTo(java.lang.String eventoExterno) : asocia el AsyncEvent a un evento externo. Los valores dependen de la implementación – public ReleaseParameters createReleaseParameters(): Crea los parámetros temporales apropiados para el evento AsyncEvent – public synchronized void removehandler (AsyncEventHandler handler): Elimina el manejador del conjunto de los asociados al evento – public synchronized void fire() Dispara el evento => provoca la ejecución de los métodos run() de los manejadores asociados ARCOS- UC3M 43 class AsyncEventHandler • Implementa Schedulable y Runnable • Similares a los threads pero deben ser de mucho menor coste de ejecución. • Se ejecutan, por defecto en el thread actual. Si se quiere crear un thread propio para el manejador hay que usar BoundAsyncEventHandler (subclase de AsyncEventHandler) • Métodos básicos: – public AsyncEventHandler() :Crea un manejador que hereda los parámetros (SchedulingParams. ReleaseParam., etc) del thread actual. Existen constructores y métodos en los que se pueden especificar esos params. – public void addToFeasibility()/ removeFromFeasibility() – public abstract void handleAsyncEvent(): Método en el que se debe definir el comportamiento del manejador cuando se dispare el evento. ARCOS- UC3M 44 AsynEventHandler: Ejem 1a import javax.realtime.*; /* interface para eventos HW como Interrupciones.Una interrupción HW dispara un AsyncEvent, queprovoca la ejecución del manejador asociado*/ public class HardwareEventExample extends AsyncEvent { private int interruptNum; /** Construye un nuevo evento Hardware para un interrupción dada . * @param num numero de interrupción */ public HardwareEventExample(int num) { interruptNum = num; } /** Asocia el manejador a la interrupción*/ public void setHandler(AsyncEventHandler h) { super.setHandler(h); Hardware.bind(interruptNum, h); //bindTo(interruptNum.toString()); }} ARCOS- UC3M 45 AsynEventHandler: Ejem 1b class HardwareEventHandler extends AsyncEventHandler { private int interruptCount = 0; public void handleAsyncEvent() { interruptCount++; // código del driver }} …. public static void main (String arg[) { HardwareEventExample hwe= new HardwareEventExample (); HardwareEventHandler hwh= new HardwareEventHandler (); hwe.addHandler(hwh); … } ARCOS- UC3M 46 5.- Medida del Tiempo • RTSJ permite una mayor precisión en la medida del tiempo y la definición de tiempos relativos o absolutos: • HighResolutionTime: – Clase que permite precisión de nanoseg.(64 bits=msec+offset en nanosec) – Es abstracta, hay que usar sus subclases: • AbsoluteTime • RelativeTime – Tiene métodos para pasar de tiempos relativos a absolutos (absolute() ), para comparar tiempos (compareTo(..), equals(..) ) y para obtener el tiempo actual (set(..) ) – Public abstract AbsoluteTime absolute ARCOS- UC3M 47 HighResolutionTime(subclases) • AbsoluteTime: Tiempo absoluto desde 1-1-1970 a las 00:00:00 GMT – public AbsoluteTime (long millis, int nanos): crea un obj. con ese tiempo – public AbsoluteTime add(long millis, int nanos) / add (RelativeTime time) Se crea un nuevo objeto al que se le añade el tiempo indicado. • RelativeTime: Tiempo relativo desde el instante actual. – public RelativeTime (long millis, int nanos): crea un obj. con ese tiempo – public AbsoluteTime add(long millis, int nanos) / add (RelativeTime time) Se crea un nuevo objeto al que se le añade el tiempo indicado. • RationalTime: Subclase de RelativeTime que divide un tiempo en subintervalos de cierta frecuencia. Se utiliza para disparar tareas periódicas. – public RationalTime (int frecuencia, long millis, int nanos): crea un obj. con el nº de ocurrencias indicado por frecuencia en el intervalo millis+nanos . Ejem. Si tengo (3, 100, 50) como RationalTime para un Temporizador periódico, el temporizador se ejecutara 3 veces cada 100ms ARCOS- UC3M 48 50 nanoseg. 6.- Temporizadores • RTSJ permite temporizadores periódicos o puntuales a los que se les pueden asociar acciones como a cualquier eventos asíncrono • Existe un reloj de tiempo real por defecto (getRealtimeClock()) pero es posible crear instancias propias de relojes (class Clock) a las que se les puede asignar la precisión que se desee (setResolution()) para después solicitar el tiempo actual (getTime()) o utilizarlo para definir temporizadores. ARCOS- UC3M 49 Timer • Es la clase base de los temporizadores, hereda de AsyncEvent • No se deben definir directamente objetos de la misma( Constructor: protected Timer (…) ) • Métodos básicos: – public void disable(): deshabilita el temporizador, si este se dispara mientras está desabilitado, cuando vuelva a habilitarse se disparará. – public void enable() : re-habilita el temporizador. No es necesario invocar a este método para habilitar el temporizador la 1ª vez, se usa start() – public void start (). Arranca (habilita) el temporizador – public ReleaseParameters createReleaseParameters(): Crea los parámetros de temporización apropiados para el evento AsyncEvent – public AbsoluteTime getFireTime() devuelve cuando se disparará el temporizador. ARCOS- UC3M 50 Timer (Subclases) • OneShotTimer – public OneShotTimer (HighResolutionTime time, [Clock reloj,] AsyncEventHandler manejador): Define un temporizador que provocará la ejecución del manejador cuando se dispare. • PeriodicTimer – public PeriodicTimer (HighResolutionTime start, RelativeTime intervalo, [Clock reloj,] AsyncEventHandler manejador): Define un temporizador que comenzara a contar el tiempo en start y se disparara cada intervalo provocando la ejecución del manejador. ARCOS- UC3M 51 Timer Ejem 1a public class TimerPrueba { private static void TimerPrueba (String nombre, Timer t){ SchedulingParameters prioridad=new PriorityParameters(PriorityScheduler.getMaxPriority() ); System.out.println (“Prueba “+nombre); ReleaseParameters rp= t.createReleaseParameters(); rp.setCost(new RelativeTime(10,0)); t.addHandler( new AsyncEventHandler(prioridad, rp, null) { public void handleAsyncEvent(){ System.out.println (“Fin del tiempo “+ System.currentTimeMillis()); } } ); // fin addHandler tp.start(); try { Thread.sleep(2000); } catch (InterruptedException ie) {} } ARCOS- UC3M 52 Timer Ejem 1b public class Prueba { private static void main (String a[]){ OneShotTimer ost=new OneShotTimer(new RelativeTime(500,0), null); PeriodicTimer pt=new PeriodicTimer(new RelativeTime(500,0), new RelativeTime(100,0), null); TimerPrueba tp= new TimerPrueba(“tempor”, ost); // TimerPrueba tp= new TimerPrueba(“tempor”, pt); } } ARCOS- UC3M 53 7.- Transferencia Asíncrona de Ctrl (ATC) • RTSJ permite cambiar el flujo normal de ejecución de forma asíncrona. Para permitir, por ejem., que un cálculo que produce un resultado que se refina iterativamente pueda finalizar pasado un determinado tiempo. • Se basa en la extensión de java.lang.Thread.interrupt(), en las clases AsynchronouslyInterruptedException (AIE), Timed y el interface Interruptible • La ATC debe cumplir varios principios: ARCOS- UC3M 54 Principios ATC (I) • Pr. Metodológicos: – Un Thread debe indicar explícitamente que puede ser objeto de una ATC. – Pueden existir fragmentos de ese Thread protegidos contra ATC – Una ATC no tiene vuelta al punto en el que se estaba ejecutando cuando se produjo. Si es necesaria la vuelta hay que usar AsyncEvendHandler • Pr. De Expresividad – Existirá un mecanismo para disparar de forma explícita un ATC, bien directamente desde otro Thread o indirectamente mediante un AsyncEventHandler – Se podrá disparar una ATC basada en cualquier tipo de evento asíncrono (evento externo, temporizador, disparo desde otra tarea) – Será posible abortar un Thread mediante una ATC sin los riesgos de los métodos stop o destroy de java.lang.Thread ARCOS- UC3M 55 Principios ATC (II) • Pr. Semánticos – Si se utiliza el tratamiento de excepciones para una ATC se debe asegurar que una excepción asíncrona sólo se capturará por un manejador expecífico de la misma y no por uno de proposito grl. – Se podrán tener ATCs anidadas • Pr. Pragmáticos – Deben existir patrones sencillos para casos comunes (temporizadores) – La ATC debe implementarse sin incluir sobrecarga para las aplicaciones que no la usen. – Si un bloque de código asociado a un temporizador termina antes de que se dispare el temporizador, éste se parará y sus recursos será liberados. ARCOS- UC3M 56 Funcionamiento ATC • Para que un método pueda ser interrumpido debe incluir la clausula: throws AsynchronousInterruptedException en su declaración • El mecanismo de ATC entra en funcionamiento si t es una instancia de RealtimeThread o NoHeapRealtimeThread y : – Cualquier tarea del sistema ejecuta t.interrupt() – t ha sido asociado a una AIE (con aie.doInterruptible(t) ) y se ejecuta aie.fire() ARCOS- UC3M 57 Funcionamiento ATC(II) • Cuando se dispara la AIE si el control se encuentra: – en una sección no interrumpible =>se coloca la AIE como pendiente hasta que se vuelva a una sección interrumpible o se invoque a un método interrumpible – en una sección interrumpible =>el control se transfiere a la cláusula catch más proxima que trate esa AIE y no este en una sección interrumpible – en wait, sleep o join => se despierta al thread y se lanza la AIE. • Si el control se transfiere de un método no interrumpible a uno interrumpible mediante la propagación de una excepción y hay una excepción AIE pendiente en el momento de la transición, entonces se descarta la excepción lanzada y se remplaza por la AIE Def: Sección no interrumpible es una sección sincronizada o un método sin throws AIE ARCOS- UC3M 58 AsynchronouslyInterruptedException (AIE) • Subclase de java.lang.InterruptedException • Excepcíón especial que se lanza en respuesta al intento de realizar una transferencia asíncrona de control en un RealtimeThread • Si un método declara que lanzará (thows) una AIE, ésta se producirá cuando se invoque a RealtimeThread.interrupt() mientras ese método esté ejecutando o, si está pendiente, cuando el control vuelva al mismo • Cuando se captura una interrupción (AIE) se debe invocar el método happened() para comprobar que es la pendiente, con lo que será eliminada del thread, sino se continuará propagando. ARCOS- UC3M 59 AsynchronouslyInterruptedException • Métodos (AIE) – public AsynchronouslyInterruptedException () – public synchronized boolean disable() deshabilita el tratamiento de la interrupción. Si ésta salta mientras está deshabilitada se pone en estado de pendiente y se lanzará en cuanto vuelva a ser habilitada. Sólo debe ser invocado dentro de una llamada a doInterruptible() – public synchronized boolean enable() habilita el tratamiento de la excpecion. – public boolean doInterruptible (Interruptible tarea): invoca al método run() de la tarea – public shnchronized boolean fire() Hace que esa excepción sea la actual si se ha invocado a doInterruptible() y no se ha completado – public boolean happened (boolean propagar) utilizada con una instancia de esa excepción para ver si la actualmente disparada es ella. Propagar indica si ésta se debe propagar ARCOSUC3M o no si no es la actual. 60 Timed • Subclase de AIE. • Se utiliza para realizar una ATC basada en un temporizador (se invocará a interrupt() y por tanto se disparará la excepción cuando cumpla el temporizador) • Métodos: – public Timed (HighResolutionTime tiempo) : Crea una instancia de Timed que invocará a interrup() cuando pase el tiempo indicado después de invocar a doInterruptible() – public boolean doInterruptible(Interruptible tarea) ejecuta el método run de la tarea y arranca el temporizador ARCOS- UC3M 61 Interface Interruptible • Se utiliza para los objetos que vayan a ser interrumpidos por medio de AIE.doInterruptible(); • Métodos – public void interruptAction (AIE excepcion) : es el método que se ejecuta si el método run es interrumpido. La excepcion indica el AIE generado y sirve para invocar métodos de la misma. – Public void run (AIE excepcion) :método que se ejecuta cuando se invoca a doInterruptible(). El parámetro sirve para lo mismo que en el método anterior. ARCOS- UC3M 62 ATC ejem 1a public class ATCPrueba implements Interruptible{ public void noInterrumpible(){ /* codigo no interrumpible*/ } public void interrumpible() throws AsynchronouslyInterruptedExcepcion { /* codigo interrumpible */ } public void run (AsynchronouslyInterruptedException e) throws AsynchronouslyInterruptedExcepcion { interrumpible(); noInterrumpible (); e.disable(); // no interrumpible e.enable(); } public void interruptAction (AsynchronouslyInterruptedExcepcion e){ // Acciones a ejecutar cuando se recibe la interrupción }} ARCOS- UC3M 63 ATC ejem 1b public class Prueba { private static void main (String a[]){ ATCPrueba atc= new ATCPrueba(); Timed t= new Timed (new RelativeTime(500,0)); t.doInterruptible(atc); } } ARCOS- UC3M 64 AsynchronouslyInterruptedException 1a import javax.realtime.*; public class AIEExample { private class MyTimed extends Timed { public MyTimed(HiResTime timeout) { super(timeout); }} /** Calculo “largo” que debe ser controlado con timed out. */ int computeRefinedAnswer(MyTimed T) throws MyTimed { int refinedAnswer = 0; T.start(); // Calculo largo T.disable(); return refinedAnswer; } ARCOS- UC3M 65 AsynchronouslyInterruptedException 1b /** Si ocurre un timeout mientras estoy calculando se devuelve el valor por defecto*/ public int computeAnswer() { int roughAnswer = 3; // 100 usec de timeout MyTimed T = new MyTimed((new RelativeTime(0, 100000))); try { return computeRefinedAnswer(T); } catch (MyTimed t) { return roughAnswer; // timed out cumplido } } } ARCOS- UC3M 66