Middleware de Comunicacin para Sistemas Distribuidos de Tiempo
Real en Java
Pablo Daniel Tejera Carballa Alejandro Alonso Resumen. Las facilidades e independencia de plataforma de Java han generado un gran inters en la comunidad de tiempo real. Dicho inters ha sido reflejado en la especificacin RTSJ (Real-Time Specification for Java), la cual extiende y adapta el lenguaje Java para permitir el desarrollo de sistemas de tiempo real. Adicionalmente, perfiles RTSJ han surgido para garantizar la predecibilidad en sitemas de tiempo real crticos. Sin embargo RTSJ y sus perfiles presentan la limitacin de no introducir facilidades para sistemas distribuidos. Por lo tanto el objetivo de este trabajo es afrontar dicha limitacin definiendo un nuevo modelo de RMI (Remote Method Invocation) basado en los principales perfiles de RTSJ. Este trabajo presenta el diseo y la implementacin de RMI-HRT (RMI - Hard Real-Time) que est enfocado a sistemas de tiempo real crtico con requisitos de alta integridad. 1 Introduccin Los sistemas empotrados y distribuidos de tiempo real son cada vez ms importantes para la sociedad. Su demanda aumenta y se depende de los servicios que proporcionan. Los sistemas de alta integridad constituyen un subconjunto de gran importancia. Se caracterizan por que un fallo en su funcionamiento puede causar la prdidas de vidas humanas, daos en el medio ambiente o cuantiosas prdidas econmicas. La necesidad de satisfacer requisitos temporales estrictos, hace ms complejo su desarrollo. Mientras que los sistemas empotrados se expandan en nuestra sociedad, es necesario garantizar un coste de desarrollo ajustado mediante el uso tcnicas adecuadas en su diseo, mantenimiento y certificacin. En concreto, se requiere una tecnologa flexible e independiente del hardware. La tecnologa que se emplea en aplicaciones de alta integridad como las de avinica, espaciales o ferroviarias, se beneficia de varias dcadas de innovacin y enfoques de desarrollo de software avanzados, que han producido herramientas y mtodos adecuados. Sin embargo, la situacin actual presenta retos nuevos que requieren su mejora. La falta de flexibilidad y el coste de desarrollo de los sistemas de alta integridad, hace que los desarrolladores no estn plenamente satisfechos con las metodologas existentes. El coste de transportar una aplicacin de una plataforma a otra es elevado. En muchos casos, el cdigo resultante es dependiente de las caractersticas especficas del procesador y del comportamiento temporal y del uso de recursos en la plataforma de ejecucin. La evolucin de las redes y paradigmas de comunicacin, as como la necesidad de mayor potencia de cmputo y de tolerancia a fallos ha motivado la interconexin de dispositivos electrnicos. Los mecanismos de comunicacin permiten la transferencia de datos con alta velocidad de transmisin. En este contexto, el concepto de sistema distribuido ha emergido, como sistemas donde sus componentes se ejecutan en varios nodos en paralelo y que interactan entre ellos mediante redes de comunicaciones. Un concepto interesante son los sistemas de tiempo real neutrales respecto a la plataforma de ejecucin. Se caracterizan por la falta de conocimiento de esta plataforma durante su diseo. Esta propiedad es relevante, por que conviene que se ejecuten en la mayor variedad de arquitecturas, tienen una vida media mayor de diez aos y el lugar donde se ejecutan puede variar. El lenguaje de programacin Java es una buena base para el desarrollo de este tipo de sistemas. La popularidad de Java, sus caractersticas y su independencia de la plataforma le han convertido en un lenguaje de inters para las comunidades de tiempo real y de sistemas empotrados. Esta situacin ha motivado el desarrollo de RTSJ (Real-Time Specification for Java), que es una extensin del lenguaje para permitir el desarrollo de sistemas de tiempo real. Entre la extensiones que se han incluido, se encuentran las hebras de tiempo real, eventos asncronos y un modelo de memoria nuevo que permite evitar o limitar el efecto del recolector de memoria. Las ventajas potenciales de Java han motivado su inters en el desarrollo de sistemas de alta integridad. El uso de Java en este tipo de sistemas requiere tcnicas muy estrictas de desarrollo y prueba, as como el seguimiento de estndares relevantes. La versin actual de RTSJ incluye caractersticas que no estn permitidas en el desarrollo de sistemas de alta integridad, como la creacin dinmica de hebras, el uso de memoria dinmica o algunas caractersticas de la orientacin a objetos. El enfoque empleado en otros lenguajes de programacin ha consistido en la definicin de un perfil restringido de los mismos que permita el anlisis esttico de sistemas de alta integridad que deban ser certificados. HRTJ (Hard 2 Real-Time Java) define uno de stos perfiles, que fue desarrollado en el marco del proyecto HIJA (High Integrity Java Applications). Actualmente, se est creando una especificacin similar en el contexto del proceso comunitario de Java (JSR-302). Su objetivo es definir el perfil SCJ (Safety Critical Java) para crear aplicaciones de alta integridad con Java. RTSJ no proporciona mecanismos para el desarrollo de sistemas distribuidos, lo que constituye una carencia importante, dado que la mayora de los sistemas actuales y en el futuro sern distribuidos. Se ha creado un grupo de expertos en sistemas distribuidos de tiempo real en Java (JSR-50) para definir abstracciones apropiadas para solucionar este problema. Sin embargo, en este momento no hay una especificacin formal de las mismas. El objetivo de este trabajo es desarrollar un software de intermediacin de comunicaciones que sea adecuado para el desarrollo de sistemas distribuidos de tiempo real crtico con Java. 1.1 Objetivos y Organizacin El objetivo principal de este trabajo es desarrollar un middleware de comunicaciones para el desarrollo sistemas distribuidos de tiempo real crtico. El objetivo subyacente es allanar el camino para la certificacin de aplicaciones distribuidas con la tecnologa Java. El modelo del middleware debe permitir el uso de herramientas de anlisis para obtener los tiempos de respuesta y optimizar los recursos y servir de punto de partida para la certificacin la certificacin de las aplicaciones que lo usen. A continuacin se listan las actividades ms relevantes realizadas: Definir la lista de requisitos del middleware, teniendo en cuenta las actuales alternativas y las recomendaciones industriales, as como, los requisitos del lenguaje de programacin. Elegir los protocolos de red ms adecuados para los objetivos del trabajo. Determinar el modelo computacional del sistema y asegurar que el tiempo de respuesta de las actividades del sistema es analizable estticamente. Desarrollo de un prototipo operativo compatible con las directrices para el desarrollo de sistemas de alta integridad. Validacin del prototipo desarrollado. Se deber comprobar el comportamiento funcional y un uso predecible de recursos. En el resto del documento se presenta los principales aspectos que caracterizan a RMI-HRT. Despus del estado de la tcnica, la seccin 3 describe el modelo computacional y la seccin 4 muestra el diseo del middleware. La seccin 5 aborda la serializacin predecible y la seccin 6 la validacin en un caso industrial. Finalmente la seccin 7 describe las conclusiones. 2 Estado de la Tcnica 2.1 Sistemas de Tiempo Real Un sistema de tiempo real es aqul en el que la correccin del sistema depende tanto del valor lgico de los resultados, como del instante de tiempo en el que se producen. Dentro de los sistemas de tiempo real podemos distinguir diversos sistemas, los cuales pueden ser clasificados en tres tipos diferentes dependiendo de las causas que producen no respetar los requisitos de tiempo: Crticos: Un incumplimiento puede provocar daos en seres humanos. Firmes: Una respuesta fuera de plazo es intil pero el sistema puede seguir funcionando aunque la calidad de servicio se vea degradada. Acrticos: una respuesta fuera de tiempo tiene una validez relativa, pero el sistema sigue operativo. 2.2 RTSJ RTSJ define un nuevo API con soporte desde la JVM (Java Virtual Machine). La especificacin ha sido creada segn las siguientes bases: no aadir restricciones al entorno de ejecucin de Java, compatibilidad con los programas de Java, no aadir extensiones sintcticas ni palabras reservadas y una ejecucin predecible. Las caractersticas ms relevantes de RTSJ son: Objetos planificables y Planificadores: RTSJ define un modelo de concurrencia basado en un conjunto de hebras o manejadores de eventos asncronos (conocidos como objetos planificables). RTSJ permite utilizar diferentes planificadores, pero el planificador por defecto est basado en prioridades con desalojo (28 prioridades como mnimo). Transferencia asncrona de control: Es una extensin al mecanismo de interrupcin de hebras de Java para permitir la entrega de control y el manejo de excepciones asncronas. Sincronizacin: El algoritmo por defecto para evitar una inversin de prioridad no acotada es el protocolo de herencia de prioridad, aunque el protocolo de techo de prioridad puede usarse bajo demanda. Memoria: Se ha introducido un modelo nuevo de memoria para evitar la incertidumbre que produce el recolector de basura. Define nuevos tipos de memoria: Memoria Inmortal: contiene objetos que nunca sern fragmentados o recolectados por el recolector de basura y pueden ser compartidos por diferentes objetos planificables. Los objetos en memoria inmortal permanecern hasta el final de la aplicacin. Memoria Restringida (scoped): tiene un tiempo de vida limitado. Los objetos ubicados en memoria 3 restringida permanecern ah hasta que no hayan objetos planificables con acceso a los objetos ubicados en dicha memoria. En ese momento todos los objetos en la memoria restringida pueden ser liberados. Hay definidos otros tipos de memoria que permiten tener acceso a memoria fsica. Tiempo y Temporizadores: Se definen clases adicionales para representar tiempos relativos o absolutos con alta resolucin. A cada objeto que representa un tiempo se le asocia un reloj de tiempo real. 2.3 Requisitos Con el fin de comparar diferentes middlewares se ha definido un conjunto de requisitos relacionados con las necesidades y las funciones de los sistemas de alta integridad y sistemas distribuidos: Gestin de hebras: Si el sistema contiene varias hebras (tareas), cada hebra debe ser analizada de manera independiente y la concurrencia debe ser modelada y analizada para demostrar que las situaciones peligrosas tales como: interbloqueo, perdida de plazos, etc, no pueden ocurrir. Adems, algunos modelos y tcnicas de anlisis imponen una serie de restricciones sobre el modelo de concurrencia, por ejemplo: la hebra debe ser creada de forma esttica, y el patrn de activacin debe ser peridico o espordico. Comportamiento temporal predecible: Debe ser posible calcular estticamente el tiempo de respuesta ms desfavorable de las actividades, para poder garantizar el correcto comportamiento temporal del sistema. El middleware forma parte de la aplicacin distribuida, por lo que debe ser analizable y tener un comportamiento predecible. Gestin de memoria: En STRC, la asignacin y liberacin de memoria puede provocar latencias impredecibles, por lo que gestin de memoria debe asegurar que los objetos se crean y eliminan de manera adecuada. Se debe evitar la creacin dinmica de objetos debe ser evitada y proporcionar mecanismos para crear objetos temporales y mantener un estado entre diferentes fases de la aplicacin. Uso de memoria predecible: Debe ser posible determinar una cota mxima a la capacidad de memoria necesaria. Disponer de mecanismos para su calculo tiene un alto valor aadido. Gestin de conexiones: Una de las tareas ms importantes de un middleware es administrar las conexiones entre los nodos que forman el sistema distribuido. Se debe evitar la creacin dinmica de conexiones, por los que e deben establecer durante la inicializacin del sistema y permanecer activas hasta el final de la aplicacin. Adems, no se deben usar conexiones multiplex a travs de una conexin para evitar la generacin de latencias. Uso de red predecible: El protocolos de comunicacin debe permitir el clculo del tiempo de respuesta de cada mensaje en la red. Para ello, se debe determinar estticamente el tamao mximo de los mensajes a trasmitir. Control sobre los parmetros de conexin: Muchas aplicaciones de tiempo real requieren manipular la configuracin y controlar el protocolo de red. Por lo tanto, el middleware debe definir una interfaz o un mecanismo para seleccionar las propiedades de los protocolos. Parmetros de activacin: Los parmetros de activacin de las hebras o los manejadores de eventos deben ser independientes de la implementacin del middleware. Si el planificador est basado en prioridades fijas, el middleware debe proporcionar un mecanismo para especificar las prioridades de todas las hebras que forman la aplicacin distribuida. De igual forma, si la red admite prioridades, el middleware debe incluir mecanismos para su asignacin a los mensajes en la red. Serializacin predecible: Cuando un objeto va a ser enviado a travs de una red, un procedimiento de serializacin traduce el objeto especificado en un flujo lineal de bytes. Del mismo modo, un procedimiento de deserializacin construye un objeto desde un flujo lineal de bytes. Las implementaciones ms comunes usan algoritmos recursivos, polimorfismo y reflexin, por lo que es demasiado complejo determinar el WCET y el uso de los recursos. Un middleware para STRC debe incluir una serializacin predecible. Evitar caractersticas orientadas a objetos: Algunas de las funcionalidades de los lenguajes orientados a objetos (OO) hacen que sea complicado calcular: el cmputo del WCET y el clculo del uso de memoria. Por esta razn, se deben evitar. Mecanismos de recuperacin de errores: Los sistemas deben incluir mecanismos de deteccin recuperacin de errores funcionales y temporales. Interoperabilidad: Es habitual que un sistema coexistan tareas con y sin requisitos de criticidad. Es conveniente incluir mecanismos para la interoperabilidad entre estos tipos de tareas. Perfil de tiempo real crtico de Java: El middleware debe utilizar un subconjunto de Java que permita lograr un alto nivel de predecibilidad y permitir el uso de tcnicas de verificacin. Comportamiento funcional adecuado: Obviamente, el comportamiento lgico debe ser correcto en cuanto a las funcionalidades bsicas. 2.4 Trabajos Relacionados Los middlewares ms relevantes (RT-CORBA [7][8][9], PolyORB [10], RT-GLADE [11], DRTSJ [5], DREQUIEMI [12] y RMI-QoS [13]) fueron comparados de acuerdo a la lista de requisitos. La tabla siguiente muestra los resultados. 4 Tabla 1: Comparacin de alternativas Cada middleware fue analizado de acuerdo con los requisitos asignando un valor de 0 a 4 (algunos campos tienen un "-" cuando la informacin no est disponible). La ltima fila de la tabla muestra que tan bien cada uno de los middlewares cumplen todos los requisitos principales. La ltima columna contiene los porcentajes que representan que tan bien cada requisito es tratado en los principales middlewares. El anlisis revela que no hay ningn middleware en el cual todas las caractersticas se cumplan en un buen nivel. Ninguno de ellos alcanza el sesenta por ciento de los requisitos. De acuerdo con la tabla, RT- CORBA, RT-GLADE y DREQUIMI son los mejores. DRTS es el peor con un 34,62 por ciento. En promedio, slo el 50 por ciento de las necesidades son satisfechas por las actuales alternativas. La tabla est ordenada de acuerdo a la ltima columna en orden descendente con el propsito de identificar los requisitos que son los ms o los menos tratados. Por lo tanto, las primeras filas demuestran que todas las soluciones incluyen un manejo de hebras adecuado. La mayora de ellos permite especificar los parmetros de activacin, como la prioridad y el plazo, y tienen una buena gestin de conexiones. La interoperabilidad es lograda slo en RT-CORBA y PolyORB. La gestin de memoria presenta carencias en todas las soluciones. Requisitos tales como: control sobre las conexiones, mecanismos de recuperacin de errores y conformidad con el perfil de tiempo real crtico de Java solo se logran en pocos middlewares. Finalmente, las ltimas filas revelan que hay falta de predecibilidad en el uso de recursos tales como la memoria y la red. Con casi todos los middlewares no es posible calcular la cantidad de memoria utilizada o cuanto ancho de banda es necesario para enviar los mensajes por la red. Adems, la mayora de las implementaciones usan algoritmos complejos o caractersticas OO que dificultan los anlisis temporales. 2.5 RMI RMI es el modelo de objetos distribuidos de Java que permite invocar un mtodo de un objeto que est sobre otra maquina virtual. Su principal propsito es permitir el desarrollo de aplicaciones distribuidas con el mismo modelo de programacin que en sistemas centralizados. RMI es una infraestructura poderosa para la construccin de aplicaciones distribuidas cliente - servidor. RMI emplea TCP / IP y serializacin de objetos para serializar y deserializar los argumentos y valor de retorno de los mtodos remotos. Tambin utiliza los protocolos http y ftp para el intercambio de clases. El servidor crea un conjunto de objetos remotos, los hace accesibles, y espera por los clientes. Normalmente, el cliente recibe una o ms referencias remotas a los objetos en el servidor mediante un registro que almacena par de referencia remota - objeto remoto. Con las referencias el cliente llama a los mtodos que se encuentran en el servidor. El cliente, el servidor y el registro forman la aplicacin de objetos distribuidos, y RMI es el middleware que proporciona servicios para el desarrollo de aplicaciones de objetos distribuidos. RMI es adecuado para sistemas distribuidos de tiempo real crtico dado que provee la funcionalidad requerida y puede ser analizable. 2.6 Limitaciones en RMI Java RMI presenta algunas limitaciones en sistemas de tiempo real: El uso de tecnologas tales como: reflexin, caractersticas OO y recursividad hacen que sea muy difcil estimar el WCET y el uso de recursos. El modelo de memoria no es apropiado. Las hebras, las conexiones, los objetos remotos, etc. se crean dentro del montculo. Por lo tanto, la ejecucin de las invocaciones remotas sufren los efectos del recolector de basura y los objetos se crean de forma dinmica. En las actuales implementaciones de RMI las conexiones se generan de forma dinmica. Cuando un cliente quiere enviar una invocacin, primero crea una nueva conexin con el servidor. Es difcil estimar el tiempo y los recursos son necesarios para establecer la conexin. Implementaciones de RMI (por ejemplo, GNU Classpath) crean hebras dinmicamente, lo que no es adecuado en sistemas de tiempo real crtico. Uso de algoritmos de serializacin no predecibles. El uso de recursos es completamente transparente, y por lo tanto no es configurable. RMI no permite al programador especificar los parmetros de red. En RMI no se ha teniendo en cuenta los parmetros de tiempo real. No se consideran los parmetros de planificacin o de activacin del cliente o del servidor. RMI no es garantiza una calidad de servicio. 5 3 Modelo Computacional 3.1 Modelo de Anlisis Centralizado El modelo de anlisis para cada nodo del sistema distribuido est basado en el planificador de prioridades fijas con desalojo. Donde a cada hebra se le asigna una prioridad durante la fase de diseo y durante la ejecucin, la hebra ejecutable con la mayor prioridad es ejecutada primero. La planificacin dentro la misma prioridad sigue el orden FIFO. El acceso a los recursos compartidos es mediante el protocolo de techo de prioridades. Es una tcnica madura que permite calcular estticamente el tiempo de respuesta de cada hebra y la planificabilidad de todo el sistema. 3.2 Modelo de Anlisis Distribuido El modelo de anlisis para toda la aplicacin distribuida est basado en el modelo lineal, definido en [14]. El sistema es compuesto de un conjunto de transacciones, ver figura 1. Cada transaccin est compuesta por un conjunto de acciones ordenadas y es caracterizado por un patrn de activacin peridico o espordico. Una accin puede ser una hebra ejecutado una porcin de cdigo o un mensaje enviado por el medio de comunicaciones. Una accin es activada por la previa (excepto por la primera donde el tiempo de activacin es igual al tiempo de activacin de la transaccin) y activa a la siguiente. El anlisis del tiempo de respuesta se basa en los peores casos de tiempo de transmisin y ejecucin. Aunque este modelo es adecuado para varios sistemas, el trabajo [15] extiende el enfoque para soportar transacciones que no son lineales, tales como situaciones donde una accin puede activar varias acciones. Figura 1: Modelo Lineal
3.3 Perfil de tiempo real critico de Java El modelo computacional y la implementacin estn basados en el perfil HRTJ (un subconjunto de RTSJ definido dentro del proyecto HIJA) y la especificacin SCJ. Estos perfiles eliminan las caractersticas que implican una gran sobrecarga y semntica compleja, para proveer un comportamiento predecible. Cada aplicacin ejecuta en dos fases: la fase de inicializacin (donde se llevan a cabo todas las tareas que no son de tiempo real) y la fase de misin (donde la propia funcionalidad de la aplicacin es ejecutada). Todos los objetos que son necesarios durante toda la vida de la aplicacin se crean durante la fase de inicializacin en memoria inmortal y nunca son eliminados. Cada objeto planificable tiene su propia memoria restringida y durante la fase de misin los objetos se crean en memoria restringida de los objetos planificables. Entre cada ejecucin del objeto planificable la memoria privada restringida se libera. No se permiten reas de memoria restringida anidadas ni que sean compartidas por varias hebras. El sistema est compuesto por un conjunto de objetos concurrentes gestionados con un planificador basado en prioridades estticas y con expulsin. Los objetos pueden ser hebras o manejadores de eventos, y deben tener parmetros de activacin peridicos o espordi- cos. Para prevenir una inversin de prioridades ilimitada, se utiliza el protocolo de techo de prioridad para todos los objetos con bloques o mtodos sincronizados. Las transferencias asncronas de control estn prohibidas ya que dificultan el anlisis y la maquina virtual. 3.4 Extensiones al perfil para sistemas distribuidos Para sistemas distribuidos el modelo de comunicaciones est basado en invocaciones remotas. En el caso ms simple, figura 2, dos flujos de control (o dos hebras), uno como cliente y otro como servidor, componen el modelo computacional. El cliente llama a mtodos sobre un equipo remoto. Un servidor obtiene las invocaciones, ejecuta el mtodo apropiado y retorna la salida del mtodo. Como se ve en la figura las invocaciones pueden ser sncronas cuando el cliente invoca un mtodo remoto y espera por la respuesta del servidor. O asncronas cuando el cliente no espera por la respuesta. En una aplicacin ms compleja, puede formarse una cadena de invocaciones donde el servidor ejecuta tambin el rol de cliente. Figura 2: Modelo Computacional En este tipo de sistemas, es necesario emplear un protocolo de comunicaciones con comportamiento temporal predecible. Los mensajes deben cumplir sus plazos de repuesta y estos deben ser verificados por construccin o analticamente. Hay varias redes que ofrecen estas garantas, con diferentes enfoques: 6 Dirigidas por Tiempos (redes de este tipo soportan el protocolo TTP [16]): Los mensajes son enviados en precisos instantes de tiempo, definidos en unas tablas. La construccin de estas tablas permiten garantizar cierto ancho de banda y limitar el peor caso de entrega de un mensaje. Dirigidas por Prioridades (ejemplo: redes CAN [17]): Las prioridades se asignan a los mensajes y se usan para decidir cual es el orden de envi de mensajes. Hay mtodos analticos para calcular el peor tiempo de entrega de mensajes. Enlaces Virtuales: (por ejemplo: redes AFDX [18]): Estas redes aseguran a cada enlace un cierto ancho de banda y limitan la variabilidad (jitter) que pueden sufrir los enlaces virtuales. Algunos aspectos del modelo de invocaciones remotas no son apropiados, comos los servicios web, el servidor de nombre y el recolector de basura distribuido hacen complicado el anlisis. Adems, el nmero de invocaciones en cada activacin tiene que ser conocido y acotado. Con estas restricciones las invocaciones remotas son analizables. 3.5 Requisitos adicionales Hay dos tipos de requisitos adicionales, los que apuntan a la flexibilidad del sistema y los que buscan predecibilidad. Flexibilidad: El servidor debe ser capaz de brindar varios servicios remotos a uno o varios clientes. El cliente debe ser capaz de acceder a uno o varios objetos remotos El servidor debe ser capaz de manejar diferentes clientes de forma concurrente. (tanto los del cliente as como los de la red y los del servidor) deben ser definidos y fijados antes de la ejecucin de los mtodos. Ejemplos: patrones de activacin, prioridades de las hebras, ancho de bando o prioridades del medio de comunicacin. 4 Diseo del middleware RMI-HRT 4.1 Referencias remotas En RMI, el concepto de variable de referencia de Java se extiende a las aplicaciones distribuidas como referencia remota. Una aplicacin puede utilizar las referencias para invocar mtodos en objetos locales o referencias remotas para invocar mtodos en objetos remotos. La referencia remota contiene: la direccin IP, un puerto TCP, un identificador de objeto, y otros parmetros necesarios para invocar mtodos en un objeto remoto especfico. La mayora de los parmetros se refieren a donde el objeto remoto se encuentra, y cualquier referencia remota a in objeto incluye los mismos parmetros. Cuando un cliente utiliza una referencia remota, los parmetros se utilizan para crear una nueva conexin con el servidor. A pesar de que la referencia contiene varios parmetros, es independiente de la conexin y el cliente. Por esta razn, puede ser compartida por varios clientes. En RMI-HRT, cada referencia remota a un objeto remoto se asocia con todos los recursos necesarios para manejar todas las solicitudes invocadas por medio de la referencia. Cada referencia se asocia tambin con los parmetros de tiempo real que debe el cliente, as como el servidor y en la red. Adems, RMI-HRT introduce el concepto de creacin de referencias. Es el proceso por el cual el cliente y el servidor interactan para asignar recursos a las referencias. Se trata de la creacin de una nueva conexin y recursos tales como: hebras y reas de memoria. Todas las referencias en el sistema tienen que ser creadas antes de que los clientes puedan llamar a los mtodos remotos. Este enfoque permite a la aplicacin especificar todos los parmetros de los recurso. Una vez que los recursos estn reservados, no se puede cambiarlos. Cada referencia tiene que tratar con sus parmetros y sus recursos hasta el final de la aplicacin. Si un cliente quiere hacer invocaciones diferentes sobre el mismo objeto remoto con diferentes parmetros, es necesario tener diferentes referencias. Las referencias ya no son genricas, por que representan a un cliente, un servidor, los parmetros de tiempo real, las hebras y las reas de memoria. Por tano, no pueden ser compartidos por varios clientes. La referencia es el medio bsico para llamar a mtodos especficos de un determinado objeto remoto con atributos de tiempo real fijos. 4.2 Modelo de hebras en RMI-HRT El modelo utilizado por RMI contiene slo una fase en la que un servidor siempre espera nuevas conexiones. Cuando se crea una conexin nuevas, se crean las hebras necesarias para manejar las invocaciones que llegan a travs de las nuevas conexiones. La asignacin de recursos y la ejecucin sucede al mismo tiempo. De acuerdo con la especificacin de RMI, las implementaciones pueden utilizar un mecanismo arbitrario de hebras para el manejo de invocaciones ya que los requisitos temporales no se consideran. RMI-HRT define dos fases y un mecanismo de hebras especfico para garantizar un comportamiento temporal adecuado, que es compatible con el modelo computacional. Un enfoque comn es incluir a dos hebras (llamadas Acceptor y Handler) para ejecutar las invocaciones en el lado servidor, como se muestra en la figura 3. El Acceptor acepta nuevas peticiones. Normalmente, crea una nueva conexin a nivel de red y del middleware. Recibe nuevas solicitudes y las entrega al Handler, que realiza la ejecucin del mtodo. En algunos casos, el Handler se crea a peticin del Acceptor. En otros casos, el Handler se toma de un conjunto de hebras ya creadas. 7 Figura 3: Modelo de hebras genrico Con este enfoque, todas las invocaciones nuevas se tratan con los mismos parmetros de planificacin y la primera invocacin en llegar ser la primera en ser tratada. Por lo general, el Acceptor tiene la mxima prioridad para evitar la inversin de prioridades (invocaciones de prioridad alta deben desalojar a invocaciones de baja prioridad en curso). Sin embargo, este enfoque tiene la desventaja de desalojar a una invocacin de prioridad media en proceso (un Handler) para aceptar una nueva invocacin que podra tener una prioridad baja. RMI-HRT tambin se basa en dos hebras: (Listener y Handler). Como se muestra en la figura 4, el Listener es el encargado de crear las referencias remotas durante la fase de inicializacin. Esta operacin supone la creacin de una nueva conexin y un nuevo Handler. En la fase de misin, el Handler es el encargado de aceptar y ejecutar las invocaciones remotas con los parmetros asociados de planificacin. Figura 4: Modelo de hebras en RMI-HRT En RMI-HRT, la inversin de prioridades se evita por que las invocaciones de prioridad media no sern desalojadas por una invocacin de baja prioridad. En otras palabras, el Handler de ms alta prioridad se ejecuta en primer lugar y sin interrupciones. RMI-HRT no requiere la creacin de hebras en el lado del cliente para manejar las llamadas. La hebra que invoca el mtodo remoto, ejecuta el cdigo que enva la solicitud y espera una respuesta. RMI-HRT incluye tambin llamada asincrnica. Se modifica el flujo de control habitual y se permite al cliente llevar a cabo otras tareas mientras el servidor procesa la llamada remota. Sin embargo, RMI-HRT permite este tipo de operaciones nicamente cuando el mtodo remoto no devuelve un valor de retorno. 4.3 Fase de inicializacin En la fase de inicializacin se crean y se reservan los recursos, de acuerdo a los parmetros que describen la configuracin del sistema. Por lo tanto, el cliente y el servidor interactan para reservar recursos tales como: conexiones, hebras y reas de memoria. La Figura 5 describe las tareas llevadas a cabo durante la fase de inicializacin: 1. Cuando la aplicacin del servidor se inicia, la hebra que se encarga de llevar a cabo la inicializacin es ejecutado para crear los objetos utilizados por la aplicaciones, entre ellos, los objetos remotos. Cuando un objeto remoto es creado y exportado, RMI-HRT lleva a cabo varias tareas: Figura 5: Fase de Inicializacin Las clases de configuracin y todas las clases de RMI-HRT (las utilizadas por el servidor) se cargan en memoria (esta tarea se ejecuta slo una vez, cuando el primer objeto remoto es creado). Las clases de serializacin se cargan en la memoria inmortal. El objeto remoto se asocia a un identifcado, que se usa en RMI-HRT para obtener la configuracin de los parmetros de tiempo real y los parmetros de red correspondientes. RMI-HRT carga la clase del esqueleto en la memoria. Una instancia del esqueleto se utiliza para invocar el proceso de serializacin y el mtodo remoto correspondiente. Con los parmetros de red, RMI-HRT configura el protocolo de red subyacente para aceptar nuevas conexiones. Un objeto planificable (Listener) se crea para recibir y manejar el proceso de creacin de referencias. 2. En el lado del cliente, un inicializador cliente crea un objeto planificable asociado a una memoria restringida, y una referencia remota para llevar a cabo la aplicacin cliente. Cuando se crea una referencia remota un conjunto de tareas se llevan a cabo: 8 La configuracin y todas las clases de RMI-HRT se cargan en memoria (esta tarea se ejecuta slo una vez, durante la creacin de la primera referencia remota). Adems, las clases de serializacin se cargan en la memoria inmortal. RMI-HRT carga el suplente (stub) y se crea una instancia (la referencia utilizada para la aplicacin cliente es una referencia a un suplente). Con los parmetros de red, una conexin entre el servidor y el cliente es establecida. Mediante algunos mensajes los parmetros no funcionales son propagados desde el cliente hasta el servidor y vice versa. El Listener se encarga de asociar un nuevo objeto planificable (Handler) a la nueva conexin, que se encargar de tratar las llamadas recibidas a travs de la conexin (referencia). El Listener tambin crea la memoria restringida utilizada por el Handler. A partir de este momento los recursos han sido asignados, y el cliente puede utilizar la referencia para invocar mtodos remotos. 4.4 Fase de misin En la fase de la misin, los recursos ya han sido reservados, por lo tanto, los clientes llevan a cabo las invocaciones remotas y el servidor las procesa. La Figura 6 describe las actividades llevadas a cabo durante la fase de misin: Figura 6: Fase de misin 1. El cliente inicia la invocacin remota llamando a un mtodo auxiliar del suplente, con la misma signatura que el mtodo remoto. 2. El suplente serializa los argumentos del mtodo mediante las clases apropiadas. 3. La solicitud se transmite por la red. Se envan uno o ms mensajes, dependiendo del tamao de la solicitud y la implementacin del propio protocolo. Si la solicitud representa una invocacin asncrona, el suplente devuelve el control al cliente. En caso contrario, espera la respuesta. 4. En el lado del servidor, cuando se recibe una nueva invocacin, se activa el Handler. ste llama al mtodo correspondiente del esqueleto, para extraer los argumentos de la solicitud usando las clases de serializacin. 5. El esqueleto tambin es responsable de invocar el mtodo remoto. 6. El esqueleto invoca las clases de serializacin serializar el valor de retorno. RMI-HRT compone la respuesta con un encabezado fijo y el valor de retorno. Para detectar posibles errores, la respuesta se almacena en un buffer intermedio antes de enviar el mensaje. 7. Si la invocacin es sncrona, el Handler enva la respuesta al cliente y queda a la espera de nuevas invocaciones. 8. En una invocacin sncrona, el suplente llama a las clases de serializacin para obtener el valor de retorno, y pasa retorna el control a la aplicacin. 4.5 Gestin de errores RMI-HRT incluye mecanismos para que la aplicacin adopte medidas en caso de posibles errores. RMI- HRT gestiona las excepciones y controla los tiempos de ejecucin. Se lanza una excepcin, cuando no se cumple el plazo, o cuando el tiempo de ejecucin es superado. RMI-HRT permite a la aplicacin llevar a cabo acciones correctivas o conducir el sistema a un estado seguro. La figura 7 muestra la interaccin entre aplicaciones y el RMI-HRT. Si una excepcin se produce cuando un mtodo remoto se est ejecutando en el servidor, el Hander enva una respuesta al cliente notificando la excepcin, llama al mtodo catchException, y restablece todos las variables y los bferes internos. Al final de la operacin, el Handler puede de recibir nuevas peticiones del cliente. Sin embargo, la aplicacin es quien debe determinar si eliminar el objeto remoto o parar un Handler determinado (una referencia determinada). Figura 7: Gestin de errores Cuando el Handler no cumple su plazo o su mximo tiempo de ejecucin (coste en RTSJ) durante la ejecucin del mtodo remoto, se invoca a missDeadline o a missCost Estos mtodos permiten a la aplicacin las acciones necesarias para tratar estos eventos. Aunque RTSJ no permite dejar un hilo activo, la aplicacin puede tomar medidas para reducir el consumo de CPU. El controlador ejecuta el mtodo catchException, mientras que missDeadline y 9 missCost las ejecutan manejadores de eventos asociados con el Handler: MissHandler y OverrunHandler respectivamente. En el lado cliente, las excepciones son manejadas al igual que con RMI, por lo tanto, la aplicacin cliente puede capturarlas y manejarlas. Se emplean temporizadores para detectar un comportamiento temporal anmalo. Por ejemplo, cuando se produce un error inesperado en el servidor, el temporizador desbloquea el cliente. El valor del temporizador es el tiempo de respuesta de extremo a extremo de la invocacin, calculado analticamente. 4.6 Interfaz de red La figura 8 muestra cmo RMI-HRT asla la parte dependiente de la red en mdulos para soportar diferentes protocolos y que el middleware sea independiente de la red. La configuracin del sistema es responsable de definir qu mdulo ser utilizado para cada referencia remota. Figura 8: Mdulos de red RMI-HRT supone que los mdulos de red encapsulan protocolos de tiempo real, donde el tiempo de transmisin est acotado y puede ser analizado. Adems, RMI-HRT supone que los mdulos de red tienen un comportamiento orientado a conexin y se garantiza la entrega de mensajes. Por lo tanto, RMI- TRH no tiene que encargarse de funciones tales como: la retransmisin de mensajes, algoritmos de gestin de congestin, etc. Se ha definido una interfaz de red para especificar las comunicaciones entre el ncleo de RMI-HRT y el mdulo de red. En la figura 9, podemos ver los cinco grupos de primitivas. Figura 9: Interfaz de Red 1. El primer grupo tiene como objetivo crear conexiones entre el cliente y el servidor. 2. RMI-HRT asume que el nombre de computador est asociado con los parmetros de red (en muchas redes el nombre del host est asociada con una direccin IP). Por lo tanto, el mdulo de red debe proporcionar a RMI-HRT este nombre. 3. El tercer grupo introduce el concepto de stream, que es una secuencia de bytes. Son una abstraccin que permiten enviar o recibir mensajes a travs de una red. 4. El cuarto grupo es el encargado de proporcionar un mecanismo simple para leer y escribir bytes en el stream. 5. Finalmente, el ltimo grupo slo incluye una primitiva para cerrar las conexiones. RMI-RHT gestiona estas primitivas sin saber qu protocolo de red es implementado por el mdulo de red. Los tres primeros grupos de primitivas se invocan durante la fase de inicializacin para crear las conexiones y los streams asociados. En la fase de la misin, RMI-HRT emplea primitivas como read o write para intercambiar mensajes. Al final de la aplicacin o cuando un objeto remoto es eliminado, se ejecuta la primitiva close para liberar la conexin y sus recursos. El servidor utiliza las primitivas accept y createServerHrtSocket para esperar a conexiones nuevas. La primitiva createServerHrtSocket da la orden al mdulo de red para prepararse para recibir nuevas conexiones y la primitiva accept da la orden de esperar y aceptar nuevas conexiones. El cliente tiene que usar la primitiva createHrtSocket para crear una conexin con el servidor. Tanto la primitiva createHrtSocket y accept requieren dos parmetros importantes: el mximo tamao de la solicitud y el mximo tamao de la respuesta. Estos valores se usan para establecer buffers internos. Las primitivas getOutputStream y getInputStream permiten obtener un stream de salida y de entrada de una conexin especfica. Las primitivas write y flush operan sobre un stream de salida, y las primitivas read, available y reset operan sobre un stream de entrada. RMI-HRT supone que la escritura no bloquea la hebra de tiempo real y los valores se almacenan en un buffer interno. Por medio de la primitiva flush RMI-HRT solicita al mdulo de red que enve los datos por la red. El modelo requiere una implementacin predecible de la primitiva flush, con un tiempo de transmisin limitado. La primitiva read obtiene una secuencia de bytes desde el stream de entrada. Cuando el stream est vaco, la hebra de tiempo real que realiza la llamada se bloquea hasta que el stream tenga datos. En el lado servidor, este mecanismo es adecuado ya que el servidor debe esperar de forma indefinida por nuevas solicitudes. Sin embargo, el cliente debe esperar un perodo corto de tiempo por la respuesta. La primitiva 10 available permite a RMI-HRT saber cuntos bytes estn disponibles en el flujo de entrada. 4.7 HRT-JRMP La especificacin de RMI define un protocolo de conexin conocido como JRMP (Java Remote Method Protocol) que establece un formato estndar para el intercambio de peticiones y respuestas. El protocolo es flexible, ya que permite enviar mensajes con diferentes protocolos. Por ejemplo, el protocolo HTTP no permite conexiones directas, pero se puede utilizar para encapsular invocaciones. Adems, JRMP permite multiplexar varias conexiones en una. Estas propiedades permiten ampliar las situaciones en las que se puede emplear RMI, pero complica el anlisis de tiempos de respuesta. Por otro lado, este protocolo tiene algunas caractersticas que reducen su flexibilidad. Por ejemplo, JRMP no permite el intercambio de parmetros no funcionales entre el cliente y el servidor y fue desarrollado principalmente para el protocolo TCP / IP. Aunque algunos middleware utilizan el protocolo JRMP y aaden los parmetros no funcionales como argumento, este trabajo propone HRT-JRMP (Hard Real Time - JRMP), un subconjunto de JRMP adaptado a RMI-HRT y donde las fases de inicializacin y la misin estn claramente definidas. Adems, el HRT-JRTMP es independiente del protocolo de red subyacente. De acuerdo con JRMP, cuando la aplicacin requiere un flujo simple los mensajes son envueltos en el protocolo StreamProtocol. Por lo tanto, el protocolo StreamProtocol es extendido para definir el protocolo HrtStreamProtocol. La figura 10 muestra los mensajes intercambiados en la fase de inicializacin para establecer una conexin. El cliente inicia la negociacin enviando un mensaje; el servidor debe reconocer la negociacin mediante el envo de un ServerIdentifier (el nombre del nodo del servidor). El cliente debe responder con un ClientIdentifier, un hash (de la interfaz del suplente), y un conjunto de parmetros no funcionales. Con el hash, el servidor puede verificar que suplente del cliente se corresponde con el esqueleto. Si no corresponde, el servidor enva un mensaje con un cdigo de error y la excepcin correspondiente. Este mecanismo permite al cliente propagar sus requisitos y al servidor confirmarlos o actualizarlos. La implementacin sabe que todos los parmetros estn disponibles en archivos de configuracin, por lo que se envan referencias a la configuracin (nombre de la referencia) como parmetros no funcionales. Figura 10: HRT-JRMP: Fase de inicializacin La figura 11 muestra la fase de la misin. El cliente puede enviar solicitudes basadas en la versin 1.1 de RMI. El nmero de campos se ha reducido a tres: un valor que representa un mensaje de llamada, un nmero que representa el mtodo que se invoca (asignado por rmic-hrt), y la lista de argumentos. No son necesarios parmetros par identificar el objeto remoto, dado que cada referencia, conexin y Handler hacen referencia al mismo. El hash tambin fue eliminado ya que se envan slo una vez en la fase de inicializacin. Figura 11: HRT-JRMP: Fase de misin La respuesta tiene tres campos: un valor que representa un mensaje de retorno, un cdigo de retorno (un retorno normal o excepcional), y el valor de retorno o la excepcin. Con este nuevo protocolo, la tasa entre el tamao de los datos (en bytes) y el nmero de bytes enviados a travs de la red en la fase de la misin se increment en un porcentaje significativo. 4.8 Gestin de memoria La figura 12 muestra los componentes y los tipos de memorias que interactan durante la ejecucin del mtodo remoto en el cliente. RMI-HRT asume que la hebra del cliente entra en su memoria restringida (CSM) antes de invocar a un mtodo remoto. Por lo que todos los objetos temporales son almacenados en dicha memoria, y se eliminarn en el momento que la hebra del cliente tome la iniciativa de abandonar la memoria. La aplicacin cliente puede utilizar objetos en la memoria inmortal (COI) o crear nuevos objetos, 11 tanto en la memoria inmortal (COI) como en la memoria de restringida (COS). Figura 12: Gestin de memoria en el cliente La solicitud de la invocacin remota no consume memoria restringida, la cabecera y los datos son almacenados en un buffer dentro de la memoria inmortal (B1). RMI-HRT reutiliza objetos en memoria inmortal. A pesar de que la respuesta tambin se almacena en otro buffer en la memoria inmortal (B2), el proceso de deserializacin reconstruye el valor de retorno (ReturnValue) dentro de la memoria restringida (CSM). Adems, algunos mdulos de red necesitan crear objetos temporales (TemporaryObjects). La memoria restringida tiene que ser lo suficientemente grande para contener todos los objetos temporales creados por la aplicacin cliente, el valor de retorno y los objetos creados por el mdulo de red. Si el cliente quiere mantener el valor de retorno o de un estado entre diferentes invocaciones tiene que utilizar memoria inmortal. En el servidor (figura 13), TriggerHandler es una hebra para abordar una carencia de la maquina virtual usada: el Handler no se puede activar cuando llega un mensaje. Esta hebra emplea una memoria restringida (TSM) para esperar por una nueva solicitud y sale de la memoria cuando la invocacin ha sido procesada por el Hanlder. Como consecuencia, todos los objetos creados (TemporaryObjects) por el mdulo de red son eliminados entre invocaciones. Esto no es necesario si el mdulo de red reutiliza objetos en la memoria inmortal. El Handler tambin emplea una memoria restringida (HSM) cada vez que es activado por el TriggerHandler para manejar la nueva solicitud. Puede ser liberada despus de enviar la respuesta al cliente. Como resultado, todos los objetos temporales generados por el proceso de deserializacin se almacenan en la memoria restringida del Handler. Como consecuencia, la implementacin del objeto remoto se debe desarrolladar con estas caractersticas en mente para evitar la generacin asignaciones de memoria ilegales. Adems, la aplicacin tiene que evitar entrar en nuevas memorias restringidas. A pesar de estas limitaciones, la aplicacin puede crear todos los objetos necesarios (SOI y SOS). Por lo tanto, la memoria restringida tiene que ser lo suficientemente grande para contener todos los argumentos de la invocacin y los objetos creados por la ejecucin del mtodo remoto. La solicitud y la respuesta se guardan en buffers ubicados en memoria inmortal (B3, B4). Para mantener un estado entre las invocaciones, la aplicacin se tienen que utilizar objetos en memoria inmortal (SOI). Figura 13: Gestin de memoria en el servidor En resumen, el modelo de memoria propuesto incluye las siguientes caractersticas: i) los objetos planificables, las reas de memoria, los buffers, y todos los objetos necesarios durante la ejecucin de un mtodo remoto se crean en la memoria inmortal; ii) los objetos temporales (ya sean generados por el middleware o por el mtodo remoto) se crean en la memoria restringida; iii) el mtodo remoto puede mantener un estado entre invocaciones utilizando memoria inmortal; iv) la implementacin de RMI- HRT respeta las reglas de asignacin de memoria impuestas por RTSJ y su perfil HRTJ; v) con este modelo, es posible calcular la cantidad de memoria necesaria para invocar un mtodo remoto. 5 Serializacin Predecible 5.1 Introduccin La serializacin es una de las operaciones fundamentales para asegurar la adecuada transmisin de datos independientemente de la representacin de los datos en los nodos y la complejidad de los objetos a ser propagados. Sin embargo, las actuales implementaciones no son validas para sistemas crticos y no hay alternativas: Hacen uso de algoritmos recursivos y tcnicas orientadas a objetos. Estn basadas en la asignacin dinmica de objetos y el uso del recolector de basura. Serializan objetos complejos, que referencian otros objetos formando grafos y bucles, lo que complica la realizacin de anlisis estticos. 12 Finalmente, estos algoritmos no funcionan con una maquina virtual RTSJ, dado que realizan asignaciones ilegales de memoria. 5.2 Requisitos La solucin debe considerar los siguientes requisitos: Conforme con el perfil de tiempo real crtico de Java empleado. Reducir y limitar el uso de recursos, principalmente el uso de memoria y CPU durante la fase de misin. Acotar estticamente el nmero de bytes necesario para representar los objetos. Esta cota es de gran utilidad para estimar el ancho de banda, el tiempo de transmisin y el tiempo de respuesta de extremo a extremo. Tratar un conjunto suficiente de clases Mantener el formato subyacente definido por la especificacin, con la finalidad de potenciar la interoperabilidad. Lograr una serializacin eficiente. 5.3 Enfoque de la serializacin predecible El enfoque propuesto se basa en mover la mayor cantidad posible de tareas hacia el compilador. Por lo tanto, la serializacin se lleva a cabo en diferentes intervalos de tiempo: En tiempo de compilacin, el compilador analiza las clases empleadas y determina la secuencia de valores que representarn el estado de un objeto. Finalmente genera las clases de serializacin que transforman una instancia en una secuencia de bytes. Durante la fase de inicializacin, las clases de serializacin se cargan en memoria. Durante la fase de misin, las clases se invocan para serializar o deserializar objetos. Este enfoque tiene varias ventajas: Se evitan ciertas restricciones: Las restricciones impuestas sobre las aplicaciones de tiempo real no se aplican en el compilador. Cdigo personalizado: Genera un cdigo optimizado para cada clase, sin incluir sentencias innecesarios. Perfil HRTJ: El cdigo generado es ms sencillo, lo que facilita la conformidad con los perfiles de tiempo real crtico. Reduccin de la asignacin dinmica de objetos: Dado que el compilador ejecuta parte de las tareas, en la fase de misin solo se crean los objetos estrictamente necesarios. Reduccin del uso de CPU: El cdigo optimizado que se genera reduce el tiempo de CPU necesario para realizar las operaciones de serializacin. Simplifica el clculo del WCET: La sencillez del cdigo permite definir ms fcilmente el camino de peor caso. 5.4 Estructura de la implementacin La figura 14 representa las clases que participan en la operacin de la serializacin predecible y la integracin con RMI-HRT. Las clases RMI-HRTC, RMICObjectOutputSream y RMICObjectInputSream se utilizan en la primera parte de la serializacin predecible. El suplente, el esqueleto, las clases de serializacin, y las clases RMIHrtObjectOutputSream y RMIHrtObjectInputSream se utilizan en tiempo de ejecucin. Figura 14: Implementacin El compilador rmic-hrt analiza las clases empleadas y genera la correspondiente clase de serializacin y deserializacin. Cuando rmic-hrt genera el suplente y el esqueleto incluye las llamadas adecuadas a los mtodos de serializacin y deserializacin de las clases a la que pertenecen los parmetros de la invocacin y de retorno. 5.5 Clases de serializacin La clase de serializacin est formada principalmente por el mtodo esttico writeObject y, de manera similar, la clase deserializacin est formada principalmente por un mtodo esttico readObject. Las clases RMIHrtObjectOutputStream y RMIHrtObjectInputStream representan el tipo de stream manejado por la serializacin predecible. El mtodo writeObject tiene dos argumentos, el stream de salida y el objeto que se va a convertir. El mtodo readObject necesita el stream de entrada, y devuelve el objeto reconstruido. Las figuras 15 y 16 resumen las tareas llevadas a cabo por los mtodos writeObject y readObject cuando las clases representan un objeto estndar. Cuando las clases representan una cadena o una matriz los mtodos tienen algunas modificaciones. Dado que la serializacin predecible soporta los campos que hacen referencia a un valor nulo, la primera accin es verificar si el estado de la instancia se puede representar con el valor nulo, que se corresponde con el valor TC_NULL 13 Figura 15: mtodo writeObject La secuencia de acciones de serializacin es: Despus de escribir el valor TC_OBJETO al stream, se escribe el descriptor de la clase. Despus del descriptor, cada campo serializable se aade al stream. Los campos de la primera super-clase no serializable aparecen en primer lugar y los campos de la clase en cuestin aparecen al final. Dentro de cada clase, los campos se ordenan cannicamente por el nombre. Todos los campos se leen mediante objetos especficos creados cuando la clase de serializacin es carga en memoria. - Los tipos primitivos se escriben al stream directamente con mtodos genricos de la clase RMIHrtObjectOutputStream. - Los objetos se escriben al stream invocando el mtodo writeObject de la clase correspondiente. Como resultado, un conjunto de mtodos writeObject permite la serializacin de objetos complejos.
Figura 16: mtodo readObject La secuencia en el caso de la deserializacin es: El primer byte en el stream indica si la instancia es nula o si se debe lanzar una excepcin. Se recuperar el descriptor. El mtodo readObject asigna una nueva instancia de la clase para reconstruir el objeto original. Los campos serializables se leen en orden. - Los campos primitivos se leen con mtodos genricos. - readObject de las clases de deserializacin correspondientes se emplea para leer los objetos. Para las matrices, el valor TC_OBJECT cambia por el valor TC_ARRAY. A continuacin, se indica el nmero de elementos. Los elementos primitivos de las matrices se leen con mtodos de la clase RMIHrtObjectOutputStream / RMIHrtObjectInputStream. Si las matrices son de objetos, se emplean los mtodos writeObject / readObject de las clases correspondientes. 5.5 Clases Serializables La estructura de un objeto puede ser compleja. Los objetos pueden incluir referencias a otros objetos y componer grafos con bucles. Si se limita la complejidad de este tipo de objetos, no es posible proporcionar un proceso de serializacin predecible. En la implementacin actual, slo es posible tratar con objetos cuya estructura no cambia en forma dinmica. En otras palabras, las clases serializables deben tener las siguientes caractersticas: Las clases no pueden incluir referencias recursivas. Las clases debe tener un constructor por defecto y todos las cadenas o matrices se debe inicializar en el constructor por defecto con el mximo tamao. Las clases deben implementar la interfaz java.io.HrtSerializable, que permite identificar las clases serializables.
Figura 17: Gestin de memoria 14 5.6 Consideraciones sobre la memoria La aplicacin debe cargar todas las clases de serializacin en la memoria inmortal e inicializa sus variables. La figura 17 muestra cmo el mtodo writeObject, no asigna memoria adicional durante su ejecucin. Por esta razn, la serializacin de cualquier nmero de instancias de la misma clase no consume ms memoria que la asignada en la fase de inicializacin. El mtodo readObject, que implementa la deserializacin en la fase de la misin, crea nuevos objetos para recuperar el objeto original, por lo que debe ser invocado desde memoria restringida para tener la opcin de eliminar los objetos. 6 Validacin Con objeto de validar el diseo e implementacin de RMI-HRT, se ha llevado a cabo un exigente proceso de validacin. Se han empleado varios mtodos para satisfacer todos los requisitos establecidos, como la revisin de la documentacin e inspeccin de cdigo, la ejecucin de pruebas especficas en una plataforma determinada. La mayor parte del se ha dedicado a validar el diseo, el prototipo y el compilador respecto: al comportamiento funcional, al uso de memoria, al uso de la CPU (tiempo de respuesta de extremo a extremo y en cada uno de los bloques funcionales) y al uso de la red (consumo real tiene que ser conforme a lo estimado). 6.1 Caso de Uso El diseo y el prototipo han sido validados en una aplicacin industrial en el marco del proyecto HIJA. El caso de uso lo propuso Thales Avionics. Thales, el socio industrial responsable de la comprobacin y validacin de las herramientas desarrolladas para los sistemas crticos dentro del mencionado proyecto. RMI-HRT se ha utilizado en las comunicaciones de un sistema de gestin de vuelo (FMS). Un FMS lleva a cabo una amplia variedad de tareas durante el vuelo, por ejemplo: proporciona las predicciones de tiempo de vuelo, el kilometraje, la velocidad, y elimina muchas de las operaciones de rutina realizadas normalmente por los pilotos. En una operacin bsica, el piloto inserta una ruta planificada de antemano de origen al destino y el FMS gua la aeronave a lo largo del plan de vuelo generando perfiles verticales y laterales de vuelo y prediciendo el progreso a lo largo de la ruta. Este tipo de sistemas implementan complejas operaciones matemticas y procesamiento de datos con estrictos requisitos temporales. El FMS se compone de las siguientes funciones bsicas: Funcin de plan de vuelo: permite al piloto establecer una trayectoria especfica. Funcin de navegacin: se encarga de determinar la posicin actual de la aeronave. Funcin de rendimiento: proporciona a la tripulacin informacin sobre cada parmetro de la trayectoria como la velocidad de despegue, la capacidad de altitud, y avisos de perfil de optimizacin. Funcin de orientacin: se encarga de generar comandos para guiar a la aeronave a lo largo de los perfiles laterales y verticales. Funcin de prediccin de la trayectoria: responsable de calcular el perfil de vuelo a lo largo de toda la ruta especificada. Todas estas funciones se llevan a cabo utilizando la arquitectura definida en la figura 18. El piloto elige una trayectoria (MCDU), que enva una solicitud al gestor del plan de vuelo con el fin de crear un nuevo plan de vuelo (FP). El nuevo FP es envido a la MCDU, la pantalla de navegacin (ND), un simulador A / C y al gestor de orientacin. El gestor de orientacin tambin recibe entradas desde el simulador A / C para generar datos necesarios para el gestor del piloto automtico que se encarga de gestionar el simulador A / C por medio de un conjunto de comandos. El gestor de prediccin interacta con el gestor del plan de vuelo para actualizar el estado actual de la aeronave (peso, velocidad, actitud, etc.) Figura 18: Sistema de gestin de vuelo Dos middlewares fueron aplicados: una implementacin de RMI de Thales (llamada RMI- UDP) y nuestro middleware RMI-HRT. RMI-UDP se utiliza para cubrir las comunicaciones sin requerimientos temporales (que se representan con lneas negro en la figura) y RMI-HRT se aplicada para manejar la comunicacin entre los componentes con estrictos requisitos de tiempo real (lneas rojas en la figura). Por lo tanto, RMI-HRT interconecta seis componentes importantes en un FMS. La figura 19 describe la plataforma de ejecucin utilizados en esta aplicacin distribuida. Por un lado, la parte de tiempo real crtico se ejecuta en un IMA (Integrated Modular Avionic module) con un sistema operativo ARINC 653. Cada particin ejecuta una mquina virtual de Java RTSJ, en este caso, JamaicaVM. En el otro lado, la parte no crtica de la aplicacin ejecuta en un PC estndar con Linux y una mquina virtual J2SE. AFDX es el protocolo de red 15 que conecta las dos partes de la aplicacin y los puertos de ARINC 653 proporcionar la comunicacin entre particiones. Figura 19: Plataforma de ejecucin Durante la fase de desarrollo e integracin, todas las funcionalidades bsicas fueron probadas La serializacin predecible opero con objetos complejos, y las invocaciones asncronas se utilizaron ampliamente para cumplir con los plazos estrictos. Antes de la prueba final, una serie de pruebas exhaustivas fueron ejecutadas con el fin de garantizar un comportamiento correcto. Adems, el anlisis de memoria, CPU y red han sido exhaustivos y han demostrado la robustez de la aplicacin. Al final, la aplicacin distribuida funciono correctamente y el proyecto finaliz con xito demostrando que nuestro prototipo es fiable para aplicaciones industriales con estrictos requisitos temporales. 7 Conclusiones Este trabajo identifica la necesidad de un middleware que permita a la tecnologa Java desarrollar sistemas distribuidos de tiempo real crtico. RMI-HRT proporciona esta funcionalidad y permite la evaluacin esttica de los tiempos de respuesta de ex- tremo a extremo. Las contribuciones ms destacadas son: Separacin de la asignacin de los recursos de la ejecucin: Se separa la asignacin de los recursos de la ejecucin para mejorar la predecibilidad. En una fase de inicializacin, todos los recursos necesarios para la siguiente fase se crean y todas las operaciones no deterministas (como la creacin de conexiones) se llevan a cabo. En la fase de misin, las invocaciones remotas se realizan con los recursos asignados. Referencia remotas asociadas a recursos y parmetros: Cada referencia se asocia a un conjunto especfico de recursos (objetos planificables, memoria, red). Gestin de errores: RMI-HRT supervisa el comportamiento funcional y temporal. La aplicacin ejecuta el cdigo de tratamiento de errores cuando stos se producen. Invocaciones sncronas y asncronas: Gestiona el modo de invocacin sncrona y asncrona. La aplicacin puede elegir si el cliente tiene que esperar por una respuesta o no. El modo asncrono reduce el uso de los recursos, menos memoria, CPU y ancho de banda. Optimizacin del protocolo JRMP: Se define un protocolo de conexin (HRT-JRMP) para reducir la sobrecarga y mejorar la predictibilidad durante la invocacin remota. Independencia del protocolo de red: Se asla la parte dependiente de la red. Se define una interfaz clara que permite al middleware operar sin conocer detalles del protocolo subyacente. Clculo esttico del tamao mximo de la llamada y de la respuesta: el compilador determina el tamao de la solicitud y la respuesta para cada uno de los mtodos remotos considerando el peor de los casos. Estos valores permiten calcular el ancho de banda necesario. Conforme al perfil de tiempo real crtico de Java: El prototipo incluye todas las caractersticas conforme al perfil HRTJ y a los principales conceptos de la especificacin SCJ actual. Cumplimiento de los requisitos: Los principales requisitos se han satisfecho. Serializacin predecible: Los objetos son transformados en un modo predecible. Agradecimientos Los autores agradecen a los miembros del grupo Sistemas de Tiempo Real y Arquitectura de Servicios Telemticos de la Universidad Politcnica de Madrid por sus tiles apreciaciones. Referencias [1] G. Bollella. The Real-Time Specification for Java http://www.rtj.org. [2] Kwon, J., Wellings, A. and King, S. Ravenscar-java: a high-integrity profile for real-time java: Research articles. Concurr. Comput.: Pract. Exper. 17(5-6): 681713, 2005. [3] High Integrity Java. http://www.hija.info. [4] Locke, D., Andersen, B. S., Brosgol, B., Fulton, M., Henties, T., Hunt, J. J., Nielsen, J. O., Nilsen, K., Schoeberl, M., Tokar, J., Vitek, J. and Wellings, A. Safety-critical java technology specification, public draft. 2011 http://www.jcp.org/en/jsr/detail?id=302 [5] Jsr-50: Distributed Real-Time Specification. http://www.jcp.org/en/jsr/detail?id=050. [6] Sun Microsystems. Java Remote Method Invocation Specification. http://java.sun.com/docs/index.html [7] Rtzen. http://doc.ece.uci.edu/rtzen/. [8] Object Management Group, The Common Object Request Broker: Architecture and Specification: Revision 2.3.1. www.omg.org/cgi-bin/doc?formal/99-10-07/. [9] Object Management Group, Real-Time CORBA Specification. Object anagement Group, August 2002. 16 [10] Vergnaud, T., Hugues, J., Pautet, L. and Kordon, F. Polyorb: A schizophrenic middleware to build versatile reliable distributed applications. Ada-Europe 2004. [11] Garca, J. J. G. and Harbour, M. G. Towards a real-time distributed systems annex in ada. Ada Lett. XXI(1): 6266. 2001. [12] P. Basanta, Marisol Garca-Valls, Iria Estevez- Ayres. No Heap Remote Objects: Leaving Out the Garbage Collector at the Server Side. Second International Workshop on Java Technologies for Real-Time and Embedded Systems JTRES04, LNCS 3292 On the Move to Meaningful Internet Systems 2004: OTM 2004 Worshops, 25-29 Obctober 2004. [13] Tejera, D., Tolosa, R., de Miguel, M. A. and Alonso, A. Two alternative rmi models for real-time distributed applications. ISORC 05: Proceedings of the Eighth IEEE International Symposium on Object-Oriented Real-Time Distributed Computing, IEEE Computer Society, Washington, DC, USA, pp. 390397. 2005. [14] J. P. Gutirrez, J. J. G. Garca, and M. G. Harbour. On the Schedulability Analysis for Distributed Hard Real-Time Systems. In 9th Euromicro Workshop on Real Time Systems (euromicro-rts 97), June 1997. [15] J. J. Gutirrez Garca, J.C. Palencia Gutirrez and M. Gonzlez Harbour. Schedulability Analysis of Distributed Hard Real-Time Systems with Multiple- Event Synchronization. In Proceedings of 12th Euromicro Conference on Real-Time Systems, Stockholm (Sweden), IEEE Computer Society Press, pp. 15-24, June 2000. [16] H. Kopetz y G. Grnsteidl. TTP-A Protocol for Fault-Tolerant Real-Time Systems. IEEE Computer, pp 14-23, January 1994. [17] Robert Bosch GmbH, Stuttgart. CAN Specification Version 2.0. Germany, 1991. [18] ARINC 664. Aircraft Data Network, Part 7 Avionics Full Duplex Switched Ethernet (AFDX) Network, Draft 3. September, 2004.