Preview only show first 6 pages with water mark for full document please download
Transcript
B. Apéndice B Programas creados para automatizar las simulaciones Aquí se detalla el contenido de los scripts usados en el estudio de dimensionamiento y multiplexión, así como programas adicionales utilizados para el calcula de estadísticos como medias, varianzas o intervalos de confianza.
Programas del estudio de multiplexión simulacion.sh __________________________________________________________________________ #! /bin/bash # fichero para crear las simulaciones fuentes=$1; codec=$2; alfa=$3; inicio=10; incremento=10; fin=70; f_entorno=entorno_mux; [ ! -d estadisticas_N$fuentes$codec ] || (rm -r estadisticas_N$fuentes$codec; echo "Borré el antiguo directorio \"estadisticas_N$fuentes$codec\" .") mkdir estadisticas_N$fuentes$codec; capacidad=`./capacidad $fuentes $codec $alfa | awk '{if($1=="Cap")print $2}'`; for bufer in 1 `seq $inicio $incremento $fin` do # Borrará un archivo sólo si existe, si no existe sólo ejecuta la primera comparación f_plot=N"$fuentes"_alfa"$alfa"_bufer"$bufer"_codec"$codec".plot [ ! -f "$f_entorno$bufer.ef" ] || (rm -f $f_entorno$bufer; echo "Borré el antiguo archivo \"$f_entorno$bufer.ef\" .") #[ ! -f "$f_plot" ] || (rm -f $f_plot; echo "Borré el antiguo archivo \"$f_plot\" .") # Guarda el tamano del bufer en bits bufer_bits=`./parametros $fuentes $codec $alfa | awk -v bufer=$bufer '{if(bufer==$1)print $2}'`; cp $f_entorno.ef $f_entorno$bufer.ef; echo "Creé el nuevo archivo \"$f_entorno$bufer.ef\" ."; awk -v valor=$bufer_bits -v capacidad=$capacidad -v fichero=$f_entorno$bufer.ef -f entorno.awk $f_entorno.ef; for seed in `seq 101 121` do f_ov=ov_N"$fuentes"_alfa"$alfa"_bufer"$bufer"_seed"$seed" op_runsim -mem_optimize true -net_name voz_modificado-"$fuentes"fuentes$codec noprompt -ef $f_entorno$bufer -seed $seed -ov_file $f_ov; sh estadisticas.sh $f_ov $bufer $f_plot $fuentes $codec; done done; # Hago limpieza rm *.ot rm /home/juan/*.ov
59
__________________________________________________________________________ estadisticas.sh __________________________________________________________________________ # Maneja los ficheros de estadisticas .ov pasandolos a formanto ASCII # e invocando a los programas que calculan la probabilidad de perdidas f_salida=/home/juan/salida; # nombre del fichero txt donde guardaremos las estadisticas. f_ov=$1; # nombre del fichero .ov generado por opnet bufer=$2; f_plot=$3; fuentes=$4; codec=$5; dir_project=/home/juan/op_models/voz_modificado.project/; # directorio donde se guardan los .ov op_cvov -output_file_path $f_ov.txt -vector_data -vector_data_format S\# vector_patterns ...overflows ...busy -m $f_ov ; cp $dir_project$f_ov.ov /home/juan/; # Borrará un archivo sólo si existe, si no existe sólo ejecuta la primera comparación [ ! -f "$dir_project$f_ov.ov" ] || (rm -f $dir_project$f_ov.ov; echo "Borré el antiguo archivo \"$dir_project$f_ov.ov\" .") awk -v bufer=$bufer -f estadisticas.awk $f_ov.txt >> estadisticas_N$fuentes$codec/$f_plot ; rm $f_ov.txt;
__________________________________________________________________________ grafica.sh __________________________________________________________________________ # Fichero: grafica.sh # Fecha : 2/02/08 #Autor : Juan I. Jimenez #-------------------------------------------------------------------------# DESCRIPCION #-------------------------------------------------------------------------# Calcula el la probabilidad media de perdidas para cada valor del bufer # en funcion de todos los puntos obtenidos con las distintas simulaciones. # Posteriormente pinta las graficas usando gnuplot. # #-------------------------------------------------------------------------#-------------------------------------------------------------------------# INVOCACION #-------------------------------------------------------------------------# # sh grafica.sh #-------------------------------------------------------------------------# BUG IMPORTANTE: SI FALTA ALGÚN DIRECTORIO DE LOS QUE BUSCA, LOS SIGUIENTES # NO LO TENDRÁ EN CUENTA #-------------------------------------------------------------------------# Argumentos que se pasan al script por linea de comandos # para recorrer los directorios que contienen los ficheros con los puntos # Tambien creamos una variable con el nombre base de los directorios # #-------------------------------------------------------------------------dir=estadisticas_N; alfa=0.65; #--------------------------------------------------------------------------
60
# Este bucle va recorriendo todos los directorios #-------------------------------------------------------------------------for fuentes in 10 20 30 40 50 do for codec in G729A G729AB do dir_act=$dir$fuentes$codec # Voy cambiando de directorio si este existe if [ -d $dir_act ] then cd $dir_act; echo "Directorio actual $dir_act" else echo "no existe el directorio \"$dir_act\"." fi # Borro archivos antiguos que pueden existir de una ejecucion anterior del script media=N"$fuentes"_alfa"$alfa"_codec"$codec".media [ ! -f $media ] || (rm $media; echo "Borré el antiguo archivo \"$media\" .") # Voy recorriendo los archivos del directorio actual for bufer in 1 10 20 30 40 50 60 70 do # Creo el nombre del archivo if test $fuentes -eq 50 then alfa=0.60 fi fichero=N"$fuentes"_alfa"$alfa"_bufer"$bufer"_codec"$codec".plot # Creamos un fichero con la probabilidad media de perdidas y dibujamos el intervalo de confianza de 90 % [ ! -f $fichero ] || ( awk -f ../mediavar.awk $fichero | awk '{printf($3" 0.1 -intervalo %e %e",$8,$11)}' | awk -f ../tstudent.awk | awk -v x=$bufer -f ../error.awk >> $media ) done # Vuelvo al directorio original cd .. done
done __________________________________________________________________________
El fichero parametros.c es usado por simulación.sh para diferentes cálculos. parametros.c __________________________________________________________________________ /**********************************************************************/ /* fichero: parametros.c */ /* Descripcion: Calcula el tamano max. y min. del buffer en funcion */ /* del codec usado,del numero de fuentes y de la alfa.*/ /**********************************************************************/ /*********************** Invocacion ***********************************/ /*
calcula
*/
/**********************************************************************/ #include #include #include #include
int bufer_max(int N,float T,float alfa,float D); int bufer_min(int N,float alfa); int reg_salida(int reg_codec,int N, float alfa);
61
int main(int argc, char *argv[]){ int Rb; /* regimen del codec en estado activo */ float T; /* tiempo de trama del codec */ int cabecera = 8+12+20+7; /* rtp+udp+ip+ppp en bytes*/ int paquete_size; /*tamano del paquete final en bits*/ long aux; int bufer; /* valores de interes para el bufer */ long bufer_bits; int N; int sizeACT; float alfa; float D = 0.05; /* Retraso max. permido a un paquete en el buffer */ if (argc == 4){ N=atoi(argv[1]); /* numero de fuentes multiplexadas */ alfa = (double)atof(argv[3]); /* que tipo de codec se esta usando */ if((strcmp(argv[2],"G729A")==0)||(strcmp(argv[2],"G729AB")==0)){ Rb=8000; sizeACT=10; T=0.01; } else if (strcmp(argv[2],"AMR475")==0){ Rb=4750; T=0.02; sizeACT=12; /* Puede calcularse como ceil(Rb*T/8) */ } else if(strcmp(argv[2],"AMR122")==0){ Rb=12200; T=0.02; sizeACT=31; } else{ printf ("Codec desconocido\n"); exit(1); } /*Calculo el tamaño del paquete ACT */ paquete_size=(sizeACT+cabecera)*8; aux=bufer_max(N,T,alfa,D); bufer_bits =(long)aux*paquete_size; printf("%d\t%ld\n",1,paquete_size); for (bufer=10;bufer<80;bufer+=10){ printf("%d\t%ld\n",bufer,(long)bufer*paquete_size); } } else printf("Invocacion incorrecta: calcula "); return 0; } int bufer_max(int N,float T,float alfa,float D){ float m; m=D*alfa*N/T; m = floor(m); return m; } int reg_salida(int reg_codec,int N, float alfa){ /* Para conseguir precision */
62
alfa = alfa*100; alfa=roundf(alfa); return alfa*N*reg_codec/100
;
} int bufer_min(int N,float alfa){ float m= (alfa*N)-1; return ceil(m);
} __________________________________________________________________________
El programa entorno.awk se usa para crear el archivo de entorno de la simulación con los parámetros adecuados. entorno.awk _____________________________________________________________________________ # cambia el fichero de entorno del opnet de donde lee los parametros BEGIN{ printf "\"Office network.router.ppp_tx_05_0.channel [0].bit capacity\" : \"%d\"\n",valor >> fichero; printf "\"Office network.router <-> destino.data rate\" : \"%d\"\n",capacidad >> fichero; }
estadisticas.awk
sirve para filtrar los ficheros de estadísticas que obtenemos de OPNET.
estadisticas.awk __________________________________________________________________________ BEGIN{ desbordamiento=0; paquetes=0; } { # Esta linea indica el comienzo de los datos estadisticos : 0 seg. 0 estad. (para el tiempo 0 el estadistico siempre vale cero). if (($1==0) && ($2==0)){ inicio =1; } } { if($1 ~ /Statistic/) { estadistica = $3; if(estadistica ~ /overflows/) desbordamiento=1; if(estadistica ~ /busy/) paquetes=1; } } {
63
if ($1 ~ /Number/){ valor=$4; if(desbordamiento==1){ # Al numero total de valores hay que quitarle los tomados en 0.0 seg. y fin_simulation ya que valen siempre 0. desbord_total = valor -2; # printf "desbordamientos=%d\n",desbord_total; desbordamiento =0; } } } { # Se ha llegado a los datos y estos son de el estadistico paquetes if ((paquetes==1) && (inicio==1)){ # Si no se ha llegado al final de los datos if($0 !~ /Vector end/) suma +=$2; } } # Para calcula el numero de paquetes real hay que restar los que no sean de voz, que siempre son 2 del protocolo RIP. END{ paquetes_no_voz=2; # printf "paquetes=%d\n",suma-paquetes_no_voz; printf "%d\t%e\n",bufer,desbord_total/(suma+desbord_total-paquetes_no_voz); }
__________________________________________________________________________
Programas del estudio de dimensionamiento simulacion.sh __________________________________________________________________________
#! /bin/bash #-------------------------------------------------------------------------------# DESCRIPCION #-------------------------------------------------------------------------------# # Script para invocar las simulaciones de opnet con los parametros alfa,capacidad del enlace de salida del router # y tamano del bufer adecuados. # # Autor : Juan I. Jimenez Anguiano # Fecha : 05/02/08 # #-------------------------------------------------------------------------------#--------------------------------- INVOCACION ----------------------------------# # sh simulacion.sh # #--------------------------------------------------------------------------------# Los parametros que recibe el script a traves de la linea de comandos son el numero de fuentes y el tipo de codec. # # Tambien se definen algunas constantes que se usaran a lo largo del script. #--------------------------------------------------------------------------------fuentes=$1; codec=$2;
64
#--------------------------------------------------------------------------------# En primer lugar creamos un entorno de trabajo a partir del directorio $HOME/dimensionamiento. # # Despues se crea el fichero de entorno que debe recibir el comando op_runsim como parametro.Algunos valores de éste # # iran variando en las distintas simulaciones. En concreto, la capacidad del enlace de salida y el tamano del bufer. # # Se creará un directorio para organizar los ficheros de cada simulacion. Si el directorio ya existia de una # # ejecucion anterior de este programa,será borrado. # #------------------------------------------------------------------------------ # if [ ! -d $HOME/dimensionamiento ] then mkdir $HOME/dimensionamiento else cd $HOME/dimensionamiento fi f_entorno=dim ; [ ! -d estadisticas_N$fuentes ] || (rm -r estadisticas_N$fuentes; echo Borré el antiguo directorio \"estadisticas_N$fuentes\" .) mkdir $HOME/dimensionamiento/estadisticas_N$fuentes; for codec in do
G729A G729AB
#--------------------------------------------------------------------------------# Se crean varios bucles for anidados para llamar a op_runsim. Para cada alfa se ejecutaran n(20) simulaciones con # # semillas distintas. Para variar las alfas en las simulaciones lo que hemos es cambiar la capacidad del enlace # # de salida del router.El tamano del bufer dependera de alfa y del numero de fuentes de la simulacion. # #--------------------------------------------------------------------------------for alfa in 0.55 0.57 0.59 0.61 0.63 0.65 0.67 0.69 0.71 0.73 0.75 do #--------------------------------------------------------------------------------# El fichero "f_perdidas" guardará la probabilidad de perdidas de paquetes de las 20 simulaciones hechas para un mismo N y alfa. # # Se borran ficheros antiguos de entorno que pueda haber de ejecuciones anteriores del script. # # -------------------------------------------------------------------------------f_perdidas=N"$fuentes"_alfa"$alfa"_codec"$codec".pp [ ! -f $f_entorno"N"$fuentes.ef ] || (rm -f $f_entorno"N"$fuentes.ef; echo Borré el antiguo archivo \"$f_entorno"N"$fuentes.ef\" .) #--------------------------------------------------------------------------------# Se llama al programa capacidad que calcula el tamano del bufer y la capacidad del enlace de salida del router para un alfa,# # un codec concreto y un numero de fuentes. Posteriormente se crea el nuevo fichero de entorno que se modifica adecuadamente # # con el programa entorno.awk. # #--------------------------------------------------------------------------------bufer=`./capacidad $fuentes $codec $alfa | awk '{if($1=="m")print $2}'`; capacidad=`./capacidad $fuentes $codec $alfa | awk '{if($1=="Cap")print $2}'`; cp $f_entorno.ef $f_entorno"N"$fuentes.ef; echo Creé el nuevo archivo \"$f_entorno"N"$fuentes.ef\" .; awk -v bufer=$bufer -v capacidad=$capacidad -v fichero=$f_entorno"N"$fuentes.ef -f entorno.awk $f_entorno"N"$fuentes.ef;
65
#--------------------------------------------------------------------------------# Bucle que ejecuta 20 simulaciones del mismo escenario, es decir,mismo alfa,mismo codec y mismo numero de fuentes.Lo unico # # que cambia es la semilla que recibe op_runsim como parametro. # # El fichero de estadistica que se genera se guarda en el fichero "f_ov" que se tratará para poder manejarlo.Esto se hace # # en el script estadisticas.sh. #--------------------------------------------------------------------------------for seed in `seq 101 120` do f_ov=ov_N"$fuentes"_alfa"$alfa"_codec"$codec"_seed"$seed" op_runsim -mem_optimize true -net_name voz_modificado"$fuentes"fuentes$codec -noprompt -ef $f_entorno"N"$fuentes -seed $seed -ov_file $f_ov; echo Ejecutando \"sh estadisticas.sh $f_ov $f_perdidas $fuentes $codec \"... ; sh estadisticas.sh $f_ov $f_perdidas $fuentes $codec; echo Terminado sh estadisticas.sh $f_ov $f_perdidas $fuentes $codec; done done; done # Finalmente hago limpieza de algunos ficheros intermedios creados que son innecesarios #rm *.ot #rm $HOME/*.ov
__________________________________________________________________________ estadisticas.sh
__________________________________________________________________________ #-------------------------------DESCRIPCION--------------------------------------# # Script que maneja los ficheros de estadisticas .ov pasandolos a formanto ASCII. # Invoca a los programas que calculan la probabilidad de perdidas. # # Autor : Juan I. Jimenez Anguiano # Fecha : 05/02/08 # #--------------------------------------------------------------------------------#-------------------------------------------------------------------------------# # Estos son los argumentos que recibe el script por linea de comandos. Ademas se define el # # valor de algunas varibles que vamos a necesitar más adelante. # #--------------------------------------------------------------------------------# f_ov=$1; # nombre del fichero .ov generado por OPNET f_perdidas=$2; fuentes=$3; codec=$4; dir_project=$HOME/op_models/voz_modificado.project; # directorio donde se guardan los .ov #----------------------------------------------------------------------------# # op_cvov es una herramienta que proporciona OPNET que permite pasar las estadisticas de # # la simulacion, almacenadas en archivo .ov a un fichero .txt #
66
#---------------------------------------------------------------------------# echo Ejecutandose op_cvov -output_file_path $f_ov.txt -vector_data vector_data_format S\# -vector_patterns ...overflows ...busy -m $f_ov ... ; op_cvov -output_file_path $f_ov.txt -vector_data -vector_data_format S\# vector_patterns ...overflows ...busy -m $f_ov ; #----------------------------------------------------------------------------# # Borrará el archivo .ov que se guarda en el directorio del proyecto sólo si existe. # # Estos ficheros se borran porque ya son innecesarios, ademas ocupan mucho espacio y # # pueden acumularse. # # El programa estadisticas.awk devuelve la probabilidad de perididas a partir del # # fichero de estadisticas que obtuvimos. # #-------------------------------------------------------------------------------# [ ! -f $dir_project/$f_ov.ov ] || (rm -f $dir_project/$f_ov.ov; echo Borré el antiguo archivo \"$dir_project/$f_ov.ov\" .) awk -f estadisticas.awk $f_ov.txt >> estadisticas_N$fuentes/$f_perdidas ; rm $f_ov.txt;
__________________________________________________________________________ grafica.sh
__________________________________________________________________________ #-------------------------------DESCRIPCION -------------------------------# # Calcula el la probabilidad media de perdidas para cada valor del bufer # en funcion de todos los puntos obtenidos con las distintas simulaciones. # Posteriormente pinta las graficas usando gnuplot. # # Autor : Juan I. Jimenez # Fecha : 05/02/08 # #-------------------------------------------------------------------------#--------------------------INVOCACION ----------------------# # sh grafica.sh #--------------------------------------------------------------------------#-------------------------------------------------------------------------# Argumentos que se pasan al script por linea de comandos # para recorrer los directorios que contienen los ficheros con los puntos # Tambien creamos una variable con el nombre base de los directorios #------------------------------------------------------------------------#--------------------------------------------------------------------# Directorio desde donde debemos empezar #-------------------------------------------------------------------cd $HOME/dimensionamiento dir=estadisticas_N; #--------------------------------------------------------------------# Este bucle va recorriendo todos los directorios #----------------------------------------------------------------------
for fuentes in 10 20 30 40
67
do dir_act=$dir$fuentes # Voy cambiando de directorio si este existe if [ -d $dir_act ] then cd $dir_act; echo "Directorio actual: \"$dir_act\" ." else echo "no existe el directorio \"$dir_act\"." fi for codec in G729A G729AB do # Borro archivos antiguos que pueden existir de una ejecucion anterior del script media=N"$fuentes"_codec"$codec".media [ ! -f $media ] || (rm $media; echo "Borré el antiguo archivo \"$media\" .") # Voy recorriendo los archivos del directorio actual for alfa in 0.55 0.57 0.59 0.61 0.63 0.65 0.67 0.69 0.71 0.73 0.75 do # Creamos el nombre del archivo fichero=N"$fuentes"_alfa"$alfa"_codec"$codec".pp # preparamos el fichero para que pueda ser procesado por mediavar.awk . awk -v alfa=$alfa '{printf "%.2f\t%e\n",alfa,$1}' $fichero > out; # Creamos un fichero con la probabilidad media de perdidas y dibujamos el intervalo de confianza de 95 % [ ! -f out ] || ( awk -f ../mediavar.awk out | awk '{printf($3" 0.05 -intervalo %e %e",$8,$11)}' | awk -f ../tstudent.awk | awk -v x=$alfa -f ../error.awk >> $media) done # Vuelvo al directorio original done cd $HOME/dimensionamiento done
__________________________________________________________________________ capacidad
es un programa usado por simulacion.sh. capacidad.c
__________________________________________________________________________ /**********************************************************************/ /* fichero: capacidad.c */ /* Descripcion: Calcula la capacidad del enlace de salida en funcion */ /* del codec usado,del numero de fuentes y de la alfa. */ /* Tambien calcula el tamano de buffer necesario para */ /* que existe un retraso max. determinado en funcion de */ /* el numero de fuentes y de alfa. */ /**********************************************************************/ /*********************** Invocacion ***********************************/ /*
calcula
*/
/**********************************************************************/ #include #include #include #include
int bufer_max(int N,float T,float alfa,float D); int bufer_min(int N,float alfa);
68
int reg_salida(int paquete, float T,int N, float alfa); int main(int argc, char *argv[]){ int Rb; float T; int cabecera = 8+12+20+7; int paquete_size; long aux; long bufer_bits; int N; int sizeACT; float alfa; float D = 0.05; buffer */ if (argc == 4){
/* /* /* /* /*
regimen del codec en estado activo */ tiempo de trama del codec */ rtp+udp+ip+ppp en bytes */ tamano del paquete final en bits */ variable auxiliar para guardar resultados */
/* numero de fuentes */ /* Retraso max. permido a un paquete en el
N=atoi(argv[1]); /* numero de fuentes multiplexadas */ alfa = (double)atof(argv[3]); /* que tipo de codec se esta usando */ if(strcmp(argv[2],"G729A")==0 || strcmp(argv[2],"G729AB")==0){ Rb=8000; sizeACT=10; T=0.01; } else if (strcmp(argv[2],"AMR475")==0){ Rb=4750; T=0.02; sizeACT=12; /* Puede calcularse como ceil(Rb*T/8) */ } else if(strcmp(argv[2],"AMR122")==0){ Rb=12200; T=0.02; sizeACT=31; } else{ printf ("Codec desconocido"); exit(1); } /*Calculo el tamaño del paquete ACT */ paquete_size=(sizeACT+cabecera)*8; aux=bufer_max(N,T,alfa,D); bufer_bits =(long)aux*paquete_size; printf("m\t%ld\n",bufer_bits); printf("Cap\t%d\n",reg_salida(paquete_size,T,N,alfa)); } else printf("Invocacion incorrecta: calcula "); return 0;
__________________________________________________________________________ estadisticas.awk
__________________________________________________________________________ #------------------------------
DESCRIPCION -----------------------------------#
69
# Lee los ficheros estadisticas generados en la simulacion y a partir de los estadisticos: # numero de desbordamientos y numero total de paquetes, calcula la probabilidad de # perdidas de un paquete en el router. # # Autor : Juan I. Jimenez Anguiano # Fecha : 05/02/08 # #-------------------------------------------------------------------------------BEGIN{ desbordamiento=0; paquetes=0; } { #-------------------------------------------------------------------------------# Esta linea indica el comienzo de los datos estadisticos : 0 seg. 0 estadistico # (para el tiempo 0 el estadistico siempre vale cero). #------------------------------------------------------------------------------------if (($1==0) && ($2==0)){ inicio =1; } } { if($1 ~ /Statistic/) { estadistica = $3; if(estadistica ~ /overflows/) desbordamiento=1; if(estadistica ~ /busy/) paquetes=1; } } { if ($1 ~ /Number/){ valor=$4; if(desbordamiento==1){ #---------------------------------------------------------------------------------# Al numero total de valores hay que quitarle los tomados en 0.0 seg. y fin_simulation ya que valen siempre 0. #-----------------------------------------------------------------------------------desbord_total = valor -2; desbordamiento =0; } } } { #--------------------------------------------------------------------------# Se ha llegado a los datos y estos son de el estadistico paquetes #-------------------------------------------------------------------------if ((paquetes==1) && (inicio==1)){ # Si no se ha llegado al final de los datos if($0 !~ /Vector end/) suma +=$2; } } #-------------------------------------------------------------------------------------
70
# Para calcula el numero de paquetes real hay que restar los que no sean de voz, que siempre son 2 del protocolo RIP. #------------------------------------------------------------------------------------END{ paquetes_no_voz=2; printf "%s\t%e\n",codec,desbord_total/(suma-paquetes_no_voz+desbord_total);
}
__________________________________________________________________________ entorno.awk
__________________________________________________________________________ # cambia el fichero de entorno del opnet de donde lee los parametros BEGIN{ printf "\"Office network.router.ppp_tx_05_0.channel [0].bit capacity\" : \"%d\"\n",bufer >> fichero; printf "\"Office network.router <-> destino.data rate\" : \"%d\"\n",capacidad >> fichero; }
__________________________________________________________________________
Programas comunes a multiplexión y dimensionamiento mediavar.awk
__________________________________________________________________________ BEGIN { # # Simple awk script to compute mean and variance # of a value list # Input file: lines with pairs