Download NOTAS SOBRE SIM-JAVA
Document related concepts
no text concepts found
Transcript
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 1 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. 2 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. 3 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 4 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. 5 El paquete simjava Introducció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. 6 El paquete simjava Un 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(); } 7 } class Source extends Sim_entity { private Sim_port out; private int index; private int state; Extiende Sim_entity 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; Constructor de sim_Entity this.state = state; out = new Sim_port("out"); add_port(out); Añade a la lista de puertos } public void body() { Sim_event ev = null; int i; Incluye la funcionalidad 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"); } } 8 El paquete simjava Un 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á en http://www.dcs.ed.ac.uk/home/hase/simjava/simjava-1.2/examples/example1/Example1.java Export CLASSPATH=...... 9 El paquete simjava Enví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. Sim_event ev = new Sim_event(); sim_wait(ev); double time = ev.event_time(); int tag = ev.get_tag(); 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. sim_schedule(dest, 0.1, tag, new Double(3.14)); Y para extraerla Sim_event ev = new Sim_event(); Double d; sim_wait(ev); Double d = (Double)ev.get_data(); 10 El paquete simjava La 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); 11 El paquete simjava La 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: if(sim_waiting() > 0) sim_select(Sim_system.SIM_ANY, ev); else sim_wait(ev); 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 12 El paquete simjava Estadísticos y moritorización Se incluyen classes para generar números aleatorios. – Valores acumulados de variables a lo largo de un periodo de tiempo pueden usarse con la clase Sim_accum. – – Sim_normal_obj, Sim_uniform_obj, Sim_negexp_obj 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. 13