130 likes | 259 Views
NOTAS SOBRE SIM-JAVA. SimJava es una librería de simulación escrita en lenguaje Java. Permite incorporar simulaciones animadas en páginas web. DAVID ESCUDERO MANCEBO ESCUELA UNIVERSITARIA POLITÉCNICA. Introducción.
E N D
NOTAS SOBRE SIM-JAVA SimJava es una librería de simulación escrita en lenguaje Java. Permite incorporar simulaciones animadas en páginas web. DAVID ESCUDERO MANCEBO ESCUELA UNIVERSITARIA POLITÉCNICA
Introducción • El principal objetivos es crear describir “diagramas vivos” para describir el comportamiento de sistemas. • Se puede ejecutar empleando la web. • La ventaja de java es que incluye objetos y threads y la desventaja es que es interpretado, lo que implica lentitud. • SimJava proviene de HASE++, librería en C++ standard. HASE++ ya incluía animaciones.
Overview de HASE++ • Colección de objetos en C++ (sim_entities) que se ejecutan en paralelo empleando threads. • El objeto sim_system controla todos los threads, avanza la simulación y mantiene la cola de eventos. • Las entidades se comunican pasando objetos sym_events . • Las primitivas del lenguaje son: • Sim_schedule(sim_port port, double delay, int tag) que envía un mensaje a la entidad conectada al puerto tras un retardo de simulación con un tag dado. • Sim_wait(sim_event &ev) espera un evento enviado con sim_schedule. • Sim_hold(double t) bloquea por t instantes de tiempos. • Sim_trace(int level, char* ...) añade una línea al fichero de traza. • Primitivas suficientes para modelar componentes hardware.
La versión en Java • Interfaz de clases claro. • Emplea una clase vector en lugar de aritmética de punteros. • Incorpora threads en el lenguaje. • Documentado con javadoc • No se pueden utilizar ficheros con stream. Para pequeñas simulaciones, con tracefile se hace un pipe a un applet de display. • Incluye opciones de estadísticas y generación de números aleatorio. • Incluye opciones para monitorizar el estado de la simulación
La versión en Java • Gráficos: es el principal objetivo de simjava. • Rendimiento: Mucho menor que C++ • Threads: cada objeto de simulación se ejecuta en su propio thread, por lo que la implementación concreta de los threads es muy importante. El óptimo en Solaris es de 128 threads. • Conclusión: Java aporta portabilidad y realismo en la visualización, perdiendo rendimiento.
El paquete simjavaIntroducción • Una simulación simjava es una colección de entidades (Sim_entitiy class) cada una de las cuales se ejecuta en su propio thread. • Estas entidades se conectan entre sí con puertos (sim_port class). • Se comunican enviándose y recibiendo objetos evento (sim_event class) a través de los puertos. • Una clase estática (sim_system class) controla todos los threads, avanza el tiempo de simulación, y mantiene los eventos de la cola. • El proceso de simulación se monitoriza con el envío de mensajes de traza que se graban en un fichero.
El paquete simjavaUn ejemplo simple • Para construir una simulación: • Codificar el comportamiento de las entidad. Esto se hace extendiendo la clase sim_entity y sobreescribiendo el método body( ) • Añadiendo instancias de estas entidades al objeto estático sim_system, empleando sim_system.add(entity) • Enlazar los puertos de las entidades, con Sim_system.link_ports( ) • Arrancar la simulación con Sim_system.run( ) • El fichero principal import eduni.simjava.*; class Example { public static void main(String args[]) { Sim_system.initialise(); Sim_system.add(new Source("Sender", 1, Source.SRC_OK)); Sim_system.add(new Sink("Receiver", 2, Sink.SINK_OK)); Sim_system.link_ports("Sender", "out", "Receiver", "in"); Sim_system.run(); } }
class Source extends Sim_entity { private Sim_port out; private int index; private int state; public static final int SRC_OK = 0; public static final int SRC_BLOCKED = 1; public Source(String name, int index, int state) { super(name); this.index = index; this.state = state; out = new Sim_port("out"); add_port(out); } public void body() { Sim_event ev = null; int i; System.out.println("About to do body S"); for (i=index; i<100; i++) { sim_schedule(out,0.0,0); sim_wait(ev); state = SRC_BLOCKED; sim_hold(10.0); state = SRC_OK; sim_trace(1,"C Src loop index is "+i); } System.out.println("Exiting body S"); } } Extiende Sim_entity • El fichero de una de las entidades: Constructor de sim_Entity Añade a la lista de puertos Incluye la funcionalidad
El paquete simjavaUn ejemplo simple • Sim_schedule(sim_port port, double delay, int tag) envia un mensaje a la unidad conectada en port en delay unidades de tiempo, con la información tag. • Sim_wait(Sim_event ev) espera un evento que le envíen empleando Sim_schedule( ). • Sim_hold(double t) bloquea la entidad durante t instantes de tiempo. • Sim_trace(int level, String msg ) añade un mensaje al fichero de traza. • El código completo está enhttp://www.dcs.ed.ac.uk/home/hase/simjava/simjava-1.2/examples/example1/Example1.java • Export CLASSPATH=......
El paquete simjavaEnvío y recepción de datos • El envío y recepción de información se hace con eventos. Aunque se inicialice a null, contiene información extra. • Mediante el argumento tab sólo se puede enviar información típicamente relativa al tipo de evento. Get_tag( ) • Para enviar más información, se puede añadir un argumento a sim_schedule. • Y para extraerla Sim_event ev = new Sim_event(); sim_wait(ev); double time = ev.event_time(); int tag = ev.get_tag(); sim_schedule(dest, 0.1, tag, new Double(3.14)); Sim_event ev = new Sim_event(); Double d; sim_wait(ev); Double d = (Double)ev.get_data();
El paquete simjavaLa cola de eventos • El métodos sim_wait( ) espera hasta la llegada de un evento. Sin embargo si una entidad está ocupada cuando llega un evento (sim_hold( ) ), el evento pasa a la lista de espera. Sim_wait( ) no devuelve dicho evento, sino que espera por uno nuevo. • Los eventos pueden ser extraídos de la cola de espera con el comando sim_select(Sim_predicate pred, Sim_event ev). Los predicados se usan para extraer eventos específicos de la cola. • El método sim_waiting( ) devuelve la cuenta de el número de eventos en la cola. // sender sim_schedule(out, 0.5, 0); // receiver Sim_event ev = new Sim_event(); sim_hold(2.0); // sim_wait() here would block indefinitely as event arrived // whilst we were holding System.out.println("Sim_waiting() returns: "+sim_waiting()); if(sim_waiting() > 0) sim_select(Sim_system.SIM_ANY, ev);
El paquete simjavaLa cola de eventos • Si es necesario tomar el siguiente evento que ha llegado o el que va a llegar: • Sim_get_next(ev) que es implementa como: • Sim_system.SIM_ANY es un metacaracter para tomar cualquier evento. Para seleccionar se emplean los predicados: • Sim_select (new Sim_type_p(tag), ev) para elegir sólo los que confronten con un tag • Sim_select (new Sim_from_p(id), ev) para elegir sólo los que tengan un identificador id. • Pueden programarse más predicados if(sim_waiting() > 0) sim_select(Sim_system.SIM_ANY, ev); else sim_wait(ev);
El paquete simjavaEstadísticos y moritorización • Se incluyen classes para generar números aleatorios. • Sim_normal_obj, Sim_uniform_obj, Sim_negexp_obj • Valores acumulados de variables a lo largo de un periodo de tiempo pueden usarse con la clase Sim_accum. • Update(double interval, double value) indica que la variable tuvo el valor value en el intervalo de tiempo interval. • Max( ) min( ) interval_sum ( ) son algunas de las funciones incluidas para hacer estadísticas. • La clase Sim_system tiene métodos para monitorizar la simulación • Set_auto_trace(boolean on) monitoriza todo lo que ocurre. • Get_entity_id(String name) devuelve el número de identificador de la entidad. • Clock( ) devuelve el tiempo de simulación.