NOTAS SOBRE SIMJAVA Sim Java es una librera
NOTAS SOBRE SIM-JAVA Sim. Java 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. n Se puede ejecutar empleando la web. n La ventaja de java es que incluye objetos y threads y la desventaja es que es interpretado, lo que implica lentitud. n Sim. Java proviene de HASE++, librería en C++ standard. HASE++ ya incluía animaciones. n 2
Overview de HASE++ Colección de objetos en C++ (sim_entities) que se ejecutan en paralelo empleando threads. n El objeto sim_system controla todos los threads, avanza la simulación y mantiene la cola de eventos. n Las entidades se comunican pasando objetos sym_events. n Las primitivas del lenguaje son: n – Sim_schedule(sim_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. n Primitivas suficientes para modelar componentes hardware. 3
La versión en Java Interfaz de clases claro. n Emplea una clase vector en lugar de aritmética de punteros. n Incorpora threads en el lenguaje. n Documentado con javadoc n No se pueden utilizar ficheros con stream. Para pequeñas simulaciones, con tracefile se hace un pipe a un applet de display. n Incluye opciones de estadísticas y generación de números aleatorio. n Incluye opciones para monitorizar el estado de la simulación n 4
La versión en Java Gráficos: es el principal objetivo de simjava. n Rendimiento: Mucho menor que C++ n 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. n Conclusión: Java aportabilidad y realismo en la visualización, perdiendo rendimiento. n 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. n Estas entidades se conectan entre sí con puertos (sim_port class). n Se comunican enviándose y recibiendo objetos evento (sim_event class) a través de los puertos. n Una clase estática (sim_system class) controla todos los threads, avanza el tiempo de simulación, y mantiene los eventos de la cola. n El proceso de simulación se monitoriza con el envío de mensajes de traza que se graban en un fichero. n 6
El paquete simjava Un ejemplo simple n 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( ) n 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 El fichero de una de las entidades: 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 n 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 n Sim_schedule(sim_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. n El código completo está en n http: //www. dcs. ed. ac. uk/home/hase/simjava 1. 2/examples/example 1/Example 1. java Export CLASSPATH=. . . n n n 9
El paquete simjava Envío y recepción de datos n 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(); n n n 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(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 n n n 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) 11 sim_select(Sim_system. SIM_ANY, ev);
El paquete simjava La cola de eventos n 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); n 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 n Se incluyen classes para generar números aleatorios. – Sim_normal_obj, Sim_uniform_obj, Sim_negexp_obj n 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. n 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
- Slides: 13