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