La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Iniciación a Omnet++ José Daniel García Sánchez

Presentaciones similares


Presentación del tema: "Iniciación a Omnet++ José Daniel García Sánchez"— Transcripción de la presentación:

1 Iniciación a Omnet++ José Daniel García Sánchez
Grupo de Arquitectura Comunicaciones y Sistemas Universidad Carlos III de Madrid

2 Contenido

3 Pasos Definir la estructura de la red. Completar el comportamiento.
Lenguaje NED. Completar el comportamiento. Lenguaje C++. Configurar la simulación Archivo ini

4 Ejemplo 1 1 Servidor. El tiempo entre llegadas tiene una distribución exponencial con media de 1 segundo. El tiempo de servicio tiene una distribución exponencial de 0.99 segundos. ¿Cuál es el tiempo medio que una petición permanece en la cola?

5 Cola M/M/1 Evidentemente, este sistema tiene solución analítica.
Simplemente se usa como ejemplo muy sencillo para ilustrar Omnet++.

6 Lenguaje NED Básico Definición de módulos simples.
Definición de módulos compuestos. Definición de redes.

7 Módulos simples Parámetros: Puertas. simple Modulo parameters:
numeric, numeric const (o const), bool, string, xml. Puertas. in o out. Pueden ser arrays. simple Modulo parameters: p1 : tipo, p2 : tipo; gates: in: g1; out: g2; out: g3[]; endsimple;

8 Generador de peticiones
simple Generador parameters: tiempoEntreLlegadas : numeric; gates: out: salidaPeticiones; endsimple;

9 Servidor simple Servidor parameters: tiempoServicio: numeric; gates:
in: entradaPeticiones; endsimple;

10 Módulos compuestos Permiten componer módulos complejos a partir de otros. Se usan para interconectar módulos. Se pueden realizar múltiples niveles de composición. module nombre parameters: //... gates: submodules: connections: endmodule;

11 Conexión de módulos module Red parameters: tiempoLlegadas : numeric,
tiempoServicio : numeric; submodules: gen : Generador; tiempoEntreLlegadas = tiempoLlegadas; svr : Servidor; tiempoServicio = tiempoServicio; connections: gen.salidaPeticiones --> svr.entradaPeticiones; endmodule;

12 Red Instanciación de la red. Puede contener asignación de parámetros.
network red : Red endnetwork;

13 Programación de módulos simples
Es necesario definir el comportamiento de los módulos simples. Iniciación Finalización. Tratamiento de mensajes. Cada módulo simple se programa como una clase C++. Hereda de cSimpleModule

14 Modelos de tratamiento de mensajes
Síncrono Se define un bucle completo de tratamiento. Más sencillo de comprender inicialmente. Requiere espacio de pila. Otros problemas. Asíncrono Disparado por eventos. Más costoso de comprender. No requiere espacio de pila.

15 Clase generador #include <omnetpp.h>
class Generador : public cSimpleModule { Module_Class_Members(Generador, cSimpleModule, 4096);  private: virtual void initialize(); virtual void activity(); virtual void finish(); int salida_; int enviados_; };

16 Generador: Iniciación y Finalización
#include "generador.h" Define_Module(Generador);  void Generador::initialize() { salida_ = findGate("salidaPeticiones"); if (salida_ < 0) opp_error("puerta de salida no encontrada"); enviados_ = 0; } void Generador::finish() ev << "Mensajes enviados: " << enviados_ << endl;

