Introducción A La Simulación de Eventos Discretos
Introducción A La Simulación de Eventos Discretos
Introducción A La Simulación de Eventos Discretos
INFORME TÉCNICO
Introducción a la Simulación de
Eventos Discretos
Gabriel A. Wainer
http://www.dc.uba.ar
Title: Introducción a la simulación de sistemas de
eventos discretos
E-mail : [email protected]
Report n. : 96-005
To obtain a copy of this report please fill in your name and address and return this page to:
Infoteca
Departamento de Computación - FCEN
Pabellón 1 - Planta Baja - Ciudad Universitaria
(1428) Buenos Aires - Argentina
TEL/FAX: (54)(1)783-0729
e-mail: [email protected]
Name:..................................................................................................................................................
Address:...............................................................................................................................................
............................................................................................................................................................
Introducción a la simulación de sistemas de eventos discretos
Gabriel A. Wainer
Departamento de Computación - FCEN
Universidad de Buenos Aires.
[email protected]
1. INTRODUCCION
Las ventajas de la simulación son múltiples: puede reducirse el tiempo de desarrollo del sistema, las
decisiones pueden chequearse artificialmente, un mismo modelo puede usarse muchas veces, etc. La
simulación es de empleo mas simple que ciertas técnicas analíticas y precisa menos simplificaciones. El
sistema a construir tendrá como objetivo ayudar a los investigadores a modelar tales fenómenos
complejos.
El objetivo de este trabajo es servir como introducción a algunos conceptos generales sobre
modelización y simulación utilizando determinadas metodologías. Presentaremos un conjunto de técnicas
importantes con especial utilidad en la simulación de sistemas de eventos discretos. El trabajo está basado
en los que se mencionan en la bibliografía, y tiene como intención servir como material básico de estudio
en Español. Está orientado a difundir los temas en este área de simulación, y se ha organizado en cuatro
secciones. En la introducción se analizan conceptos generales de modelos, sistemas y simulación. En la
segunda sección se atacan generalidades del formalismo DEVS (un formalismo para simulación de
eventos discretos). Una tercera sección analiza otro formalismo: los autómatas celulares. En la cuarta
sección se estudian con detalle mecanismos de simulación paralela y distribuida, con el fin de mejorar la
desempeño de las simulaciones.
Para comenzar, daremos algunas definiciones. Primero, llamaremos sistema a una entidad real o
artificial. De hecho no existe una definición de sistema que tenga aceptación general. Se llama sistema a
una parte de una realidad, restringida por un entorno. Está compuesto por entidades que experimentan
efectos espacio-tiempo y relaciones mutuas. También se dice que un sistema es un conjunto ordenado de
objetos lógicamente relacionados que atraviesan ciertas actividades, interactuando para cumplir ciertos
objetivos.
Para lo que nos concierne, distinguimos dos interpretaciones de la palabra sistema:
a) Un sistema real es una combinación de elementos con relaciones estructurales que se influencian
mutuamente.
b) Un sistema dinámico es una construcción formal que nos da conceptos generales de modelización
para distintas clases de disciplinas [Gia96].
Ejemplo 1
Para estudiar sistemas complejos, la idea es partir haciendo un modelo del sistema que se quiere
estudiar, y se estudian problemas del sistema real estudiando el modelo.
Llamaremos paradigma a un conjunto de conceptos, leyes y medios que sirven para definir un
conjunto de modelos. Los modelos se construyen sobre un paradigma particular.
Ejemplo 2
¿Porqué se hacen modelos de los sistemas? ¿Porqué usamos simulación? El motivo es que en muchos
casos no se puede experimentar directamente sobre el sistema a estudiar, o se desea evitar costos, peligro,
etc. En la actualidad existe una gran variedad de aplicaciones muy complejas en las que se usan modelos
y/o simulación, que van desde manufactura hasta diseño de circuitos para computadoras, pasando por
aplicaciones bélicas y estudio de experimentos complejos. Las características comunes a estos sistemas
son su complejidad y la falta de herramientas de evaluación de desempeño adecuadas.
Distinguiremos, entonces, dos grandes grupos de métodos para modelar sistemas complejos:
a) Analíticos: los modelos están basados en razonamiento. Suelen ser simbólicos, y permiten obtener
soluciones generales al problema. La solución se construye usando las reglas de inferencia reconocidas
como correctas en el paradigma usado para describir el modelo, y se obtienen bajo una forma general (en
el sentido que están bajo una forma simbólica). Las soluciones particulares serán obtenidas reemplazando
los valores simbólicos por sus valores numéricos. La idea es que, una vez obtenida la solución, se aplica
una variable al modelo obtenido y de esta forma se pueden encontrar soluciones particulares. Un
formalismo analítico muy difundido son las ecuaciones diferenciales.
El problema es que si consideramos sistemas complejos, con pocas excepciones serán analíticamente
intratables y numéricamente prohibitivos de evaluar. Por ende, para poder usar estos métodos para los
problemas que existen en el mundo real se debe simplificar el modelo a un nivel tal que las soluciones
obtenidas pueden alejarse de la realidad. Frente a esta situación, la simulación ofrece otra aproximación
de resolución de problemas que permite tratar cierta complejidad.
B) Basados en simulación: en ellos no existen soluciones generales sino que buscan soluciones
particulares para el problema. Si el problema es simple, es conveniente el uso de métodos analíticos ya
que nos permiten obtener soluciones generales con seguridad. En cambio, si es complejo, usando
simulación se pueden probar distintas condiciones de entrada que no serían posibles de probar y obtener
resultados de salida significativos. Así se obtienen datos que pueden estudiarse para analizar algún
comportamiento que interese.
Definición:
a) Planteo del problema: en esta fase se toma un sistema real y se trata de entenderlo. Para ello,
primero se trata de identificar el problema a resolver y se describe su operación en términos de objetos y
actividades dentro de un marco físico. Luego, se trata de identificar las variables de entrada y salida del
sistema y se las categoriza. Las variables de entrada pueden ser de decisión (controlables) o parámetros
(no controlables). En esta etapa también se trata de definir medidas de desempeño del sistema (como
función de variables de salida) y una función objetivo (una combinación de algunas de las medidas).
Habiendo finalizado esta especificación, se trata de construir una estructura preliminar del modelo,
interrelacionando las variables del sistema y las medidas de desempeño, introduciendo presunciones y
simplificaciones adecuadas. Finalmente se construye una estructura del modelo más detallada,
identificando todos los objetivos con sus atributos e interfaces.
b) Recolección y análisis de los datos de entrada: en esta fase se estudia el sistema real para obtener
datos de entrada vía observación. Por ende, se hace observación directa y recolección de los atributos
seleccionados en la etapa anterior. Al estudiar el flujo de las entidades a través del sistema, se trata de
identificarlas con valores de tiempo. Otra cuestión importante en esta fase es seleccionar un tamaño de
muestra estadísticamente válido, y un formato de datos procesable por computadora. Finalmente se decide
qué datos serán tratados como aleatorios y cuáles se asumirán como determinísticos.
c) Modelización: en esta fase se construye un modelo del sistema con los aspectos que se quieren
simular. Para ello hay dos fases.
En una primera etapa se trata de comprender el sistema, ya sea siguiendo una aproximación de flujo
físico basado en el flujo de entidades a través del sistema con sus puntos de procesamiento y reglas de
decisión, o una aproximación de eventos (o cambio de estados), basado en la definición de variables de
estado internas seguida por una descripción de la operación del sistema cuando ocurre un evento. En una
segunda etapa se construye el modelo. Para ello se definen objetos, atributos, métodos, en el paradigma
elegido. También en esta fase se elige un lenguaje de implementación.
d) Implementación: en esta etapa, en base al lenguaje elegido se construye una simulación del modelo
que pueda ejecutarse en una computadora.
e) Verificación y validación del modelo: durante los pasos anteriores se construyeron tres modelos: el
conceptual (especificación), el lógico (diseño) y el de computadora (código). La verificación es un asunto
de consistencia interna entre los tres modelos. La validación enfoca la correspondencia entre el modelo y
la realidad. En base a los resultados obtenidos durante la validación y verificación, el modelo y su
implementación deben refinarse.
f) Experimento de simulación y optimización: en esta fase se hace evaluación estadística de las salidas
del simulador para determinar algún nivel de precisión de las medidas de desempeño. Si el objeto en
interés pasa por un comportamiento de período transiente se debe tener cuidado de hacer el análisis sobre
estados estacionarios. Se hace diseño de experimentos de simulación basados en la repetición de la
simulación con las variables de decisión en varios niveles.
g) Análisis de datos de salida: en la última fase se analizan las salidas de la simulación para
comprender el comportamiento deseado del sistema. Estas salidas se usan para obtener respuesta al
comportamiento del sistema original.
. de exploración: se usa simulación para adquirir una mejor comprensión de las operaciones del
sistema real;
. de predicción: se usa un modelo para predecir el concepto futuro del sistema real;
. de mejoras: se utiliza para optimizar el desempeño del sistema real, y estudiar distintas alternativas
(por ejemplo, un sistema de producción, de stocks, etc.);
. de concepción: el sistema no existe, y se usa simulación para chequear distintas soluciones posibles
(por ejemplo, porque no se puede hacer un prototipo).
En cualquier caso, nos interesa tener modelos ejecutables de sistemas, o sea, descripciones
inteligibles sobre las que se pueden ejecutar algoritmos en tiempo finito. Para poder construir un modelo
simulable, el sistema en consideración deber obedecer a dos principios fundamentales:
. Causalidad: el futuro no puede influenciar sobre el pasado. El estado del sistema al instante presente
t es independiente de todo lo que se pueda producir en horas futuras a t.
. Determinismo: el futuro del sistema puede estar determinado a partir de su estado presente y su
pasado. En todo instante t existe un valor positivo e tal que el comportamiento del sistema puede
calcularse hasta t+e.
Una de las primeras aplicaciones de simulación con computadoras fue en el proyecto Manhattan,
donde se estudió la difusión aleatoria de neutrones para el desarrollo de la bomba atómica, usando
métodos de Montecarlo. El impacto de la tecnología de computadoras ha tenido gran influencia en el
desarrollo de técnicas de simulación, y en la actualidad existe hardware, interfaces con el usuario y
herramientas de programación que influenciaron los métodos teóricos existentes.
. Con respecto a la base de tiempo, hay paradigmas a tiempo continuo, donde se supone que el
tiempo evoluciona de forma continua (es un numero real), y a tiempo discreto, donde el tiempo avanza
por saltos de un valor entero a otro (el tiempo es un entero).
. Con respecto a los conjuntos de valores de las variables descriptivas del modelo, hay paradigmas de
estados o eventos discretos (las variables toman sus valores en un conjunto discreto), continuos (las
variables son números reales), y mixtos (ambas posibilidades) [Gia96].
Ejemplo 3
Con respecto a la caracterización del problema a modelar, los modelos pueden ser prescriptivos si
formulan y optimizan el problema (en general son métodos analíticos) o descriptivos si describen el
comportamiento del sistemas (suelen ser métodos numéricos).
Por otro lado, un modelo se dice que es determinístico si todas las variables tienen certeza completa y
están determinadas por sus estados iniciales y entradas. El modelo se dice probabilístico en el caso que
una respuesta pueda tomar un rango de valores dado el estado inicial y sus entradas (si usa variables
aleatorias se dice que el modelo es estocástico). En un modelo probabilístico, los cambios de estado del
modelo se producen por medio de leyes aleatorias: las entradas al modelo son aleatorias (siendo el modelo
determinista), ó el tiempo de llegada de los eventos es aleatorio [Zei96b].
De acuerdo al entorno, los modelos son autónomos (no existen entradas) o no autónomos (existen
entradas). Los autónomos evolucionan en base a la función de tiempo.
Los sistemas donde las variables son discretas a tiempo continuo reciben el nombre de Sistemas
Dinámicos de Eventos Discretos (DEDS - Discrete Events Dynamic Systems) en oposición a los Sistemas
Dinámicos de Variables Continuas (CVDS - Continuous Variable Dynamic Systems) que se describen por
ecuaciones diferenciales. Un paradigma de simulación para DEDS asume que el sistema simulado sólo
cambia de estados en puntos discretos en tiempo simulado, o sea que el modelo cambia de estado ante
ocurrencia de un evento.
Ejemplo 4
Un caso típico de un DEDS es una red de computadoras. Se pueden incluir variables de estado para
indicar la longitud de las colas de mensajes, estado de los enlaces de comunicaciones (ocupado o libre),
etc. Los eventos típicos pueden incluir la llegada de un mensaje en algún nodo en la red, transmisión de
un mensaje a otro nodo, fallas de componentes, etc.
Existe variedad de paradigmas que pueden utilizarse para especificar formalmente sistemas dinámicos
y tienen existencia conceptual independiente de los lenguajes de simulación que pueden usarse para
implementar las simulaciones. No puede decirse que ninguno de los formalismos existente sea mejor que
otro para representar la variedad de comportamiento de los sistemas reales, ya que dependiendo de
diversos factores, algunos son mas naturales y producen simulaciones mas eficientes. Incluso existen
paradigmas genéricos, pero no hay consenso para decidir qué modelo tiene el mayor potencial. Entre los
formalismos desarrollados hasta ahora, mencionamos los siguientes:
. Cadenas de Markov/modelos de autómatas (en este grupo también incluimos Redes de Petri y
máquinas de estado extendidas).
. Modelos de olas
. Modelos algebraicos min-max.
. Modelos basados en computadoras (ej.: CSP)
. Modelos de procesos semi-markovianos generalizados (GSMP - dentro de esta categoría incluimos
todos los esfuerzos relacionados en lenguajes de simulación de eventos discretos).
Existe una variedad de motivos para la existencia de formalismos de modelado para DEDS:
iv) La necesidad de análisis jerárquico: las operaciones hechas por el hombre operan en planes
jerárquicos. (Ejemplos: una fábrica tiene planes anuales, trimestrales, mensuales, semanales y diarios; los
comandos militares se dividen en niveles de teatro/armada/batallón/pelotón). Luego, los detalles
necesarios para modelar y controlar deben ser distintos para cada nivel
vi) Límite computacional: en máquinas de estados finitas o cadenas de Markov sin estructura adicio-
nal el número de estados físicos discretos del DEDS modelado explota de forma combinatoria, lo que
conduce a requerimientos de cálculo no factibles. Por ende, el paradigma debe estar orientado a
desempeño, distinguiendo entre modelos conceptuales y computacionales. El requerimiento de cómputo
de un modelo tampoco debe crecer exponencialmente con su tamaño [Ho79].
Para resolver un problema hay que hacer el pasaje de la especificación dinámica a una especificación
simulable, y luego interpretar los resultados de la simulación en el sistema dinámico (hacer el pasaje
inverso). El pasaje del sistema dinámico a las especificaciones simulables impondrá algunas restricciones
sobre los conjuntos de sistemas dinámicos.
Como vemos, debemos considerar tres objetos básicos que entran en juego:
a. El sistema real en existencia, que se ve como una fuente de datos. El sistema real es la parte del
mundo real en la que uno se interesa y genera datos de comportamiento. El sistema tiene algunas
variables observables y otras no. Al crear el modelo, deben construirse relaciones de entrada/salida de
forma tal que hacer una variación de entrada, se pueda observar una variación de salida simular a la que
ocurre en el sistema real. Si los elementos de entrada son discretos/continuos, el modelo también debe
serlo.
Figura 5 - Variables en un sistema real
c. El simulador, que ejecuta las instrucciones del modelo para generar su comportamiento.
. La relación de modelado, que relaciona al sistema real y al modelo, y define cómo el modelo
representa al sistema o la entidad modelada. En términos generales, un modelo puede considerarse válido
si los datos generados coinciden con los producidos por el sistema real en un marco experimental de
interés (validez del modelo conceptual).
Al hacer un modelo de un sistema real debemos, además, poner en consideración otros elementos:
a) Marco experimental: es un conjunto restringido de las circunstancias sobre las cuales se observa el
sistema (el modelo se restringe a este marco). El marco debe estar determinado por el modelador, y define
las condiciones de utilización del modelo. Refleja los objetivos del modelador que impactan en la
construcción, experimentación y validación del modelo.
La teoría matemática de sistemas provee un marco para representar y estudiar sistemas dinámicos,
distinguiendo entre la estructura (constitución interna) de un sistema y su comportamiento (su
manifestación exterior).
Si el modelo representa la estructura del sistema modelado, se lo llama modelo estructural o caja
blanca. En este caso, se explicitan los componentes del sistema real (que pueden ser modelos
comportamentales simples). Aquí entran en juego conceptos de descomposición (como dividir un sistema
en componentes) y acoplamiento (como combinar los componentes para reconstituirlo). Una tercera
relación fundamental es la taxonomía que concierne las variantes admisibles de un componentes y sus
especializaciones.
Ejemplo 5
Como ya fue explicado, en la gran mayoría de los casos, los modelos y su implementación sufren
simplificaciones por la complejidad del sistema a modelar. Esta complejidad puede ser de dos tipos:
. Cualitativa: depende de la semántica del paradigma. Toma en cuenta la naturaleza variable de los
constituyentes del sistema.
. Cuantitativa: depende del número de constituyentes del modelo. Está ligado al sistema modelado y
no al paradigma usado.
Si se desea reducir la complejidad, debe reducirse alguna de ambas, ya sea la del paradigma, o la
cantidad de constituyentes en la formulación del modelo.
Ejemplo 6
Volvamos al caso de un modelo de circuitos lógicos. La complejidad cualitativa es baja, ya que existe
un número pequeño y simple de componentes: {0,1}, {AND, OR, NOT}. Mientras tanto, la complejidad
cuantitativa depende del circuito a modelar (podrían ser miles de circuitos para un sistema dado).
Supongamos ahora que tengo un circuito de N compuertas lógicas. Si se cambia el paradigma de
modelado, y en vez de variables booleaneas se utiliza "transformación de registros", reduzco la
complejidad cuantitativa. En este caso, se manipulan enteros, operaciones +, -, *, etc. También aumenta
la complejidad cualitativa (en el caso de un registro, se modelan cientos de puertas con un solo operador
por medio de un paradigma más complejo). Otra forma de reducir la complejidad cuantitativa sería por
medio de descripción jerárquica, usando elementos de base, que se unen formando modelos de mayor
nivel.
2. FORMALISMO DEVS
Muchas de las aproximaciones existentes para modelar sistemas de eventos discretos tratan de
describir el fenómeno combinando diversas técnicas, haciendo muy difícil el desarrollo de las
simulaciones. Para evitar estos problemas, Zeigler [Zei76] propuso un mecanismo de simulación
jerárquica, conocido como DEVS (Discrete EVents dynamic Systems). Esta aproximación propone una
teoría de modelado de sistemas a tiempo continuo usando modelado de eventos discretos. Permite
descripción modular de los fenómenos a modelar (aproximación modular) y ataca la complejidad usando
una aproximación jerárquica.
La aproximación provee una forma de especificar un objeto matemático llamado sistema. Este se
describe como un conjunto consistente de una base de tiempo, entradas, salidas y funciones para calcular
los siguientes estados y salidas. Esta aproximación se integró posteriormente con nociones de pro-
gramación orientada a objetos [Zei84, Zei90, Zei95]. Soporta la construcción de modelos de forma jerár-
quica y modular. Además de un medio para construir modelos simulables, provee una representación
formal para manipular matemáticamente sistemas de eventos discretos.
DEVS es un formalismo universal para modelar y simular DEDS. Puede verse como una forma de es-
pecificar sistemas cuyas entradas, estados y salidas son constantes de a trozos, y cuyas transiciones se
identifican como eventos discretos. El formalismo define cómo generar nuevos valores para las variables
y los momentos en los que estos valores deben cambiar. Los intervalos de tiempo entre ocurrencias son
variables, lo que trae algunas ventajas: en los formalismos con una única granularidad es difícil describir
los modelos donde hay muchos procesos operando en distintas escalas de tiempo, y la simulación no es
eficiente ya que los estados deben actualizarse en el momento con menor incremento de tiempo, lo cual
desperdicia tiempo cuando se aplica a los procesos mas lentos.
Un modelo DEVS se construye en base a un conjunto de modelos básicos (atómicos), que se combinan
para formar modelos acoplados. Los modelos atómicos son objetos independientes modulares, con
variables de estado y parámetros, funciones de transición internas, externas, de salida y avance de tiempo.
Existen dos variables de estado estándar: fase y . Si no hay eventos externos, el modelo se queda en la
fase durante . es el tiempo restante hasta la próxima transición interna. Si hay eventos externos, la
transición externa hace que el modelo cambie de fase y , preparándolo para la próxima transición
interna. El estado en el que se entra luego de un evento externo depende de la entrada, el estado actual, y
el tiempo transcurrido en este estado, permitiendo representar el comportamiento de sistemas de tiempo
continuo con eventos discretos. Un modelo acoplado especifica cómo se conectan las entradas y salidas de
los componentes. Los nuevos modelos también son modelos modulares, y pueden usarse para armar
modelos de mayor nivel.
El principio de la simulación dirigida por eventos consiste en generar un planificador. Este contiene
en cada instante la lista cronológica ordenada de los eventos a tratar en el futuro. Contiene los eventos po-
tenciales y representa un futuro posible del modelo. En este caso se especifican modelos básicos a partir
de los cuales se construyen otros mas complejos, y cómo acoplar estos modelos de forma jerárquica. La
lista de eventos no es única, sino que está restringida a cada submodelo. El modelado jerárquico permite
la creación de una Base de Datos de modelos, permitiendo la reutilización de los modelos creados y
chequeados. En esta forma mejora la seguridad de la simulación, reduciendo el tiempo de chequeo de las
nuevas simulaciones, y mejorando la productividad.
Un modelo atómico DEVS transita entre los estados (S) vía sus funciones de transición. Cuando no
hay eventos externos, la hora de una función de transición interna está determinada por la función de
pasaje de tiempo (ta) aplicada al estado actual. El nuevo estado del modelo se determina aplicando la
función de transición interna ( int) al estado antiguo. Antes de cada transición interna, el modelo puede
generar un evento de salida que depende del estado previo a la transición. También puede haber una
transición de estado cuando hay un evento de entrada externa. La función de transición externa determina
el nuevo estado basándose en el estado actual, el tiempo transcurrido en ese estado, y la entrada.
Ejemplo 7
En la figura 7 vemos la secuencia de eventos en un sistema modelado con DEVS: s2= int(s1);
s3= int(s2), etc. Estas son las transiciones internas, que ocurren cuando no hay eventos externos. Por
ejemplo, ta(s2) determina la hora de la próxima transición interna en base al estado s2. Esta hora del
próximo evento se calcula en base al evento actual. Aquí y1= (s1), ..., son los eventos de salida
generados. Estos se ejecutan antes de las transiciones internas. Cuando se recibe el evento de entrada
externa x1, la transición externa resultante depende del estado actual, s4, el tiempo transcurrido, e4, y el
evento de entrada, x1, para determinar un nuevo estado, s5 = ext(s4, e4, x1).
Para especificar modelos DEVS es conveniente ver al modelo como con ports de entrada/salida que
interactúan con el entorno. Cuando se reciben en los ports de entrada los eventos externos, la descripción
del modelo debe determinar cómo responder. Por ende, un modelo atómico posee ports de entrada y salida
por los cuales transita toda interacción con su entorno, lo cual facilita el encapsulamiento. Este concepto
de interfaz con el entorno permitirá una construcción modular de modelos más complejos, facilitará la
validación subconjunto por subconjunto y la reutilización de las descripciones ya efectuadas
(encapsulamiento). Luego, la descripción simulable de un modelo atómico podrá ser guardada en una
biblioteca para hacer acoplamiento con otros modelos más complejos.
Cada port de entrada precisa una especificación de una transición externa, en la forma de "cuando
reciba x en el port de entrada p...". La función de transición interna puede especificarse en una
descripción procedural con fases y sus transiciones. La función de salida usa frases de la forma "enviar y
al port de salida p".
Ejemplo 8
Consideremos un modelo de buffering simple (fig. 8). Hay tres ports de entrada: entrada, para recibir
datos de entrada, listo, para recibir reconocimiento del nivel inferior, y parar para control de flujo del
proceso de nivel superior. El port salida envía ítems hacia abajo. Se usan las variables e (tiempo
transcurrido en la fase actual), y (tiempo restante en la fase actual), esenciales para lograr modularidad
en modelos de eventos discretos (se asume que estas variables las maneja el simulador abstracto).
_______________________________________________
Transición externa
si fase = ENVIANDO
enviar primero(Cola) al port salida
La especificación de transiciones externas tiene tres "cuando", uno para cada port. La primera dice
que cuando se recibe un valor en el port entrada, se inserta en la cola. Si es el único, el control debe pasar
a la fase ENVIANDO (o sea, que debe transmitirse inmediatamente); sino el modelo debe continuar. La
transición interna tiene una sola fase, ENVIANDO, en la cual el modelo espera un tiempo,
tiempo_de_preparación, que provoca que se planifique la ocurrencia de una transición interna en el
instante = hora actual + tiempo_de_preparación. Esto sirve para modelar el tiempo entre que llega el
mensaje y se puede retransmitirlo. Al ocurrir dicho evento, se ejecuta la función de transición interna.
Previamente se ejecuta la función de salida, que envía el primer valor en su cola al port salida, la función
de transición interna lo saca de la cola, y se pone en estado pasivo. La fase pasivar (en la cual el modelo
se pone PASIVA) representa una fase del modelo en la cual espera por eventos externos mientras hace
actividad propia. Con esta finalidad, , el instante del próximo evento interno, se pone en infinito (inf).
La frase "continuar" indica que el tiempo restante en la fase en la cual se encuentra el modelo no debe
cambiar como resultado del procesamiento del evento externo. Para expresar una interrupción que necesi-
ta un cambio en la planificación, reemplazamos la instrucción continuar por las que manipulan , como
lo muestra la especificación del port de entrada parar. Este evento externo, si indica parada, provoca que
el modelo abandone la fase ENVIANDO y aborte la transmisión actual; si indica comienzo, la transmi-
sión se reinicia.
Ejemplo 9
MODELO-ATOMICO: P
variables de estado: sigma=inf; fase=pasiva; id-trab;
parámetros: tpo_procesamiento = 5;
__________________________________________
Transición externa
según port
entrada: según fase
pasiva: almacenar id_trab
mantener ocupado tpo_procesamiento
Figura 9. Un modelo atómico de ocupado: continuar
desempeño de un procesador. otro: error
__________________________________________
Transición interna
según
ocupado: pasivar
pasiva: /* nunca ocurre */
__________________________________________
Salida
enviar id_trab al port salida
El manejo de trabajos que llegan se modelan con la función de transición externa. Cuando el proce-
sador está libre, cambia la fase y se pone en pasiva. Cuando llega un trabajo por el port entrada, se
guarda su id_trab y se simula que el procesador trabaja (mantener ocupado tpo_procesamiento, que pone
fase en ocupado, y sigma en tpo_procesamiento). Si llega otro trabajo, lo ignora (continuar, que actualiza
sigma para reflejar el pasaje de tiempo). Cuando el procesador terminó de procesar, pone la identidad del
trabajo en el port salida, y vuelve a la fase pasiva. Lo primero que se ejecuta es la función de salida.
Después de la función de salida se llama a la función de pasaje de estado, que contiene la frase "pasivar",
que pone el modelo en libre (fase=pasiva, sigma=inf). P tiene dos variables de estado: id_trab y
tpo_procesamiento. Tpo_procesamiento está fija: es un parámetro del modelo. Este procesador se puede
combinar con otros componentes para crear modelos de arquitecturas para analizar su desempeño. El
modelo básico se puede refinar para representar aspectos mas complejos de la operación.
Es importante notar que no hay forma de generar una salida directamente desde un evento de entrada
externa. Una salida solo puede ocurrir antes de una transición interna. Para que un evento externo
provoque una salida sin demora, hay que "planificar" un estado interno con duración cero. Sigma guarda
el tiempo restante hasta el próximo evento interno (el valor de avance de tiempo a ser producido por la
función de avance de tiempo).
Los modelos basicos pueden ser acoplados en el formalismo DEVS para formar un modelo
multicomponente o acoplados, definido por la estructura:
Un modelo acoplado dice como acoplar (conectar) varios modelos componentes para formar un nuevo
modelo. Este modelo puede ser empleado como componente, permitiendo construcción jerárquica. Un
modelo acoplado contiene la siguiente información:
. Conjunto de componentes
. Para cada componente, sus influencias
. El conjunto de ports de entrada a través de los cuales se reciben eventos externos
. El conjunto de ports de salida a través de los cuales se envían eventos externos
. La especificación de acoplamiento, consistente de
- El acoplamiento de entrada externa que conecta los ports de entrada del modelo acoplado a uno o
mas de los ports de los componentes (dirige las entradas recibidas por el modelo acoplado a los modelos
componentes designados);
- El acoplamiento de salida externa que conecta los ports de salida de componentes a ports de salida
del modelo acoplado (cuando una salida es generada por un componente, puede ser enviada a un port de
salida designado del modelo acoplado, y transmitirse externamente);
acoplamiento interno, que conecta ports de salida de componentes a ports de entrada de otros
componentes (cuando una entrada es generada por un componente, puede ser enviada a los ports de entra-
da de componentes designados, ademas de ser enviados a un port de salida del modelo acoplado).
. La función de selección, que comprende las reglas empleadas para elegir cual de los componentes
inminentes (los que tienen menor tiempo al próximo evento) ejecutara su próximo evento.
Ejemplo 10
Hagamos una descripción jerárquica de un modelo A5 (figura 11). Aquí el modelo A1-A2 está en una
forma modular, y puede ponerse en la biblioteca para usarse en descripciones más complejas; el modelo
se transforma en un modelo de base. Para construir este modelo seguimos estos pasos: primero se hace
una descripción comportamental de los modelos atómicos A1, A3, A4, y se almacenan en biblioteca. A
continuación se hace descripción estructural del modelo acoplado A2, almacenamiento en biblioteca, A2
se transforma en un modelo de base, y finalmente la descripción estructural del modelo acoplado A5.
Todos los modelos creados se almacenan en biblioteca.
Ejemplo 11
El transductor mide dos índices: el throughput y el tiempo promedio de turnaround. Para calcular
medidas de desempeño, el transductor ubica los id_trabs que llegan en su port de entrada llegada en su
lista_de_llegados junto con sus tiempos de llegada. Cuando el id_trab aparece en el port de entrada
resuelto, TRANSD lo ubica en la lista_de_resueltos y también calcula el turnaround. TRANSD mantiene
su propio reloj local para medir tiempos de llegada y de turnaround. El formalismo DEVS no permite que
el reloj de la simulación este disponible para los componentes, por lo que los modelos deben mantener sus
relojes acumulando información de tiempo transcurrido, en sigma y e.
MODELO ACOPLADO: EF
ACOPLAMIENTO DE ENTRADA
EXTERNA:
EF.entrada -> TRANSD.Resuelto
ACOPLAMIENTO DE SALIDA
EXTERNA:
GENR.salida -> EF.salida
TRANSD.salida -> EF.Result
ACOPLAMIENTO INTERNO:
Figura 12 - Modelo acoplado EF
GENR.salida -> TRANSD.llegado
TRANSD.salida -> GERN.parar
ACOPLAMIENTO DE SALIDA
EXTERNA:
EF.result -> EF-P.salida
Figura 13 - Modelo acoplado EF-P.
ACOPLAMIENTO INTERNO:
P.salida -> EF.entrada
EF.salida -> P.entrada
La función select contiene reglas para romper lazos con la planificación. Ej.: en EF-P, si el generador
y el procesador tienen tiempos entre llegadas y de procesamiento iguales (o armónicos), tendrán igual
tiempo de próximo evento cuando ambos estén listos para mandar un trabajo simultáneamente. En
particular, si el generador de tpo_entre_llegadas y el tiempo de procesamiento son iguales, todos los se-
gundos trabajos se pierden si el generador ejecuta su próximo evento primero: la salida del generador
encuentra un procesador ocupado, y se ignora. Para evitarlo, la función select puede definirse de tal forma
que el procesador se elija como componente inminente cuando existe el lazo.
2.3. Simulador abstracto
La principal característica de modularidad de los modelos DEVS está garantizada por el hecho que la
simulación es llevada a cabo por un simulador abstracto, que es genérico. En el concepto de simulador
abstracto, la simulación de los modelos atómicos y acoplados es llevada a cabo por distintos procesadores
llamados simuladores y coordinadores. Básicamente la simulación es disparada por la recepción de
mensajes de simulación que invocan secuencialmente a las salidas, transiciones externas, y transiciones
internas planificadas por las funciones de tiempo. En esencia, un simulador abstracto es una descripción
algorítmica de como llevar a cabo las instrucciones implícitas en los modelos DEVS para generar su
comportamiento.
La simulación de un modelo estructural jerárquico se hace con tres clases de procesadores;
. Simulador: trata los modelos atómicos. A cada modelo atómico se asocia un simulador con el rol de
mandar la ejecución de distintas funciones del modelo.
. Coordinador: trata los modelos acoplados. A cada modelo acoplado se asocia un coordinador con el
rol de comandar los controladores de los modelos que constituyen el acoplado.
. Coordinador raíz: genera la simulación ligada a los coordinadores de mayor nivel.
Cada simulador comunica únicamente con el controlador del nivel superior (padre). Al tope de la
jerarquía se encuentra el coordinador raíz que distribuye los mensajes a sus hijos. Un coordinador raíz
maneja toda la simulación y esta encadenado con el coordinador del modelo acoplado exterior. La
simulación procede por medio de mensajes pasados entre los procesadores que pueden acarrear
información con respecto a eventos internos y externos, así como necesidades e sincronización. Los
mensajes tienen campos para fuente de origen, hora (acarreando timestamps locales o globales,
dependiendo del uso), y un contenido consistente de port/valor, ambos determinados por funciones de
salida del modelo atómico. Hay 4 tipos de mensajes: *, X, Y, listo.
La simulación se efectúa por pasaje de mensajes entre los distintos procesadores. Un mensaje tiene los
siguientes campos: fuente, nombre del emisor, hora (local o global) y contenido (puerto destino y valor
asociado, para modelos atómicos).
Un mensaje X representa la llegada de un evento externo. Incluye hora global, y viene del padre. Hay
dos acciones posibles ante un mensaje X:
- Un coordinador lo transmite al simulador vía un método de traducción.
- Un simulador llama a la función de transición externa del componente considerada, y responde con
un mensaje listo que indica que la transición de estado ha terminado y la hora prevista del próximo
evento interno.
El mensaje * llega a un procesador indicando que el próximo evento interno a tratar le concierne.
- Si se trata de un coordinador transmite el mismo mensaje a su hijo con el menor tiempo de próximo
evento, llamado hijo inminente. Quiere decir que el próximo evento interno será llevado a cabo en su
entorno.
- El simulador ejecuta este mensaje provocando el cambio de estado dado por la función de transición
interna del modelo atómico, que responderá con un mensaje Y y un mensaje listo (indica que la
transición fue llevada a cabo; acarrea la hora del próximo evento).
Un mensaje listo indica al padre que su hijo terminó con su tarea Cuando un coordinador ha recibido
los mensajes listo de todas las influencias (en el caso de un mensaje Y ascendente) o los receptores (en el
caso de mensaje X descendente), calcula el mínimo de sus hijos (lista de tiempos de próximos eventos) y
determina su nuevo hijo inminente para cuando se reciba el siguiente mensaje *. También envía este
nuevo mínimo como la hora de su próximo evento interno en un mensaje listo a su padre.
Figura 14 - Procesadores, variables usadas y sus mensajes.
Un modelo atómico es manejado por un simulador que puede recibir dos tipos de mensaje: * (indica
que el siguiente evento interno es el de su modelo); y X (llegada de un evento externo). Un simulador
mantiene varias variables: la hora actual, t; el estado del modelo, s; la hora del último evento tl; la hora
del próximo evento interno, tn=tl+ta(s); el tiempo transcurrido desde el último evento, e=t-tl; y el tiempo
restante hasta el próximo evento interno, = tn- t = ta(s) - e.
Si llega un mensaje *, se chequea si su hora coincide con tn (debe ser así porque un * solo llega al
simulador si su modelo es inminente), y aplica la función de salida. Se pone el contenido en un mensaje
Y, y se lo manda al nivel superior. Se aplica la función de transición interna para actualizar el estado s, y
se actualizan las horas de eventos: tn=tl+ta(s); tl = tn. Finalmente se crea un mensaje listo, que indica
que la transición de estado ha sido llevada a cabo y que reporta el nuevo tn al nivel superior.
Un mensaje X provoca que se chequee si la hora que lleva el mensaje X [t1, tn] (debería ser así
porque un mensaje X sólo debe llegar luego del ultimo evento y antes del próximo interno). Se actualiza
el tiempo transcurrido: e = t-tl. Se aplica la función de transición externa con valores actualizados de e y
X; s = ext(s,e,x), y se actualiza las horas de eventos: tn=tl+ta(s); tl = tn. Finalmente se crea un mensaje
listo, que indica que la transición de estado ha sido llevada a cabo y que reporta el nuevo tn al nivel supe-
rior.
La simulación comienza inicializando los estados de los modelos atómicos, determinando sus tn. Estos
tiempos se propagan hacia arriba por medio de mensajes listo, y establecen un camino de subcomponentes
inminentes desde el modelo acoplado superior hasta un modelo atómico. Cuando el coordinador raíz
recibe un mensaje listo de su hijo (el coordinador del modelo acoplado superior), le devuelve un *
marcando su tn. Esto comienza la simulación, ya que el * será transmitido hacia abajo al simulador
inminente. Esto resultara en una onda de mensajes Y hacia arriba, una ola de mensajes X hacia abajo, y
una onda de mensajes listo hacia arriba, el ultimo de los cuales transmitido al coordinador raíz inicia la
siguiente ronda de simulación (procesamiento del próximo evento interno).
El siguiente evento en el sistema ocurrirá en el menor de todos los tiempos planificados, el momento
t+ ( es el mínimo de los tiempos remanentes, tai(si)-ei, entre los componentes i de DN) eligiendo uno
usando la función select. Sea i* este componente elegido (inminente). En el momento t+ , justo antes que
i* cambie de estado, calcula su salida y*= i*(si*). Esta salida se manda a cada una de las influencias de
i* en forma de una entrada traducida: para el influenciado j, la entrada xi*j es Zi*j(y*). El tiempo
transcurrido en cualquier componente i en el tiempo t+ es e'i=ei+ . Un influenciado j responde al
evento externo generado por i* aplicando su función de transición externa, para obtener el siguiente
estado s'j = dext(sj, e'j, xi*j) y pone su tiempo transcurrido en 0. Otros componentes que no están en el
conjunto de influencia no son afectados por la activación de i* excepto que su reloj de tiempo transcurrido
se incrementa en . Finalmente, el componente i* ejecuta su transición interna yendo al estado
si*'=dint(si*), y poniendo su tiempo transcurrido en 0.
Ejemplo 12
Veamos la asociación del simulador abstracto con el modelo EF-P, que se ve en la figura 15. Aquí los
círculos representan los procesadores y los rectángulos los modelos asociados.
El ciclo de simulación comienza por un mensaje * enviado por el coordinador raíz al coordinador del
modelo exterior. Aquí C:EF-P recibe el mensaje * y lo transmite a su hijo inminente. Para C:EF-P, el hijo
inminente puede ser EF (cuando es hora de generar un nuevo trabajo), o P (cuando un trabajo ha sido
procesado). Para C:EF, GENR es el inminente hasta que TRANSD se hace inminente para parar la
simulación. Cuando S:GENR recibe un mensaje * manda un mensaje Y a su padre C:EF (aplicando su
función de salida para producir un contenido con port salida y un valor id_trab). S:GENR también
provoca la ejecución de la función de transición interna GENR, y manda un mensaje listo con el tn de
GENR. Para C:EF, cuando GENR es inminente, el mensaje Y que se pone en el port salida se traduce a
un mensaje Y en el port llegada y se envía a su influenciado, TRANSD.
Para C:EF, cuando GENR es inminente, el mensaje y que pone en el port salida aparece como un
mensaje Y en el port salida de su padre EF. Como EF es el hijo inminente de EF-P, el mensaje Y es
enviado a C:EF-P, donde será enviado como un mensaje X al simulador de P, el influenciado de EF. En
este caso, si P esta libre, se pone en ocupado. Cuando el tiempo de procesamiento ha terminado, S:P
genera un mensaje y (un id_trab en el port salida) que va a su padre C:EF-P y luego como un mensaje X
a C:EF, el influenciado de P.
Para C:EF, el único receptor de un mensaje X en el port entrada es TRANSD, y traduce el port
entrada a resuelto. Luego, el mensaje que manda a S:TRANSD es el mismo que recibe, excepto que el
port se cambia a resuelto. Luego de retransmitir el mensaje X a todos los receptores, los pone en su lista
de espera.
Veamos qué pasa con un mensaje listo. Por ejemplo, si los hijos de C:EF son {(GENR 10),(TRANSD
1000)}, GENR es inminente, y el tn de C:EF es 10. Luego, C:EF envía un mensaje listo con tiempo 10 a
su padre, C:EF-P. Este, habiendo recibido todos sus listo, envía un listo al coordinador raíz. Asumiendo
que sus hijos son {(EF 10)(P 15)}, el listo de C:EF-P contiene tn 10. El listo se manda al raíz y vuelve
apareciendo como un * a C:EF-P con hora 10. Esto inicia un nuevo ciclo de simulación, en este caso con
GENR generando un segundo trabajo.
El simulador abstracto es genérico, o sea que trabaja con cualquier modelo en la clase o sus subclases.
La interfaz entre modelo y su simulador es definida por métodos representando consultas y operaciones
que el simulador hace al modelo. Los detalles de la estructura interna del modelo se ocultan en esta
interfaz. Cualquier modelo puede simularse por un simulador si tiene los métodos de la interfaz. La
eliminación de toda la información relacionada con la simulación de la especificación del modelo, nos
permite tratar los modelos como conocimiento, es decir, trabajar con una Base de Modelos.
3. MODELOS CELULARES
Los autómatas celulares son un formalismo para modelado de sistemas dinámicos complejos, de
variables y tiempo discretos (el tiempo, espacio y estados del sistema son discretos), creados
originalmente por von Neumann y S. Ulam. Un autómata celular es un conjunto infinito n-dimensional
de celdas ubicadas geométricamente. Cada punto de la grilla espacial infinita (llamado una celda) puede
tener uno de un conjunto de valores finitos de estados, es decir que cada celda tiene un estado elegido de
un alfabeto finito. Cada una contiene el mismo aparato de cálculo que las otras y se conectan entre sí de
forma uniforme. El estado de las celdas se actualiza simultáneamente y de forma independiente de los
demás en pasos de tiempo discreto. Para ello se define la vecindad de una celda, que es un conjunto de
celdas cercanas. Esta vecindad es homogénea para todas las celdas
Los estados de las celdas en la grilla se actualizan de acuerdo con una regla local. O sea, el estado de
una celda en un momento dado sólo depende de su propio estado en el instante de tiempo previo, y los
estados de sus vecinos en ese mismo momento. Todas las celdas de la grilla se actualizan sincrónicamen-
te. Luego, el estado de toda la celda avanza en pasos de tiempo discreto. Las celdas actualizan sus valores
usando una función de transición, que toma como entrada el estado actual de la celda, y un conjunto
finito de celdas cercanas, que están a una distancia limitada (la vecindad). La uniformidad en el espacio
significa que el sistema posee invariancia espacial y en tiempo.
Pueden usarse para modelar variedad de sistemas discretos naturales, pero también sirven para
comprender muchos formalismos comunes que pueden verse como extensiones de concepto básico. Se
suelen usar, al igual que las ecuaciones diferenciales para el modelado de sistemas físicos. Existen
autómatas para modelar dinámica en fluidos y gases, colonias de animales, modelos ecológicos, entre
otros. También tienen aplicación en criptografía. Permiten especificar modelos de sistemas complejos con
distintos niveles de descripción, por lo que permiten atacar mayor complejidad que las ecuaciones
diferenciales, permitiendo el modelado y estudio de sistemas muy complejos.
Formalmente, un autómata celular se define como un conjunto CA=<S,N,T>. Sea ai,j(t) el valor de la
celda i,j en el instante t (autómata celular bidimensional). Luego, el autómata evoluciona de acuerdo con
la función:
donde T denota la regla de transformación del autómata, y cada sitio está especificado por un entero
aij(t) en el rango [0,k-1] en el instante t. El parámetro de rango r especifica la región afectada por un sitio
dado.
Mca=<Q, d>, donde Q={q / q:IxI ->S} y d:Q->Q. d(q) (i,j)=T(q/N+(i,j)) para cada q Q e (i,j) IxI.
Notar que el conjunto de estados de Mca es el conjunto de estados globales del sistema. Un estado
global q es una asignación a cada una de las celdas de un elemento de S, que se llama un estado local. La
función d de Mca se llama la función de transición global (y la T, la local).
Los autómata celulares son discretos, regulares y sincrónicos. Muchas de las características únicas de
la dinámica de los autómatas celulares pueden relacionarse con la actualización sincrónica de estados de
celdas. El comportamiento colectivo parece ser estable a toda clase de perturbaciones del modelo excepto
al abandonar las actualizaciones sincrónicas. La organización de las subunidades en un modelo deben
aproximar la organización de las subunidades en el sistema a modelar, y la dinámica del modelo debe ser
una buena aproximación de la dinámica en el mundo real.
Para comprender el sistema modelado por el autómata celular, se elige un estado inicial, y se observa
la secuencia resultante de estados. En muchos casos, el sistema entra en equilibrio, independientemente
de las características de los valores iniciales. En general, cambios en las condiciones iniciales pueden
provocar cambios en los resultados.
A pesar de ser una herramienta poderosa, los autómatas celulares tienen algunas restricciones
importantes. Por un lado, se asume que en el espacio de celdas, las celdas están activas simultáneamente
(es un sistema paralelo), pero hay una restricción importante en la actividad simultánea: todas cambian
de estado simultáneamente. Otro problema es que el espacio de celdas es infinito. Para que pueda ser
simulado, el modelo debe acotarse a un numero finito de celdas en cada paso. La forma mas simple de
hacerlo es limitando el modelo a un área finita, lo que hace que se pierda homogeneidad: qué se hace con
los bordes? Para esto suelen usarse dos aproximaciones: o los estados de los bordes se especifican desde
afuera, o se conectan los extremos entre sí.
Por otro lado, el gran número de celdas hace que en general se estén haciendo cálculos innecesarios.
Para evitarlo se usa una aproximación que detecta si una celda no puede cambiar de estado. Esto es
simple de lograr, ya que una celda no puede cambiar de estado en su transición si ninguno de sus vecinos
lo han hecho. Llamemos un evento en una celda un cambio de estado en una celda. Podemos decir que en
un autómata celular, los eventos pueden ocurrir en un numero pequeño de ellas (aunque es posible que
ocurra en todas simultáneamente), y detectamos si ocurrirá un evento en una celda mirando si hubo
eventos en sus vecinos.
Se puede mantener una lista de últimos eventos, que contiene las celdas cuyos eventos ocurrieron en t.
En base a la misma, podemos determinar en que celdas ocurrirán eventos en t+1. Luego que simulamos
cada una de estas transiciones, chequeamos para ver si hubo un cambio de estado; si es así ponemos la
celda en la lista de últimos eventos para t+1.
Para iniciar el procedimiento, hay que tener un estado inicial. Si el modelo es finito con un numero
finito de celdas, podemos poner a todas las celdas en la lista de próximos eventos. Una mejor
aproximación es detectar estados especiales, llamados estados latente, en el que si un elemento s S / si
una celda y sus vecinos están en el estado s en el instante t, la celda quedara en el mismo estado en t+1 (o
sea, la función T(s,...,s)=s). Entonces es simple iniciar la simulación, ya que solo las celdas que no están
en estado latente deben ponerse en la lista de próximos eventos.
Además, si hay solo un conjunto de celdas en estado no latente, se puede simular un modelo con un
numero infinito de celdas.
En algunos casos, para modelos finitos, el procesamiento extra de la lista puede no valer la pena. Para
un modelo en el cual todas las celdas están llevando a cabo acciones todos los tiempos, no es bueno usar
esta estrategia. Para ver la relación costo/beneficio hay que ver el nivel de actividad del modelo (relación
entre celdas que llevan a cabo actividad sobre el total de celdas). Este nivel de actividad es una medida
del paralelismo del modelo.
Aunque los autómatas celulares representan un modelo de resolución elegante para un gran número de
problemas complejos, la investigación cuantitativa de las propiedades básicas de la evolución de tiempo y
estado de los autómatas celulares está comenzando. Sin embargo, se han obtenido algunos resultados
importantes. Por ejemplo, en [Wol84] pudo mostrarse que la mayoría de los autómatas celulares pueden
clasificarse en cuatro clases:
I - La evolución de todos los estados iniciales conduce, luego de un tiempo finito, a un estado
homogéneo, donde todos los sitios tienen el mismo valor.
Como dijimos, un problema de los autómatas celulares es que son modelos a tiempo discreto, lo que en
muchos casos reduce la eficiencia de las simulaciones y el grado de paralelismo del modelo. La idea es
tener un modelo de autómatas celulares con relojes asincrónicos, y hacer que el modelo sea manejado por
eventos. Las transiciones de estado de cada celda es independiente de las otras del autómata, y el
autómata puede comportarse de forma muy inhomogénea. Si usamos relojes independientes, el tiempo de
iteración para cada celda puede ser diferente. Definiremos un autómata celular asincrónico como:
Zeigler [Zei90] también definió una extensión a su formalismo DEVS, que permite plantear modelos
DEVS celulares. Un espacio de celdas de próximo evento (NEVS) esta especificado por una 4-upla,
<S,N,T,SELECT>. Nuevamente, consideramos una grilla infinita de celdas. El estado de cada celda es un
par (s, ), con s en S, en R+. Una celda en (s, ) se queda en ese estado durante un tiempo antes de
hacer una transición inducida por ella misma. Sin embargo, en el medio puede llegar un mensaje que
altere este estado, como resultado de la acción de otra celda. Luego, s y se llaman el estado secuencial y
el tiempo restante del estado. Una celda c en este estado en el momento t, se dice que puede ser expresada
como que esta en el estado secuencial s y ha sido planificada para una transición en el momento (o
t+ ).
Nuevamente los vecinos se calculan agregando sus coordenadas al vecindario prototipo N (otro
conjunto de pares finitos). Cuando ocurre una transición de eventos a una celda, ellas y sus vecinos hacen
un cambio de estado como lo dicta la función de transición T. Luego, en contraste con el autómata, T
toma una lista de pares (s, ) - todos los estados de la celda y sus vecinos antes del evento - y produce una
lista de esos pares, dando los estados totales de estas celdas justo después de la transición.
En contraste con el autómata celular, la actualización de un modelo NEVS tiene lugar en instantes de
calculo espaciados irregularmente. Sea ti tal instante, y su sucesor ti+1 calculado así:
Imaginar el estado global en ti como una lista de pares (s, ) con los estados totales de todas las celdas
en este momento. Sea * el mínimo de todos los en la lista. Luego, ti+1=ti+ *. El estado global en ti+1
se calcula así: llamar inminentes a las celdas cuyos es igual a * en el instante ti. Estas celdas están
planificadas para un evento en ti+1. Si hay mas de una, aplicar SELECT y elegir una, que llamamos c*.
Esta celda lleva a cabo la función de transición como se indica antes, resultando en un nuevo estado glo-
bal. Los estados totales de los vecinos de c* se calculan usando T; el estado total de las otras se convierte
de (s, ) a (s, - *).
Ejemplo 13
En este caso no existen conflictos entre submodelos, por ende no es necesario incluir la función Select.
La especificación de autómatas celulares no pone restricciones en su estado global inicial. Sin
embargo, hay que hacerlo para que se pueda simular en una computadora. Una forma de hacerlo es pedir
un estado local latente, en el cual no estén algunas celdas (numero finito). La idea es que la mayoría del
espacio estará latente y se quedara así, y habrá solo un número finito de celdas capaces de abandonar este
estado a la vez.
Ejemplo 14
Consideremos ahora una extensión del modelo anterior para estudiar congestión de tráfico. El modelo
previo no especifica qué pasa cuando hay colisiones. Supongamos que, en lugar de un individuo en un
plano, tenemos automóviles en una dirección, y cuando uno obstruye el camino, quien quiere avanzar
pasa de carril (preferentemente hacia la izquierda). El conjunto de estados S={0,1} representa
ausencia/presencia de un automóvil. Ponemos en N todas las celdas arriba y abajo del centro, para que el
coche se mueva en esas direcciones. Si N esta ordenado en el orden legal de pasar:
Aquí la función select determina cual de dos autos moviéndose al mismo cuadrado al mismo tiempo lo
lograra. Luego, el orden en el cual se eligen las celdas hace una diferencia. Un estado inicial en este
modelo pone un conjunto finito de celdas en estado 1, con tiempo time_left entre 0 y
TIEMPO_DE_MOVIMIENTO; todas las demás están pasivas. El patrón se moverá hacia la derecha, con
los coches haciendo maniobras para tapar obstrucciones. Notar que para hacer la simulación mas realista,
TIEMPO_DE_MOVIMIENTO y TIEMPO_DE_REINTENTO pueden hacerse variables aleatorias, de
forma tal que los coches se muevan al azar en vez de a velocidad constante.
Un estado local s es un estado latente cuando los vecinos de una celda están en s en el momento t,
luego la celda estará en s en t+1. O sea, s es latente si s=T(s,...,s). Todo estado local del modelo de
difusión satisface este criterio, porque el promedio de una constante es la constante. Si inicialmente todas
las celdas están en el mismo estado latente, el sistema persistirá en el en el tiempo (estado de equilibrio).
Mas interesantes son los estados globales en los cuales hay conjuntos finitos de celdas no latente. Debido
a la finitud de la vecindad, estos estados evolucionan hacia estados globales con la misma propiedad. Mas
aun, si se conoce el estado latente, la mayoría de las celdas que están en este estado en cualquier momento
no tienen que ser examinadas por un simulador. Esto hace que la simulación sea computable.
Luego una celda puede cambiar de estado del momento t al t+1 solo si hay una celda en su vecindario
que ha cambiado de t-1 a t. El simulador tiene que saber en cada paso que celdas cambiaron para
determinar las celdas que pueden cambiar de estado en el siguiente paso en estas circunstancias. La
vecindad inversa, -N, es el conjunto de imágenes espejo de los elementos en N (ej., (i,j) en -N si y solo si
(-i, -j) en N).
Lema: una celda (i,j) esta en el vecindario de una celda (k,l) si y solo si (k,l) esta en el vecindario
inverso de (i,j). Una celda puede cambiar de estado de t a t+1 si y solo si esta en el vecindario inverso de
una celda que cambio de estado de t-1 a t. Luego el conjunto de celdas que pueden cambiar de estado
entre t y t+1 es la unión de los vecinos inversos del conjunto que cambiaron de t-1 a t.
Como en el caso de autómatas celulares, los estados iniciales globales deben ser restringidos para
computabilidad. Aquí el rol del estado latente es jugado por el estado pasivo. Una celda es pasiva si su
tiempo restante es igual a inf. Un estado global inicial puede consistir a lo sumo de un conjunto finito de
celdas no pasivas.
4. SIMULACION PARALELA
Hasta ahora hemos estudiado distintos formalismos para sistemas de eventos discretos, con utilidad
para hacer simulaciones. En muchos casos, la ejecución de estas simulaciones es poco eficiente. El
principal problema de velocidad tiene causas estadísticas, además de la complejidad de los modelos a
especificar. Para que sea estadísticamente significativa, una simulación debe generar un número
suficiente de evoluciones típicas del sistema. Para evitar estos problemas, se puede intentar usar
simulaciones que no requieran la generación de un número grande de ciclos de simulación. Algunos
métodos llamados de reducción de varianza tratan de que el número de replicaciones necesarias de ciclos
sea proporcional a la varianza de la estimación aleatoria medida en un ciclo dado. Estos métodos son
difíciles de preparar y que la reducción de varianza que proveen no es muy grande (es típica una re-
ducción de un factor de 2 a 5).
Un medio obvio de obtener una simulación mas rápida es dedicar mas recursos. En particular,
podemos acelerar una simulación usando un sistema multiprocesador en vez de un solo procesador. Como
la mayoría de las simulaciones son de sistemas que tienen muchos componentes operando en paralelo,
parece razonable suponer que la simulación también explote el paralelismo inherente del sistema. La
simulación paralela de eventos discretos (PDES), muchas veces llamada simulación distribuida, se refiere
a la ejecución de un programa de simulación de eventos discretos en una computadora paralela. El usar
múltiples procesadores parece ser una aproximación promisoria para mejorar la velocidad, ya que la
mayoría de los sistemas simulados que consiste de muchos componentes operando en paralelo, y así se
explota el paralelismo inherente en el sistema.
Se define aceleración al tiempo que le toma a un solo procesador hacer una simulación dividido el
tiempo que toma al sistema multiprocesador hacer la misma simulación. La aceleración puede pensarse
como el número efectivo de procesadores usados (la aceleración ideal con N procesadores es N). El
problema con esta definición es especificar qué significa que un solo procesador haga la simulación.
Presumiblemente queremos un procesador con las mismas capacidades que los del sistema multiprocesa-
dor, pero estos pueden no tener la suficiente memoria propia para manejar toda la simulación. Luego, el
monoprocesador debe tener la misma capacidad que los procesadores en el sistema multiprocesador pero
con la suficiente memoria para correr toda la simulación.
Para obtener una medida precisa de la aceleración real el monoprocesador debería ejecutar de la forma
más eficiente posible. Sin embargo, en la práctica esto puede ser difícil de determinar. Una alternativa
práctica es medir cuánto toma a un solo procesador correr la simulación distribuida, midiendo el tiempo
total de ocupado de todos los procesadores durante la simulación distribuida. La medida resultante de
aceleración debería ser mayor que la aceleración real obtenible distribuyendo la simulación. También
podemos estar interesados en la eficiencia de la simulación, o sea, la aceleración dividida el número de
procesadores usados (mide la utilización efectiva de los procesadores).
4.1. Formas de descomposición paralela
Hay diversas formas de descomponer una simulación para procesar en múltiples procesadores, cuyos
méritos y desventajas serán discutidos en esta sección.
d) Recordemos que en un modelo discreto sólo se cambia de estado en puntos discretos de tiempo
simulado (un evento). Se suele usar una lista de eventos con todos los eventos pendientes planificados, y
una variable global reloj para saber el progreso de la simulación. Al usar eventos distribuidos se
mantiene una lista global de eventos, y cuando hay un procesador disponible, se procesa el próximo
evento en tiempo simulado. Hacen falta protocolos para preservar la consistencia, ya que el siguiente
evento en la lista puede estar afectado por los eventos procesados en la actualidad. Esta aproximación es
particularmente adecuada para sistemas de memoria compartida, ya que la lista de eventos puede ser ac-
cedida por todos los procesadores. La aproximación de eventos distribuidos puede ser razonable cuando
hay un número pequeño de procesos y cuando hay un gran número de información global usada por
componentes del sistema.
Al distribuir los componentes del modelo, debemos proveer esquemas de sincronización. Las formas
para atacar estas cuestiones depende si la simulación es dirigida por tiempo o por eventos, y si la
simulación es sincrónica (hay un reloj global y que todos los procesos deben tener el mismo tiempo
simulado) o asincrónica (cada proceso tiene su reloj local propio y el tiempo simulado para distintos
procesos puede ser distinto). A su vez, la simulación puede ser manejada por tiempo, en la cual el reloj
avanza de a un tick y todos los eventos planificados se simulan, o por eventos, donde el reloj se avanza a
la hora de la transmisión del mensaje simulado.
En la simulación dirigida por tiempo, el tiempo simulado avanza en incrementos fijos (ticks), y cada
proceso simula su componente sobre cada tick. Los ticks deben ser cortos para garantizar precisión, lo
que implica mayor duración de la simulación. La simulación puede ser sincrónica o asincrónica. Si es
sincrónica, todos los procesos deben terminar de simular un tick antes que cualquiera pueda comenzar a
simular el siguiente tick. Por ende, luego de simular hay una fase de actualización de estado y
comunicación. Cuando la simulación es asincrónica un proceso puede empezar a simular el siguiente tick
tan pronto como sus predecesores hayan terminado el último tick, y se sincronizan enviando mensajes a
sus sucesores. Para implementar un reloj global, se puede usar una aproximación centralizada (un proceso
dedicado para actuar como sincronizador) ó de forma distribuida (con un algoritmo de broadcast
adecuado).
La simulación dirigida por tiempo parece ser menos eficiente que la manejada por eventos ya que
puede haber ticks durante los cuales no haya eventos que aún deben simularse. Sin embargo, la
simulación manejada por tiempo evita el overhead extra de sincronización necesario. Luego, puede ser
adecuada para sistemas con topología dinámica, y para sistemas en los cuales pasan muchas cosas al
mismo tiempo.
1) Sincrónica: el reloj global se pone en el mínimo tiempo de próximo evento para todos los procesos.
Puede haber un único proceso dedicado a sincronizar, o estar distribuido. Hay diversos métodos para
mantener el reloj global:
2) Asincrónica: el reloj local para cada proceso se pone el mínimo tiempo de evento para ese proceso.
Tiene alta desempeño potencial, ya que los procesos pasan menos tiempo esperando a otros, y los eventos
independientes pueden ser simulados simultáneamente, aunque ocurran en distinto tiempo simulado.
Estas aproximación ha sido muy difundida debido a que parece ser aquella en la que pueden obtenerse
mayores grados de aceleración. En las siguientes secciones estudiaremos con detalle algoritmos para
sincronización en esta clase de simulación.
Ejemplo 15
Supongamos el caso de simular eventos en una red como la que aparece en la figura 19. En el caso (a),
inicialmente partimos de un reloj global sincronizado (5) y todos los procesos avanzan simultáneamente
al siguiente tick de reloj (6). El grado de paralelismo mejora en el caso (b), donde la simulación es
asincrónica. Aquí cada proceso puede avanzar un tick si recibe señales de los procesos predecesores,
favoreciendo la aceleración en la simulación. La situación mejora aún más en el caso de tener simulación
dirigida por evento, ya que el reloj global (GVT) avanza dirigido por eventos y no por reloj, pudiendo
acelerar aún mas el procesamiento de eventos. En el caso que la simulación sea sincrónica, los procesos
deben sincronizarse entre sí hasta todos tener el mismo tiempo de simulación. El mayor grado de
aceleración se logra en el caso (d),donde la simulación es dirigida por eventos y asincrónica, luego las
únicas dependencias están dadas por los datos de la simulación en sí.
Figura 19 - Simulación paralela dirigida por tiempo: (a) Sincrónica; (b) Asincrónica, y dirigida por
eventos: (a) Sincrónica; (b) Asincrónica
4.3. Procesos físicos y lógicos
La mayoría de las estrategias PDES existentes evitan tales secuencias usando una metodología
orientada a procesos que prohiba estrictamente que los procesos tengan acceso directo a variables de
estado compartidas usando una aproximación asincrónica por eventos. El sistema modelado, conocido
como sistema físico, se ve como si estuviera compuesto de un conjunto de procesos físicos que
interactúan en distintos puntos en tiempo simulado. El simulador se construye como un conjunto de
procesos lógicos P0, P1,..., uno por proceso físico. Todas las interacciones entre procesos físicos se
modelan con mensajes enviados entre los procesos lógicos correspondientes.
Asumimos que la simulación consiste de N procesos lógicos P0, ..., PN-1. Clocki se refiere al tiempo
simulado hasta el cual ha avanzado Pi. Cuando un evento se procesa, el reloj del proceso se adelanta
hasta el timestamp de dicho evento. Si Pi puede mandar un mensaje a Pj durante la simulación, diremos
que hay un enlace entre Pi y Pj.
Como cada proceso lógico contiene una porción del estado correspondiente al proceso físico que
modela, las variables de estado se dividen en un conjunto disjunto, se debe lograr que ningún proceso
lógico acceda directamente a más de un estado, lo que es más o menos complejo dependiendo de la apli-
cación. Por ejemplo, no suele ser difícil para una simulación de una red con colas (un proceso lógico para
cada servidor). En cambio, en autómatas celulares la información debe compartirse entre celdas vecinas.
En la ausencia de variables de estado compartidas, la aproximación más natural para programar esta
simulación es "emular" la memoria compartida construyendo un proceso lógico para cada sector de la
grilla, y enviando mensajes de "lectura y escritura" de eventos para acceder a la información compartida.
Sin embargo se obtiene baja desempeño porque el overhead del pasaje de mensajes es substancial, y los
procesos de la grilla pueden transformarse en cuellos de botella. Una aproximación más eficiente es
duplicar la información compartida en los procesos lógicos (celdas) que la necesitan. Como el estado
compartido puede ser modificado, se precisa un protocolo para asegurar coherencia entre las diversas
copias del estado compartido. Esta aproximación puede ser efectiva para lograr buen desempeño; sin
embargo complica significativamente la codificación de la aplicación, haciendo difícil su comprensión y
mantenimiento.
Para asegurar que no hay errores de causalidad se debe cumplir la restricción de causalidad local:
una simulación de eventos discretos consistente de procesos lógicos obedece a la restricción de causalidad
local si y solo si cada proceso lógico procesa eventos en orden no decreciente de timestamps. El adherir a
esta restricción es suficiente aunque no necesario para garantizar que no hay errores de causalidad. Puede
no ser necesario, porque dos eventos dentro de un mismo proceso lógico pueden ser independientes, en
cuyo caso procesarlos fuera de secuencia no provoca errores de causalidad.
La exclusión de estados compartidos puede provocar errores de causalidad. Consideremos dos eventos,
E1 en el proceso lógico LP1 con timestamp 10, y E2 en LP2 con timestamp 20. Si E1 planifica un nuevo
evento E3 para LP2 que contiene un timestamp menor que 20, E3 podría afectar a E2, por ende se
necesita ejecución secuencial de los tres eventos. Si uno no tiene información acerca de qué eventos
podrían ser planificados por otros eventos, uno se vería forzado a concluir que el único evento seguro para
procesar es el que tiene el menor timestamp, provocando ejecución secuencial.
Desde el punto de vista del sistema físico, la causa siempre debe preceder al efecto. Estas relaciones
causa-efecto del sistema físico se transforman en restricciones de secuencia en el simulador (y el
simulador puede tener más restricciones que surgen de la forma en que fue programado). La
responsabilidad del mecanismo de simulación es asegurar que estas restricciones no sean violadas al
ejecutar en paralelo. Podemos decidir si E1 puede ejecutar concurrentemente con E2, pero ¿cómo
sabemos si E1 afecta a E2 sin haber ejecutado la simulación de E1? Este es el dilema fundamental en las
estrategias de PDES. La secuencia en la cual E1 afecta a E2 puede ser una secuencia compleja de eventos,
y depende de los timestamps de los eventos.
Los mecanismos PDES tratan de proveer soluciones a esta clase de problema. En general se usan dos
aproximaciones: conservadoras y optimistas. Las conservadoras evitan la posibilidad de errores de
causalidad, basándose en alguna estrategia para determinar cuándo es seguro procesar un evento. Por otro
lado, las aproximaciones optimistas usan una solución de detección y recuperación: los errores se
detectan, y se invoca un mecanismo de rollback para recuperarse.
En el algoritmo presentado por [Cha79], un proceso con un mensaje no procesado en todos sus enlaces
de entrada pone su reloj local en el mínimo de todos los timestamps y procesa todos los mensajes con ese
timestamp. Todos los mensajes futuros tendrán timestamps posteriores al reloj local ya que llegan en
orden cronológico en cada enlace. El procedimiento se repite mientras haya mensajes no procesados en
los enlaces de entrada. Si un enlace con el menor timestamp no tiene mensajes, entonces se bloquea
(porque puede recibir un mensaje con timestamp menor a todos los otros).
Estas aproximación puede provocar abrazo mortal si hay un ciclo de procesos bloqueados. En general,
si hay relativamente pocos mensajes de eventos no procesados en relación con el número de enlaces en la
red, o si los eventos no procesados se agrupan en una porción de la red, el abrazo mortal puede ocurrir
muy frecuentemente [Cha81].
Ejemplo 16
Supongamos una simulación con cuatro procesos lógicos como en la figura 21. Supongamos que P1
envía el mensaje (3, m1) a P2, P3 manda el mensaje (2,m2) a P2, y P3 no tiene mensajes sin procesar
como se ve en la fig. 21a. P2 procesa el mensaje (2,m2) y produce (5, m3) que se manda a P4, como se ve
en la fig. 21b. En este punto, P2 no puede procesar el mensaje (3,m1) porque P2 está bloqueado por P3.
P3 también está bloqueado por P2: por ende hay abrazo mortal.
(a) (b)
Una forma de resolver el problema de existencia de abrazo mortal trata de evitarlos especificando
estáticamente enlaces que indican qué procesos pueden comunicarse con otros [Cha79]. Sabemos que
para determinar cuándo es seguro procesar un mensaje, la secuencia de timestamps en un enlace debe ser
creciente. Por ende, el timestamp del último mensaje en un enlace de entrada es un límite inferior en el
timestamp de todo mensaje subsiguiente. La idea es aprovechar esta información y usar mensajes nulos,
que no corresponden a ninguna actividad en el sistema físico.
Un mensaje nulo de PA a PB es una promesa de que no se enviará un mensaje con timestamp menor
que el mensaje nulo. ¿Cómo se determinan los timestamps de los mensajes nulos que se mandan? El reloj
de cada enlace de entrada provee un límite inferior en el timestamp del siguiente evento sin procesar. Este
límite de entrada puede usarse para determinar un límite inferior en el timestamp del siguiente mensaje
de salida. Siempre que un proceso termina de procesar un evento, envía un mensaje nulo a cada uno de
sus ports de salida indicando el límite. De esta forma el receptor del mensaje nulo puede calcular nuevos
límites en sus enlaces de salida, enviar esta información a sus vecinos, etc. De esta forma se rompe el
ciclo de procesos bloqueados y se evita el abrazo mortal.
Ejemplo 17
Supongamos que estudiamos los tres procesos lógicos de la figura 22a. En este caso, el algoritmo
conservador entra en Deadlock. Ahora supongamos que cada proceso lógico progresa en avances de 9
unidades de tiempo. En la figura 22b vemos la emisión de los mensajes nulos para este caso. Luego, el
proceso P2 tiene dos enlaces de entrada con tiempo local en 21, por ende, procesa el primer mensaje del
enlace elegido y desaparece el abrazo mortal que existía previamente.
Este mecanismo evita el abrazo mortal mientras que uno no tenga ciclos en los cuales el incremento
de timestamp colectivo de un mensaje que atraviesa el ciclo pueda ser cero. Una condición necesaria y
suficiente para abrazo mortal usando este esquema es que exista un ciclo de enlaces con el mismo tiempo
de enlace (por ejemplo, en la figura 22 si el avance es cero hay abrazo mortal).
Veamos un argumento intuitivo de porqué no hay abrazo mortal. Para que exista, debe haber un ciclo
de procesos bloqueados, por ejemplo, P1 bloquea a P2, P2 bloquea a P3, etc. hasta Pn, y Pn bloquea P1.
Sea ti el tiempo local del reloj de Pi. Luego, si Pi está bloqueando a Pj, Pj debe estar esperando un
mensaje de Pi y su tiempo de reloj local, tj debe ser igual al reloj del enlace de Pi a Pj. Pero si Pi también
está bloqueado, debe haber actualizado los relojes de sus enlaces de salida para que sean mayores o
iguales al reloj local de Pi, ti. Luego, si tj>=ti, t1 >= t1. Por la presunción de predictibilidad, por lo menos
un proceso en el ciclo, digamos Pi, con relojes del enlace de salida estrictamente mayores que su reloj
local, por ejemplo, ti>ti+1. Luego, tenemos t1>t1, una contradicción.
Ejemplo 18
Veamos cómo los algoritmos de mensajes nulos evitan abrazo mortal para el ejemplo de la figura 23.
El precálculo para los procesadores P2 y P3 se asume como 2. Los números arriba de los procesadores en
la figura muestran sus relojes locales antes que se envíen los mensajes. P2 envía el mensaje nulo (4, null)
a P3. Luego P3 actualiza su reloj local a 4 y envía el mensaje (6, null) a P2. P2 puede procesar el mensaje
(3, m1) y actualizar su reloj a 3, produciendo el mensaje (8, m4), que se envía a P3.
Una variación en la aproximación de mensaje nulo es mandar mensajes nulos en una base de demanda
en lugar de después de cada evento, como hace el protocolo SRADS [Rey82]. Aquí, siempre que un
proceso está por bloquearse pide el siguiente mensaje (nulo u otro) al proceso emisor conectado al enlace
de entrada. Esta aproximación ayuda a reducir la cantidad de tráfico de mensajes nulos, aunque puede ser
necesaria mayor demora para recibir mensajes nulos debido a que son necesarios dos mensajes. SRADS
trabaja bien con sistemas sincrónicos con interacciones infrecuentes, ya que a medida que la interacción
aumenta, el overhead degrada el desempeño.
Una mejora al esquema de mensajes nulos usa un timeout para transmisión. Si la transmisión de un
mensaje nulo se demora un tiempo, podría no necesitar ser transmitido porque será generado un mensaje
con mayor timestamp. Esto disminuirá el total de mensajes nulos necesarios, aunque algunos procesos
pueden ser demorados al esperar información de timing. Los mensajes nulos posteriores en un enlace
podrían eliminar mensajes nulos no procesados previamente en el enlace, ya que son obsoletos. Otra
mejora posible del algoritmo es que un proceso mande mensajes nulos en sus enlaces de salida sólo
cuando se bloquea.
Una aproximación alternativa usa un mecanismo para detectar cuando la simulación entró en abrazo
mortal, y otro para romperlo. El abrazo mortal puede romperse porque los mensajes con el menor times-
tamp siempre son seguros de procesar. Cuando un proceso se bloquea manda un mensaje (llamado
"probe") con timestamp con su reloj local a alguno de sus predecesores para obtener información de sus
relojes. El proceso receptor enviará su valor del reloj local al proceso que lo pide si este es posterior al
reloj local del proceso que lo pide. Sino, envía probes a sus predecesores. La mayoría de las soluciones
precisan que el mensaje contenga el camino que ha atravesado y posiblemente los relojes locales de los
procesos en el camino para detectar y corregir un abrazo mortal. Luego, los mensajes crecen en longitud
mientras pasan.
Esta aproximación puede modificar para detectar y recuperar abrazos mortales locales (por ejemplo,
situaciones donde sólo una porción de la red está en abrazo mortal). Puede hacerse preprocesamiento para
identificar todas las subredes que podrían tener abrazo mortal, y aplicar estas técnicas en subredes
individuales (el overhead puede ser grande si la topología de la red contiene muchos ciclos).
Llamamos precálculo (lookahead) a la habilidad de predecir qué pasará (o, más importante, qué NO
ocurrirá) en el futuro simulado. Si un proceso en tiempo simulado Clock puede predecir todos los eventos
que generará hasta el tiempo Clock+L, se dice que el proceso tiene precálculo L. El precálculo mejora la
habilidad de predecir eventos futuros, que pueden usarse para determinar qué otros eventos son seguros
de procesar. Se usa en la aproximación de evitar abrazo mortal para determinar los timestamps que se
asignan a mensajes nulos. También se usa para detección y recuperación de abrazo mortal porque siempre
que un proceso manda un mensaje con incremento de timestamp de T a otro proceso, está garantizando
que ningún otro mensaje seguirá en el enlace que contiene un timestamp menor que Clock + T.
Se dice que hay "predictibilidad" cuando existe un límite inferior de precálculo para cada ciclo.
Intuitivamente, los procesos mantienen los relojes de sus enlaces de salida adelante de sus relojes locales
mandando mensajes nulos. En el momento de inicialización, todos los relojes se ponen en cero. El reloj
local del proceso se pone en el mínimo de todos los relojes de sus enlaces de entrada, y se actualizan los
relojes de los enlaces de salida menores al reloj local (ya sea enviando mensajes reales o nulos). Cuando
un proceso actualiza los relojes de enlaces de salida, los mueve tan adelante como sea posible, pero no
actualiza los relojes de salida que ya están adelante en su reloj local. Luego procesa todo mensaje de
entrada con timestamp igual a su tiempo local.
Se puede mejorar la habilidad del precálculo de los procesos haciéndolo por porciones de cálculo de
eventos futuros. Por ejemplo, al simular una red de colas FIFO sin remoción, se puede precalcular el
tiempo de servicio de los trabajos que aún no han sido recibidos. Si el servidor está libre y su reloj tiene
un valor de 100, y el tiempo de servicio del próximo trabajo ha sido precalculado como de 50, el límite
inferior en el timestamp del próximo mensaje que mandará es 150 en lugar de 100. El precálculo es
posible si se pueden predecir aspectos de los eventos futuros sin conocer mensajes que provocan cálculos.
En nuestro ejemplo, si el tiempo de servicio depende de un parámetro en el mensaje el precálculo no será
tan simple.
Ejemplo 19
Consideremos la simulación de una red de encolado consistente de dos estaciones conectadas en serie.
Cada estación tiene un servidor y una cola con trabajos (clientes) esperando recibir servicio (los trabajos
se atienden en orden FIFO). En general, se usan dos tipos de eventos: (1) uno de llegada de un trabajo a
una estación; (2) uno de salida de trabajo terminado. Un trabajo J que llega a la primera estación en el
momento T pasará, en general Q >= 0 unidades de tiempo en la cola, esperando ser atendido y una canti-
dad S de tiempo siendo atendido. Este simulador tiene propiedades de precálculo pobres. P1 debe avanzar
su tiempo simulado a T+Q+S antes de generar un nuevo evento de llegada con timestamp T+Q+S para
P2. Tiene precálculo cero con respecto a generar nuevos eventos de llegada (Fig. 24).
Una aproximación alternativa elimina el evento de salida. Aquí, procesar un evento de llegada en P1
provoca planificar un nuevo evento de llegada en P2 (porque se usan colas FIFO sin remoción). El evento
en el momento T puede predecir el evento de llegada en T+Q+S porque S y Q pueden calcularse en
tiempo simulado T. En particular, Q es el tiempo de servicio restante para el trabajo atendido en el mo-
mento T, mas los tiempos de servicio de todos los trabajos que lo preceden. De forma similar, puede
calcularse S en T porque no depende en el estado del proceso en un instante posterior a T. El precálculo
usando esta aproximación alternativa es Q + S [Fuj90].
Figura 24 - Precálculo de tiempos de servicio
No siempre se puede tener buen precálculo. Por ejemplo, si la distribución de tiempo de servicio tiene
un mínimo de cero y hay remoción, un trabajo de alta prioridad simulado hasta el tiempo T podría afectar
(aunque muy raramente) a toda la estación en la red en el momento T, de forma que ninguna estación
podría hacer precálculo más allá de T.
Lubachevsky [Lub89] usa un mecanismo con mensajes nulos y precálculo, pero una ventana móvil de
tiempo simulado. Así se trata de reducir el overhead existente para determinar cuándo es seguro procesar
un evento. El límite inferior de la ventana se define como el mínimo timestamp de todo evento sin
procesar, y sólo los eventos no procesados cuyo timestamp reside en la ventana pueden procesarse.
El propósito de la ventana es reducir el "espacio de búsqueda" que se debe recorrer para determinar si
un evento es seguro. Por ejemplo, si la ventana se extiende del tiempo simulado 10 al tiempo simulado
20, y la aplicación es tal que cada evento procesado genera uno nuevo con un incremento de timestamp
mínimo de 8 unidades, cada proceso lógico sólo necesita examinar eventos no procesados en los procesos
lógicos vecinos para determinar qué eventos son seguros: no hay eventos no procesados a dos o más hops
que puedan afectar a alguno en la ventana de 10 a 20 porque tal evento tendría que tener un timestamp
anterior al comienzo de la ventana.
Una cuestión importante es el método utilizado para determinar el tamaño de la ventana de tiempo. Si
la ventana es muy pequeña, habrá muy pocos eventos disponibles para ejecución concurrente. Por otro
lado, si la ventana es muy grande, el mecanismo de simulación se comporta de la misma forma que lo ha-
ría si no se usara ninguna ventana de tiempo lo que no justifica el overhead del mecanismo de ventana.
Un tamaño adecuado de ventana requiere información específica de la aplicación (que debe obtenerse del
programador, del compilador o en tiempo de ejecución).
Existen diversos estudios empíricos y analíticos para determinar la desempeño de los diversos
esquemas conservadores. Se estudiaron los esquemas de evitar, detectar y recuperar abrazo mortal con
resultado diverso. El grado de precálculo juega un rol critico en el desempeño, ya que un proceso con
precálculo L puede habilitar a otros procesos para procesar de forma segura mensajes de eventos pen-
dientes.
Por otro lado, las mediciones extensivas de los algoritmos para evitar, detectar y recuperar abrazos
mortales ejecutando en un multiprocesador, obtuvieron desempeño bastante malo excepto en pocos casos
especializados. Si hay ciclos, apenas se logra aceleración. La demora parece afectar el desempeño del
esquema de mensajes nulos, pero no en el esquema de detección y recuperación. La conclusión general es
que las técnicas de Chandy-Misra no son viables.
En otro trabajo, Fujimoto usa cargas sintéticas para caracterizar cuantitativamente el precálculo. Para
ello usa un parámetro llamado relación de precálculo, y presenta datos empíricos para demostrar la
importancia de explotar precálculo para lograr buen desempeño. Dependiendo del precálculo, se
clasifican las aceleraciones para estas cargas sintéticas desde las más lentas que la ejecución secuencial
hasta las casi ideales. Pudo verse que el esquema detección/recuperación y de mensajes nulos puede tener
eficiencias tan altas como el 75% con el esquema de mensajes nulos (aceleración relativa a un
monoprocesador). El precálculo y la población de mensajes tiene influencia (hay mayor aceleración
cuanto mayor precálculo y población de mensajes). Para el esquema de detección/recuperación de abrazo
mortal hay un nivel de población crítico: poblaciones inferiores producen desempeño pobre y constante. A
medida que la población aumenta por encima de ese nivel, el desempeño mejora dramáticamente. La
población necesaria para lograr buena desempeño depende del precálculo (mayor precálculo reduce la
población necesaria) [Fuj89].
Quizá la desventaja más obvia de las aproximaciones conservadoras es que no pueden explotar por
completo el paralelismo disponible en la aplicación de simulación. Si un evento puede afectar a otro,
deben ejecutarse secuencialmente. En general, se fuerza la ejecución secuencial sin ser necesaria. Por
ende, los algoritmos dependen del precálculo. Otro problema está relacionado con la robustez: cambios
menores en la aplicación pueden tener un efecto catastrófico en el desempeño. Esto es problemático
porque los investigadores no suelen tener conocimiento avanzado de todo el rango de experimentos. Otro
problema es que las configuraciones son estáticas: no se pueden crear dinámicamente nuevos procesos, y
su interconexión también debe definirse estáticamente.
La mayoría de los esquemas conservadores requieren que el programador provea conocimiento con
respecto al comportamiento del proceso lógico. Una estimación muy conservadora puede resultar en
desempeño muy pobre, y una muy optimista pueden provocar violaciones de restricciones de causalidad.
Tal vez la desventaja más seria con los protocolos conservadores existentes es que el programador debe
cuidar los detalles del mecanismo de sincronización para lograr buena desempeño. Los que proponen
aproximaciones optimistas dicen que el usuario no debe preocuparse de tal complejidad.
Los métodos optimistas no evitan errores de causalidad sino que los detectan y recuperan. En contraste
con los mecanismos conservadores, no precisan determinar cuándo es seguro proceder; sino que detectan
un error e invocan un procedimiento de recuperación, explotando paralelismo donde pueden ocurrir
errores de causalidad pero de hecho no ocurren.
El mecanismo Time Warp es el protocolo optimista más conocido [Jef85]. Cuando el mensaje de un
evento recibido en un proceso lógico tiene timestamp menor al del reloj del proceso, hay un error de
causalidad. El evento que provoca el rollback se llama dispersor. La recuperación se realiza deshaciendo
los efectos de todos los eventos que han sido procesados prematuramente por los procesos que reciben el
dispersor (es decir, los eventos procesados con timestamp mayor que el del dispersor).
Los mensajes tienen dos timestamps: tiempo de emisión y de recepción. El reloj local (LVT - Local
Virtual Time) de un proceso se pone en el mínimo tiempo de recepción de todos los mensajes no
procesados. Los procesos pueden ejecutar eventos mientras tengan alguna entrada, por ende el LVT de un
proceso puede adelantarse a los de sus predecesores, y puede recibir un mensaje de un evento del pasado.
En este caso, el proceso hace rollback, y la simulación se rehace teniendo en cuenta el nuevo evento.
Un rollback, además de modificar el estado, puede enviar mensajes a otros procesos. Para lo primero
se debe almacenar el estado del proceso (en el rollback se restaura un vector de estado viejo). Para anular
un mensaje transmitido se envía un mensaje negativo o antimensaje que elimina al original cuando llega
a su destino. Los mensajes de eventos se llaman mensajes positivos. Si se recibe un antimensaje de un
mensaje positivo procesado, debe deshacerse el proceso, y eliminar el mensaje positivo. Repitiendo este
procedimiento recursivamente se puede cancelar todos los cálculos erróneos.
Para cancelar los efectos de los mensajes erróneos deben almacenarse los estados de cada proceso
desde el último tiempo “correcto” (llamado GVT - Global Virtual Time). Este es el mínimo de los LVTs
de todos los procesos y los tiempos de emisión de todos los mensajes enviados pero no procesados.
Para implementar Time Warp cada proceso debe mantener su LVT, su estado actual, una cola de
estados con copias de sus estados previos (con por lo menos un estado previo al GVT); una cola de
entrada con todos los mensajes recibidos con tiempos de emisión mayores o iguales al GVT (en orden de
recepción); y una cola de salida con copia de los mensajes enviados con tiempos de emisión mayores o
iguales al GVT (en orden de emisión). Los mensajes de entrada tienen signo positivo; las copias en la
cola de salida son antimensajes y tienen signo negativo. Si un mensaje y su antimensaje están en la
misma cola, se destruyen.
Al recibir un dispersor (tiempo de recepción menor que el LVT), el proceso hace rollback y lo procesa.
El proceso pone el estado actual en el último estado grabado antes del tiempo de recepción del dispersor,
y pone su LVT en el tiempo de ese estado. Descarta todos los estados posteriores de su cola de estados,
manda todos los antimensajes de su cola de salida con tiempo de emisión mayores que su LVT. Procesa el
dispersor y procesa los mensajes en su cola de entrada con tiempos de recepción mayores o iguales al
LVT, y avanza en el tiempo de simulación.
Ejemplo 20
Veamos el caso de la figura 26a. Aquí el LVT está en el tiempo simulado 29, y llega un dispersor con
tiempo 22. Entonces, se inserta en la cola, el LVT pasa a ser 22, y se envían, como antimensajes, los
mensajes de la cola de salida 25 y 33, dispersando el evento de llegada.
Asumiendo memoria infinita el algoritmo Time Warp no entrará en abrazo mortal, porque los
procesos individuales no entran en abrazo mortal mientras tengan entradas, y el GVT siempre crece.
Además tiene mayor aceleración potencial que las aproximaciones conservadoras pero al costo de mayor
requerimiento de memoria. Una ventaja es que no necesita conocer la topología de las posibles
interacciones entre procesos. Como ningún evento con timestamp menor que el GVT puede anularse, el
almacenamiento usado por tales eventos puede ser utilizado. Las operaciones irrevocables (como las de
entrada/salida) no pueden hacerse hasta que el GVT borre el tiempo simulado en el cual ocurrió la
operación. Este proceso se llama colección de fósiles.
. Si un antimensaje llega antes del mensaje correspondiente, se almacena en la cola de entrada (sin
importar si su tiempo está antes o después del LVT). Cuando el mensaje positivo llega, ambos se
destruyen.
. Si un mensaje positivo llega antes de su antimensaje, y al llegar el antimensaje el LVT es menor que
el tiempo de recepción (los mensajes están en futuro simulado), los dos se destruyen.
. Si un mensaje llega antes de su antimensaje y cuando llega el antimensaje el LVT es mayor que su
tiempo de recepción, el proceso hace rollback. Se pone el mensaje actual en el último estado grabado con
tiempo simulado anterior al tiempo de recepción del mensaje, mensaje y antimensaje se destruyen, y el
proceso avanza.
Una desventaja de Time Warp es que requiere mucha memoria. Si se calcula el GVT seguido, se
pueden sacar mensajes de la entrada y salida. El GVT puede estimarse con un algoritmo distribuido lineal
en el tiempo de hacer broadcast a todos los procesadores en el sistema. Si el GVT se estima
frecuentemente, es necesaria menos memoria pero habrá mayor overhead en tiempo. Otra forma de
ahorrar memoria es descartar los estados con timestamps mayores que el LVT que surgen a partir de los
rollbacks.
La cancelación perezosa [Gaf88] es una optimización para reparar el daño causado por los cálculos
incorrectos en lugar de repetirlos por completo. El mecanismo de Time Warp descripto usa cancelación
agresiva: si se hace rollback a un tiempo T, se mandan inmediatamente los antimensajes
correspondientes. Pero un dispersor puede no alterar el cálculo de los eventos de los que hace rollback, y
los mensajes (positivos) generados por estos eventos pueden ser los mismos. Con cancelación perezosa,
los procesos no mandan inmediatamente los antimensajes para todo rollback, sino que miran si la
reejecución del cálculo regenera los mismos mensajes. En este caso no hay necesidad de cancelar el
mensaje. Un antimensaje sólo se manda luego que el LVT pasa su tiempo sin regenerarlo.
En la mayoría de los casos la cancelación perezosa es más rápida (hay evidencia empírica) pero
precisa más memoria que la agresiva. La cancelación perezosa también permite que los cálculos se
ejecute en menos tiempo que el caso de camino crítico, ya que los cálculos con entrada incorrecta (o
parcialmente correcta) pueden generar resultados correctos. Supongamos que un proceso calcula el
mínimo de A y B, y ejecuta prematuramente usando un valor incorrecto de A. Si ambos valores (correcto
e incorrecto) de A son mayores que B, la ejecución incorrecta produce el mismo resultado que la
correcta). Esto no es posible usando cancelación agresiva, porque la hacer un rollback los cálculos se
descartan inmediatamente.
Estos factores están relacionados con la propiedad de precálculo. Recordemos que en el ejemplo 19
que el evento de llegada en T+Q+S era invariante a otros eventos en [T, T+Q+S]. Luego, P1 hace
precálculo y planifica el evento de llegada T+Q+S aunque su reloj local sólo avance hasta T. Ahora
consideremos una simulación Time Warp usando cancelación perezosa que usa los eventos de llegada y
partida. Asumamos que P1 ha avanzado más allá de T+Q+S, y ha procesado el evento de partida en
T+Q+S, y planificado el evento de llegada subsiguiente. Supongamos que un evento dispersor llega con
timestamp Tx tal que T < Tx < T+Q+S. Si P1 hace rollback, procesa el dispersor, y reejecuta el evento de
partida en T+Q+S. Sin embargo, como el evento de llegada en T+Q+S no está afectado por el evento
dispersor (debido a que se usan colas FIFO), será recreado el mismo evento de llegada que fue generado
en la ejecución original. Debido a que se usa cancelación perezosa, el ejecutivo Time Warp no cancela el
tiempo de llegada original en el tiempo T+Q+S. La propiedad de invarianza sobre la cual se basa el
precálculo es la misma propiedad que permite que la cancelación perezosa tenga éxito.
La cancelación perezosa toma ventaja del precálculo aunque la aplicación no haya sido programada
explícitamente para explotarlo, a diferencia de las aproximaciones conservadoras que requieren que se
especifique explícitamente. La desventaja es que su overhead es mayor, ya que el cálculo invariante debe
reejecutarse, y son necesarias comparaciones de mensajes para determinar cuándo es aplicable la
optimización.
También se han propuesto ventanas de tiempo para protocolos optimistas. Aquí se usan para prevenir
que los cálculos incorrectos se propaguen en el futuro simulado. La aproximación de ventana de tiempo
en movimiento usa una ventana de tiempo fijo de tamaño W. Aquí sólo se eligen para procesar los
eventos con timestamps en [T, T+W], donde T es el evento con menor timestamp [Sok88].
Las críticas al método dicen que no puede distinguir buenos cálculos de los malos, por ende pueden
impedir el progreso de cálculos correctos. Más aún, los cálculos incorrectos que están adelantados en el
futuro simulado ya están discriminados por el mecanismo de planificación de Time Warp, que da
precedencia a las actividades con timestamps pequeños. Finalmente, no está claro cómo debe determinar
el tamaño de la ventana. Los datos empíricos sugieren que las ventanas de tiempo ofrecen poca ventaja en
ciertos casos, y mejoras en otros.
En [Mad88], un mensaje dispersor provoca que un proceso envíe mensajes de control especiales para
detener la dispersión de cálculos erróneos. Los procesos que pueden ser "infectados" por cálculos erróneos
se notifican cuando se detecta un error (es decir, un mensaje dispersor).
Como en el esquema de ventana de tiempo, la desventaja es que algunos cálculos correctos pueden
congelarse innecesariamente. También, el conjunto de procesadores afectado por cálculos erróneos podría
ser significativamente más grande que el conjunto real; por ende, pueden mandarse algunos mensajes de
control innecesarios. Finalmente, se debe conocer la velocidad a la que puede dispersarse el cálculo
erróneo y el tiempo necesario para transmitir los mensajes de control. El determinar límites en estas
cantidades puede ser difícil.
En Time Warp es importante que uno pueda cancelar un cálculo incorrecto antes que este pueda
dispersarse en el sistema. De otra forma puede ocurrir que los cálculos erróneos se dispersen rápidamente
a través del sistema, mientras que hay antimensajes tratando frenéticamente de encontrarlos. Tal
comportamiento puede evitarse; una forma de prevenirlo es dar a los antimensajes mayor prioridad que
los mensajes positivos.
Un mecanismo, llamado de cancelación directa [Fuj89b] (para memoria compartida) hace que siempre
que un evento E1 planifique otro E2, y deje un puntero de E1 a E2. Este puntero se usa si luego se decide
que E2 debería cancelarse (usando cancelación perezosa o agresiva). Por contraste, los sistemas de Time
Warp convencionales deben buscar para encontrar mensajes cancelados. Las ventajas de este mecanismo
son dobles: reduce el overhead asociado con la cancelación de mensajes, y rápidamente encuentra
cálculos erróneos para minimizar el daño.
La evidencia indica que mientras que el precálculo mejora el desempeño de los algoritmos optimistas,
no es un prerrequisito para Time Warp. En la figura 27 se compara Time Warp contra los algoritmos de
evitar, detectar y recuperar abrazo mortal. Se designa alguna fracción de los trabajos en el simulador
(aquí un 1%) como alta prioridad, mientras que el resto son de baja prioridad. Los trabajos de alta
prioridad remueven el servicio de los de baja prioridad. Como se noto antes, esta simulación contiene
características de precálculo muy pobres, y no puede optimizarse usando colas FIFO como se hizo antes
para el simulador. Como puede verse, Time Warp puede obtener una aceleración significativa para este
problema, mientras que los algoritmos conservadores tienen cierta dificultad.
Las mediciones usaron 256 procesos lógicos. Se muestra el desempeño usando colas FIFO y colas con
remoción. Usando cargas sintéticas se midió el efecto del precálculo, la distribución de incrementos de
timestamp (localidad temporal), topología (específicamente localidad espacial), y granularidad de los
cálculos en el desempeño. Se encontró que Time Warp puede lograr aceleración en proporción de la
cantidad de paralelismo disponible en la carga bajo condiciones de test saturadas (mas paralelismo que
procesadores) y no saturadas (menos paralelismo que procesadores). Aunque los resultados son
alentadores, debemos decir que los overheads de salvado de estado pueden degradar bastante el desem-
peño (baja cuando el tamaño del estado aumenta).
Si se considera el caso donde el rollback requiere tiempo cero, si los cálculos incorrectos nunca hacen
rollback de los correctos. Time Warp usando cancelación agresiva produce desempeño optimo (tiempo de
ejecución igual al camino critico de menor limite). Asumiendo un costo fijo para el rollback, se demostró
que Time Warp puede mejorar los algoritmos de Chandy-Misra en una cantidad arbitraria (p. ej. en
proporción al numero de procesadores disponibles). Intuitivamente, esto ocurre porque el paralelismo que
se pierde ejecutándose de forma conservadora puede ser arbitrariamente grande, y la ejecución optimista
puede explotar este paralelismo [Lip90].
Los modelos analíticos existentes produjeron desempeño desde extremadamente bueno hasta muy
pobre, dependiendo del costo de rollback (todo cálculo no presente durante los cálculos normales). El
rollback produce tres overheads: restaurar las colas de entrada, de estado, y de salida. Restaurar las colas
de entrada y estado tiene costo despreciable porque solo hacen falta unas pocas instrucciones de maquina
para poner el puntero en el próximo evento a ser procesado (otros costos tales como insertar el dispersor
en la cola de entrada no se consideran costo de rollback porque puede tener lugar durante el progreso
normal). El overhead principal en un rollback está en restaurar la cola de salida, lo que implica mandar
antimensajes.
El costo de rollback no es proporcional a su longitud. Por un lado, mandar antimensajes toma menos
tiempo que mandar mensajes positivos: sólo se mandan mensajes preexistentes mientras que mandar un
mensaje positivo requiere asignar un buffer y llenarlo con datos, además de otros costos (overhead de
planificación, procesar mensajes de entrada, salvado de estado, y por supuesto, y cálculo de la
simulación).
Ejemplo 21
Supongamos que hacer rollback de un cálculo T unidades de tiempo simulado, toma el doble que el
progreso hacia adelante. Consideremos el caso de dos procesadores, P1 y P2: supongamos que P2 esta 10
unidades adelante de P1 cuando P1 manda un mensaje a P2, provocando que P2 haga rollback.
Asumamos que la transmisión del mensaje toma tiempo cero. Mientras, P2 está haciendo rollback de 10
unidades de tiempo, de acuerdo con nuestra presunción que hacer rollback es mas lenta que el progreso.
Ambos procesadores avanzan unas pocas unidades de tiempo simulado, y P2 envía un mensaje que hace
rollback de P1. Mientras P1 está haciendo rollback 20 unidades, P2 avanza 40 unidades. Es claro que si
estos procesadores siguen haciendo rollback del otro, la distancia de rollback y el tiempo de hacerlo
aumenta exponencialmente con la simulación. Luego, la tasa de progreso de los procesadores.
Una cuestión crítica enfrentada por los sistemas optimistas tales como Time Warp es si el sistema
exhibirá comportamiento de thrashing donde la mayoría de su tiempo se pasa ejecutando cálculos
incorrectos y haciendo rollback. Los cálculos incorrectos serán ejecutados al cuesta de los correctos; mas
aun, si la aplicación solo contiene paralelismo limitado relativo al numero de procesadores disponibles, es
inevitable un grado significativo de rollback.
Los algoritmos optimistas tienden a usar muchas más veces de memoria que sus contrapartes
conservadoras. El uso de una política de planificación de procesos inadecuada al implementarlo puede ser
catastrófico. Mas aún, hacer debugging de las implementaciones de Time Warp consume tiempo porque
puede requerir análisis detallado de scenarios de rollback complejos. Por otro lado, este costo de
desarrollo sólo debe pagarse una vez cuando se desarrolla el kernel de Time Warp.
5. Conclusiones
En este trabajo hemos presentado diversos mecanismos utilizados en la actualidad para permitir
simulación eficiente de sistemas de eventos discretos. Esta actividad requiere de formalismos especiales
que permitan su construcción de forma eficiente, segura y a bajo costo.
El formalismo DEVS es uno de estos formalismos, que está cada vez más difundido en actividades de
simulación de eventos discretos. Su base formal permite utilizarlo como herramienta matemática,
permitiendo estudiar detalladamente el comportamiento de los sistemas desarrollados. Por otro lado, su
estructura jerárquica y modular facilita el desarrollo y mantenimiento de las aplicaciones.
Los autómatas celulares, por otro lado, permiten simular determinada clases de sistemas complejos (desde
flujo de tráfico hasta sistemas ecológicos complejos) por medio de un mecanismo simple.
En todos los casos es necesario proveer métodos eficientes para la ejecución de las simulaciones. Para ello
hemos analizado diversos mecanismos existentes en la actualidad, básicamente aquellos que son
asincrónicos y permiten la división de la simulación a realizar (y su lista de eventos), ya que son los que
parecen ofrecer mayor grado de aceleración sobre las simulaciones secuenciales. Se puso especial énfasis
en distintos métodos, clasificados en optimistas y pesimistas. Los mecanismos pesimistas fueron una
primer forma de atacar estos problemas, aunque en la actualidad las aproximaciones optimistas parecen
ser las más adecuadas para resolver la mayoría de los problemas.
6. Referencias
[Aya92] AYANI, R.; RAJAEI, H. "Parallel simulation using conservative time windows", Proc. of the
Winter Simulation Conference. Dec. 1992. pp. 709-717.
[Cha79] CHANDY, K; MISRA, J. "Distributed simulation: a case study in design and verification of
distributed programs", IEEE TOSE, September 1979.
[Cho94] CHOW, A.; ZEIGLER, B. "Revised DEVS: a parallel, hierarchical, modular modeling
formalism". Proc. Winter Simulation Conf., 1994.
[Cho94b] CHOW, A.; ZEIGLER, B. "Abstract simulator for the parallel DEVS formalism".
[Cho95] CHO, Y. "Parallel Implementation of container using parallel virtual machine". M.Sc. Thesis.
Department of Electrical and Computer Engineering.The University of Arizona. 1995.
[Cho95b] CHOW, A. "A C++ binding of the parallel devs formalism". Proceedings of the SCS'95. pp. 38.
1995.
[Con88] CONCEPCION, A.; ZEIGLER, B. "DEVS Formalism: a framework for hierarchical model
development", IEEE transactions on software engineering. Vol 14, No. 2. Feb 1988. Pp. 228-241.
[Con89] CONCEPCION, A. "A hierarchical computer architecture for distributed simulation", IEEE
Transactions con computers, Feb. 1989.
[Eck95] ECKART, J.D. "A Cellular automata simulation system". Technical Report Radford University.
1995.
[Fuj89b] FUIMOTO, R. "Time Warp on a shared memory multiprocessor". Transactions of the SCS. 6, 3
(Julio 1989). pp. 211-239.
[Fuj90] FUJIMOTO, R. "Parallel Simulation of Discrete Events". Communications of the ACM Vol. 33.
No. 10. pp. 30-53. 1990.
[Gaf88] GAFNI, A. "Rollback mechanisms for optimistic distributed simulation systems". Proc. of the
SCS M. on DS. 19(3):61-67, July 1988.
[Gar70] GARDNER, M. "The fantastic combinations of John Conway's New Soligaire Game 'Life'.".
Scientific American, 23 (4), 1970, pp. 120-123.
[Gar86] GARZIA, R.F.; GARZIA, M.R.; ZEIGLER, B.P. "Discrete Event Simulation", IEEE Spectrum,
December 1986. pp. 32-36.
[Gra80] GRAYBEAL, W.; POOCH, U. "Simulation: Principles and Methods". Cambridge, MA, 1980.
[Gut95] GUTOWITZ, H. "Cellular Automata and the sciences of Complexity. Part I-II". To appear in the
journal Complexity. November 1995.
[Ho89] HO, Y. "Special issue on discrete event dynamic systems", Proceedings of the IEEE, 77 (1), 1989.
[Hoo89] HOOVER, S.; PERRY, R. "Simulation: A Problem Solving Approach", Addison Wesley,
Reading, MA, 1989.
[Jef85] JEFFERSON, D. "Virtual Time". ACM TOPLS, 7(3): 404-425. July 1985.
[Jef87] JEFFERSON, D. "Distributed simulation and the Time Warp Operating System". In 11th.
Symposium on OS principles. pp 77-93. November 1987.
[Kim95] KIM, K. et al. "Distributed optimistic simulation of hierchical DEVS models". Proceedings of
the SCS'95. pp. 32. 1995.
[Lin95] LIN, Y.; FISHWICK, P. "Asynchronous Parallel Discrete Event Simulation", IEEE Transactions
on Systems, Man and Cybernetics. 1995.
[Mis86] MISRA, J. "Distributed discrete-event simulations". ACM Computing surveys. Vol. 18, No. 1,
39-65. 1986.
[Nic94] NICOL, D.; FUJIMOTO, R. "Parallel Simulation Today". Annals of Operations reserach, vol.
53, 249-285. Nov 1994.
[Ove93] OVEREINDER, B.; SLOOT, P.; HERZBERGER, L. "Time-Warp on a transputer platform: pilot
study with asynchronous cellular automata". 1993.
[Rey82] REYNOLDS, P. Jr. "A shared resource algorithm for distributed simulation". Proceedings of the
9th. Ann. Symp. on Comp. Arch. pp. 259-266. 1982.
[Rig89] RIGHTER, R.; WALRAND, J. "Distributed simulation of discrete event systems". Proceedings of
the IEEE. pp. 99. January 1989.
[Sok88] SOKOL, L;BRISCOE, D; WIELAND, A. "MTW: a strategy for scheduling discrete simulation
events for concurrent execution", Proc. of SCS conf on distributed simulation, 34-42. 1988.
[Tof94] TOFFOLI, T. "Occam, Turing, von Neumann, Jaynes: How much can you get for how little? (A
conceptual introduction to cellular automata)". Proceedings of ACRI'94. (1994).
[Wol84] WOLFRAM, S. "Universality and complexity in cellular automata", Physica, 10D, 1-35 (1984).
[Zei84] ZEIGLER, B. "Multifaceted Modelling and discrete event simulation". Academic Press, 1984.
[Zei90] ZEIGLER, B. "Object-oriented simulation with hierarchical modular models". Academic Press,
1990.
[Zei95a] ZEIGLER, B.; KIM, D. "Design of high level modelling / high desempeño simulation
environments". Technical Report, Department of Electrical and Computer Engineering, University of
Arizona. 1995.
[Zei96] ZEIGLER, B.; MOON, Y.; KIM, D.; KIM, D. "DEVS-C++: A high performance modelling and
simulation environment". Technical Report, Department of Electrical and Computer Engineering,
University of Arizona. In Proceedings of 29t. Hawaii International Conference on System Sciences, Jan.
1996.