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

Slides:



Advertisements
Presentaciones similares
UNIVERSIDAD PRIVADA SAN PEDRO ESCUELA INGENIERIA CIVIL
Advertisements

Introducción a C++ Sistemas Operativos
2. Manejo de memoria Manejo de memoria estática
Complejidad Computacional
Curso de java básico (scjp)
Estructura de Datos Unidad 4. Recursividad Dra. María Lucía Barrón Estrada Enero-Junio 2007.
Clases en C++.
Definición de Clases y Variables de referencia.
Fundamentos de la programación orientada a objetos
Lenguaje de programación Java
INDUSOFT Software para generación de completas aplicaciones industriales multi-plataforma Se compone de un completo y potente conjunto de herramientas.
Common Object Request Broker Architecture
TEMA 3. REDES.
Los servicios de red son la fundación de una red de trabajo en un ambiente de computadoras. Generalmente los servicios de red son instalados en uno o.
Archivos Implementar un método que lea una secuencia de números enteros de un archivo y compute la cantidad de elementos leídos.
Desarrollo de Aplicaciones para Internet
Capitulo 4 Excepciones.
Introducción a Remoting
Siguiente Excepciones Introducción. AnteriorSiguiente Definición Una excepción es un evento que ocurre durante la ejecución de un programa que desestabiliza.
Informática II Prof. Dr. Gustavo Patiño MJ
INFORMATICA I Funciones CLASE 13.
Genéricos en Java Jaime Ramírez, Ángel Lucas González
1.2 Sintaxis del lenguaje Java.
Marzo 2007 Lenguajes Visuales Clase III.
Estructuras de datos M.I.A Daniel Alejandro García López.
Lenguaje de Programación II Manejo de Paquetes Corporación Universitaria del Caribe CECAR.
Funciones “En C” Semestre de Otoño 2006 Claudio Gutiérrez-Soto.
Tema 7: Polimorfismo Antonio J. Sierra. Índice Introducción. Sobrecarga de métodos. Objetos como parámetros. Paso de argumentos. Devolución de objetos.

POO Java Módulo 3 Elementos de programas Identificadores
Java Orientado a Objetos CLASES,OBJETOS Y MÉTODOS
Clases y objetos La unidad fundamental de programación OO son las clases. Conjunto de métodos y semántica Qué se va a hacer POO Clase: que define la implementación.
Universidad Autónoma del Estado de Hidalgo Instituto de Ciencias Básicas e Ingeniería Área Académica de Computación y Electrónica Licenciatura en Ciencias.
POO en C++ Programación Orientada a Objetos. Declaración de clases con struct Las clases en C++ pueden definirse utilizando la construcción struct Ejemplo:
USA agenda e itemAgenda
Modelado Arquitectónico
Juan Andrada Romero Jose Domingo López López.  Introducción  Conceptos  Arquitectura JXTA  Protocolos  Demostración  Alternativas  Conclusiones.
Semana 5 Subprogramas..
Jerarquía de Clases: Herencia, Composición y Polimorfismo
Uso de Google Web API, SOAP y WSDL
* FRAUSTO JIMENEZ GABRIELA * * HERNANDEZ TORRES ANA LAURA * * MANDUJANO JUAN CARLOS * * NOVA MARIN YARELI PAULINA * * ZAVALA CORTE JOCELYN ARELI *
Introducción a la Programación. Lenguaje de Máquina.
Capitulo # 4 herencia PROGRAMACION III UNIVERSIDAD
Programación Orientada a Objetos usando CONSTRUCTORES DESTRUCTORES.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Encapsulamiento.
LENGUAJE DE PROGRAMACIÓN
Patrones de Diseño: Command
KYOeasyprint IMPRESIÓN DE DOCUMENTOS CON UN SIMPLE CLICK.
Computación II Unidad X Manejo de Excepciones. Presentación de la Unidad Objetivos: –Saber manejar situaciones inesperadas dentro de un programa –Comprender.
Luis Pereda Calvo1 Comportamiento de Objetos Estrategia (Strategy) *Política (Policy)
Introducción Líneas de Espera
Recursividad (2 clases) 1. Nivelación Funciones Menú Vectores String
Introducción a la Simulación de Eventos Discretos José Daniel García Sánchez Grupo de Arquitectura Comunicaciones y Sistemas Universidad Carlos III de.
CONCEPTOS FUNDAMENTALES DEL NIVEL DEL SISTEMA OPERATIVO
Diagrama de Actividades
TEMA 10: DIAGRAMA DE: OBJETOS, SECUENCIA Y DESPLIEGUE EN UML
Unidad 2.1: INTRODUCCIÓN A LA ORIENTACIÓN A OBJETOS.
Detalles Generales sobre Java
Propuestas arquitectónicas para servidores Web distribuidos con réplicas parciales Septiembre de 2005 Autor: José Daniel García Sánchez Directores:Jesús.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS GUI.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Tipo.
ESTRUCTURAS LINEALES “LA PILA”
Desarrollador Profesional de Juegos Programación III Unidad I El manejador universal.
Acceso a Datos Erick López Ovando Licenciado en Informática.
 Las funciones son un conjunto de instrucciones que realizan una tarea específica. En general toman unos valores de entrada, llamados parámetros y proporcionan.
Personalización y Extensión de Simio Material del capítulo 10 de Simio y Simulación: Modelado, Análisis, Aplicaciones.
LICETH CAJAS 3RO ASI 26/10/2010. Es un lenguaje de programación diseñado para crear una amplia gama de aplicaciones que se ejecutan en.NET Framework,
Prof. Manuel B. Sánchez. Es un mecanismo y uno de los pilares de la POO que permite definir nuevas clases a partir de otras preexistentes. La Herencia.
Programación I Clases. Paradigma POO La programación Orientada a objetos (POO) es una forma programar, más cercana a como expresaríamos las cosas en la.
Programación en Java Introducción a Java. Reseña histórica Surge en 1991 por Sun Microsystems Desarrollado para electrodomésticos Se buscaba un código.
Transcripción de la presentación:

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

Contenido

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

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?

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

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

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;

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

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

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;

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;

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

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

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.

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_; };

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;

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_++; }

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_; };

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;

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

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.

Proceso de compilación

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

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

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.

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

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_++;

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.

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

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).

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

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);

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.

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

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;

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

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.

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

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

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.

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.

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?

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.

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?

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.

Estado transitorio y estado estacionario

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.

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

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;

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

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_++; }

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.

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