17 Generador: Actividad void Generador::activity() {
cPar tiempo_entre_llegadas=par("tiempoEntreLlegadas"); for (;;) { double tiempo = tiempo_entre_llegadas; wait(tiempo); cMessage * msg = new cMessage("peticion"); send(msg, salida_); enviados_++; }

18 Clase servidor #include <omnetpp.h>
class Servidor : public cSimpleModule { Module_Class_Members(Servidor, cSimpleModule, 4096); private: virtual void initialize(); virtual void activity(); virtual void finish(); int procesados_; };

19 Servidor: Iniciación y Finalización
#include "servidor.h" Define_Module(Servidor); void Servidor::initialize() { procesados_ = 0; } void Servidor::finish() ev << "Peticiones procesadas: " << procesados_ << endl;

20 Servidor: Actividad void Servidor::activity() { cPar tiempo_servicio =
for (;;) { cMessage * msg = receive(); delete msg; double tiempo = tiempo_servicio; wait(tiempo); procesados_++; }

21 Vale ¿Y ahora qué? Se pueden generar dos tipos de ejecutables:
Interfaz de usuario gráfico: Útil para depurar y comprender. Interfaz de consola: Más eficaz para realizar las simulaciones por lotes.

22 Proceso de compilación

23 Compilación Omnet++ permite generar automáticamente los Makefile.
Ejemplo para Windows: opp_nmakemake –u Cmdenv –f –o simred opp_nmakemake –u Tkenv –f –o simred nmake –f Makefile.vc

24 Configuración: omnetpp.ini
[General] network=red sim-time-limit = 10s [Parameters] red.tiempoLlegadas=1 red.tiempoServicio=0.99

25 Seamos realistas No se puede sustituir una distribución por su media.
Hace falta asignar distribuciones aleatorias a los parámetros. Y además: No se puede recibir un mensaje mientras se está en un wait.

26 Uso de una cola de peticiones
class Servidor : public cSimpleModule { //... private: cQueue * cola_peticiones_; };

27 activity() void Servidor::activity() {
cPar tiempo_servicio = par("tiempoServicio"); for (;;) { cMessage * msg; if (cola_peticiones_->empty()) { msg = receive(); } else { msg = check_and_cast<cMessage*>(cola_peticiones_->pop()); ev << "Enviado: " << msg->sendingTime() << ", procesando: " << simTime() << endl; delete msg; double tiempo = tiempo_servicio; waitAndEnqueue(tiempo,cola_peticiones_); procesados_++;

28 Generación de números aleatorios
Un generador de números pseudoaleatorios Genera números enteros. Basado en un algoritmo determinista. Parte de una semilla inicial. Necesarios para generar distribuciones aleatorias.

29 Generadores de números aleatorios
Congruencial lineal. Periodo 231 Mersenne-Twister [1998] Periodo de Akaroa. Para ejecutar replicaciones paralelas en clusters.

30 Distribuciones aleatorias
Basadas en generadores de números aleatorias. Disponibles las más típicas. Se pueden añadir nuevas (si uno sabe matemáticas suficientes).

31 Importante Cuidado con las variables autocorreladas.
Mucho cuidado con generar dos distribuciones a partir de una misma fuente aleatoria.

32 Configuración de parámetros
[General] network=red sim-time-limit = 1m num-rngs=2 **.rng-0=0 **.rng-1=1 [Parameters] red.tiempoLlegadas=exponential(1,0); red.tiempoServicio=exponential(0.9,1);

33 Recogida de estadísticas
Omnet++ ofrece herramientas para recoger estadísticas de los resultados. La más sencilla es cStdDev que permite recoger estadísticos sencillos de una muestra.

34 Generador: Recogida de estadísticas
class Servidor : public cSimpleModule { //... private: cStdDev tiempo_espera_; };

35 Generador: Recogida de estadísticas
void Servidor::activity() { //... tiempo_espera_.collect(simTime() - msg->sendingTime()); } void Servidor::finish() delete cola_peticiones_; ev << "Peticiones procesadas: " << tiempo_espera_.samples() << endl; ev << "Tiempo medio: " << tiempo_espera_.mean() << endl; ev << "Varianza: " << tiempo_espera_.variance() << endl;

36 Recogida de estadísticas más detallada
cWeightedStdDev Pesos en las medidas  Longitud media. cLongHistogram, cDoubleHistogram, cVarHistogram Histogramas cPSquare Cuantiles

37 Grabación de datos vectoriales
Posibilidad de guardar una serie temporal para posterior análisis. Archivo con extensión vec. Se puede procesar con herramienta plove.

38 Servidor: Grabación de vectores
class Servidor : public cSimpleModule { //... private: cOutVector vec_tiempo_espera_; cOutVector vec_longitud_cola_; };

39 Servidor: Grabación de datos vectoriales
void Servidor::activity() { //... vec_tiempo_espera_.record( simTime()-msg->sendingTime()); vec_longitud_cola_.record( cola_peticiones_->length()); }

40

41 Estimación del tiempo de espera
Sea Ti el tiempo de espera de la i-ésima petición. ¿Puedo usar T para estimar el tiempo de espera de las peticiones? No porque Ti no son independientes ni idénticamente distribuidas. Pero podría estimar las distribuciones de cada uno de los Ti.

42 Si solamente ejecuto la simulación una vez solamente tengo una muestra de cada variable aleatoria Ti. Solución: Realizar m ejecuciones independientes. Tij: Tiempo de espera de la i-ésima petición en la j-ésima replicación. Cada ejecución usa las mismas condiciones inciales. Solo cambian las semillas de generación de números aleatorios.

43 Independencia entre ejecuciones
T11,T12,...,T1n son muestras de la variable aleatoria Ti. Cada Ti puede seguir una distribución distinta. Pero ¿Cómo se determina m? ¿Depende del tipo de simulación?

44 Simulaciones con finalización predefinida
Se sabe cuando terminan. Un sistema que se reinicia pasado un cierto tiempo. Un sistema que tiene una condición de terminación. Simular la transmisión de un video.

45 Preguntas para simulaciones con finalización predefinida
Estimación del intervalo de confianza a partir de n realizaciones de simulación estocástica. ¿Cuántas realizaciones tengo que hacer si quiere obtener una precisión determinada?

46 Simulación sin terminación definida
No existe un evento de terminación de la simulación. Nos interesan el comportamiento del sistema en su estado estacionario. Hay que detectar y eliminar el estado transitorio.

47 Estado transitorio y estado estacionario

48 Preguntas ¿Cómo elimino la parte de la simulación que se corresponde con el estado transitorio? Finalización de la simulación: Si termino demasiado pronto  resultados con variabilidad dependiente de las semillas. Si termino demasiado tarde  estoy desperdiciando tiempo y recursos.

49 Compliquemos el problema
El cliente y el servidor están conectados por un canal: Ancho de banda de 128 Kbps. El retraso sigue una distribución normal de media 1us y sigma 0.01. Los tamaños de los mensajes tienen una distribución lognormal mu=6 y sigma=0.4

50 Definición de canales Omnet permite definir un tipo de canal a partir de: Ancho de banda. Tasa de errores. Retraso. channel nombre delay valor error valor datarate valor endchannel;

51 Ejemplo de canal channel conexion datarate 128000
delay normal(1e-6,0.01,3) endchannel module Red //... connections: gen.salidaPeticiones --> conexion --> svr.entradaPeticiones; endmodule;

52 Generación de mensajes con tamaño
void Generador::activity() { cPar tiempo_entre_llegadas = par("tiempoEntreLlegadas"); cPar tam_mensaje = par("longitudMensaje"); for (;;) { double tiempo = tiempo_entre_llegadas; wait(tiempo); cMessage * msg = new cMessage("peticion"); long longitud = tam_mensaje; msg->setLength(longitud); send(msg, salida_); enviados_++; }

53 Y aún hay más ... Implementación asíncrona de módulos.
Mensajes definidos por el usuario. Enrutamiento automático. Recogida de datos no vectoriales para múltiples realizaciones. Simulación paralela: Realizaciones paralelas. Partición del modelo.

54 Y todavía más ... INET Framework. Mobility Framwork. IPV6.


Descargar ppt "Iniciación a Omnet++ José Daniel García Sánchez"

Presentaciones similares


Anuncios Google