Proposta
de
um
suporte
para
simulações
orientadas
a
objetos
262-8
0.267
UFSC-BU
Dissertação submetida à Universidade Federal de Santa
Catanna
distribuídas
em uma
plataforma
aberta
como
requisito parcial à obtenção do grau deMestre
em
Engenharia
Elétricapor
Richard
Duarte
Ribeiro
objetos
distribuídas
em
uma
plataforma aberta
Richard
Duarte
Ribeiro
Esta dissertação foi julgada para a obtenção do título de
Mestre
em
Engenha-
ria, especialidade
Engenharia
Elétrica, área de concentraçãoSistemas
de
Controle,Automação
eInformática
Industrial, e aprovada-em sua forma final pelo curso dePós-Graduação da
Universidade Federal de Santa Catarina.~â
Prof.
Car
os Alber aziero, Dr.Orientador
W/`
Prof. Adroal aiz ,Dr.
Coordenador do V,-'Curso de Pós-,Gra ão
/'V ` `~~ ` z/
V
BANCA EXAMINADORA
¿/
×~
Í
/été
Prof. rlos Al
~ero,
Dr.z
M/Í'uf\
Prof. J an-Marie F;x?nes, Dr.
í
- ã'\ ¿\`\‹
¿. \§§c a ga, Dr./
/
f./
Prof. Luiz
Nacamura
Jr., Dr.Ao
C'EFET~PR
e àCAPES-PICDT,
pelo suporte financeiro.Ao
LCMI
na
UFSC
pela oportunidade concedida.Aos
professores doDAINF
noCEFET-PR
pelo apoio e compreensão.Ao
professor Carlos Alberto Maziero, pela orientação deste trabalho, pela ami-zade e pela confiança depositada.
Aos
membros
da banca examinadora pela participação, críticas e comentários.A
Lau Cheuk
Lung,Damián
Rodrigues Sánchez, Nelkis de laOrden
Medina
pela ajuda, orientação e colaboração.
A
JoséAguiomar
Foggiatto, pelas orientações antes, durante e depois do tra-balho.
A
todos que direta ou indiretamente ajudaram na elaboração deste trabalho.A
simulação éuma
ferramenta de grande utilidade no estudo de sistemas complexos.As
técnicas de simulaçãotêm
evoluído no sentido de aproveitaros avanços constatados
em
outras áreas da informática, particularmente nocampo
das linguagens de programação, para facilitar a construção dos modelos,e do processamento paralelo, para agilizar a execução de simulações de grandes
dimensões.
Este trabalho visa definir a estrutura de
um
suporte de execução para si-mulações a eventos discretos distribuidas. Para simplificar a construção dos
modelos de simulação, optou-se pelo uso de linguagens
com
caracteristicas deorientação a objetos, tornando possivel a construção hierárquica dos modelos
e a reutilização de código.
Ao
invés de criaruma
linguagem de descrição demodelos própria para o suporte proposto, optou-se por empregar bibliotecas co-
nhecidas de simulação orientadas a objetos, obtendo assim
um
suporte maisgenérico e portável.
Os
problemas provenientes do uso da programação orientada a objetossobre
um
suporte computacional distribuido e possivelmente heterogêneo são abordados através do uso deuma
plataforma aberta para a comunicação entreSimulation is an useful tool in the study of complex systems. Traditional
simulation techniques have been improved by using developments achieved in
other computer science domains, like
programming
languagesand
parallel pro-cessing. Construction of simulation models is going easier, by
means
ofnew
programming
concepts,and
huge simulations can run faster, due to parallelprocessing techniques.
This
work
aims to define an open platform structure for distributeddiscrete-event simulations. To
make
the construction of simulation models ea-sier,
we
adopted an object-oriented modelling approach, allowing hierarchicalmodels
and
code reuse. In place of defining ourown
object-oriented simula-tion language,
we
choosed to useknown
object-oriented simulation libraries,to obtain a
more
genericand
portable simulation environment.The
problems arisingfrom
the use ofan
object-oriented language over adistributed
and maybe
heterogeneous ezcecution environment have been adres-sed by using an open platform for objects interactions, matching the
CORBA
standards.2
Simulaçao a Eventos
Discretos
1
Introdução
1~
âooo¬1'-\1o>U‹o1o¬4>..4>oac›:›
2.1 Introdução . . . . .
2.2 Princípios dos Sistemas Físicos . . . . .
2.3
Modelos
de Simulação2.4 Simulação a Eventos Discretos . . . . .
2.4.1 Evolução do
Tempo
Simulado . . . . .2.4.2 Estrutura dos
Modelos
. . . . .2.4.3
Mecanismo
Básico de Simulação . . . . .2.5 Simulação Distribuída . . . . .
2.5.1 Estrutura dos
Modelos
. . . . .2.5.2 Gestão
do
Tempo
Simulado . . . . .2.6 Garantir a Causalidade . . . . .
2.6.1 Estratégias Pessímistas . . . 11
2.6.2 Estratégias Otimístas . . . 14
2.7 Conclusão . . . 15
3
Simulação Orientada
a
Objetos
17
3.1 Introduçao . . . 17
3.2
Simulando
com
Objetos . . . 173.2.1
C++SIM
. . . _. 183.2.2
Uma
Simulaçãoem
C++SIM
. . . 233.3
Símulando
com
Objetos Distribuídos . . . 233.3.1
MOOSE
. . . ._ 243.3.2
PROSIT
. . . _. 253.4 Conclusão . . . _ 26
'
4.1 Introdução 4.2
A
ArquiteturaOMA
. . . . . 4.3A
Estrutura deum
CRB
. . . . . 4.4CHORUS/COOL
. . . . _ 4.4.1 Ferramentas de Desenvolvimento 4.4.2 SuporteRuntime
. . . . . 4.5 Conclusão . . . . .O
Suporte de Simulaçao Proposto
5.1 Introdução . . . . .
5.2 Estrutura Geral do Suporte de Simulação
5.3 Estrutura de
um
Subsimulador . . . . .5.4 Distribuidor de Eventos . . . . .
5.5 Sincronização entre subsimuladores . . .
5.5.1
Um
Sincronizador Pessimista . .5.5.2
Um
Sincronizador Otimista . . .5.6 Conclusão . . . . .
Conclusões
ePerspectivas
2.1
Um
escalonador. . . . .2.2
Modelo
de simulação . . . . .2.3 Respeito local à causalidade . . . . .
2.4 Processo
em
espera demensagem.
. . .2.5 Situação de bloqueio . . . . .
2.6
O
uso demensagens
nulas . . . . .3.1
Modelagem
de processos . . . . .3.2
As
classes deC++SIM
. . . _ .3.3 Arquitetura do ambiente
PROSIT
. . .4.1
Modelo
de referênciada
OMA
. . . . .4.2
Uma
requisição enviada através doORB
4.3
A
estrutura deum
ORB
. . . . .4.4
O
compiladorCHIC
. . . . _5.1 Estrutura geral do suporte de simulação
5.2 Estrutura interna de
um
subsimulador.A 5.3 Ativação de
métodos
entre objetos. . .
5.4 Ativação de
método
remoto. . . . . . .5.5 Controle
do
escalonador. . . . . .Introdução
O
estudo de grandes sistemaspode
ser efetuado através deum
enfoque analítico ou viasimulação por computador. Esta última forma é particularmente interessante no caso
de sistemas complexos ou
com
muitas entidades, dificultandouma
abordagem
analítica[CM81,
RW89,
Maz94].Todavia
a simulação de sistemas complexospode
seruma
tarefa pesada,em
termosde esforço computacional. Por exemplo, a simulação do funcionamento de
um
comutador
telefônico de grande porte durante alguns minutos
pode
consumirsemanas
de processa-mento
[Mis86].Nestes casos a paralelização da simulação
pode
ser de grande utilidade, haja vistoa significativa quantidade de paralelismo potencial existente nesse tipo de sistema. En-
tretanto, paralelizar de
modo
eficienteuma
simulaçãosem
pôrem
risco sua propriedadefundamental, o respeito à causalidade no sistema modelado, não é
uma
tarefa trivial, etem
sido alvo de pesquisa nos últimos anos [Mis86,RW89,
Fuj90, Maz94].A
abordagem
deprogramação
por objetospode
serextremamente
útilna
construção demodelos
de simulação complexos, por permitiruma
tradução mais intuitiva das entidadesdo
sistema e suas interações paraum
modelo
computacional.O
próprioparadigma
deprogramação
orientada a objetostem
suas origensna
simulação, atravésda
linguagemSimula 67, que introduziu os conceitos de objetos, atributos e
métodos
[BDMN73].
Este trabalho
tem como
objetivo proporuma
estrutura para suportar a execuçãodistribuída de simulações orientadas a objetos sobre plataformas computacionais possi-
velmente heterogêneas. Para permitir a interação entre os diversos objetos que
compõem
o simulador distribuído e o
modelo
a simular, quepodem
estarem
máquinas
e sistemasoperacionais distintos, utilizamos
um
suporteCORBA
[Obj95, Siq95].Esta dissertação está dividida
em
seis capítulos, descritos a seguir:mesma
se encontra. São apresentados os objetivos que se prentende alcançarcom
este trabalho.
Além
disso, descreve-se de forma sucinta o conteúdo deste trabalho,procurando ressaltar seus pontos mais importantes.
Capítulo
2 Apresenta os principais conceitos e técnicasempregadas
em
simulaçãoseqüencial. Apresenta
também
a problemática ligada à paralelização deuma
simu-lação, discutindo seus principais problemas e as técnicas usadas para soluciona-los.
Capítulo
3 Introduz o usoda
orientação a objetos na simulação.Aqui
são explicadasresumidamente
quais ferramentas são usadas neste tipo de simulação (linguagens es-pecíficas e bibliotecas especializadas).
A
seguir é explicada a biblioteca especializadautilizada por nós neste trabalho, a biblioteca
C++SIM.
Capítulo 4
Neste capítulo é apresentada a arquiteturaCORBA. É
explicadocomo
estafunciona e qual a sua estrutura.
A
seguir é apresentado o núcleoCORBA
utilizadoneste trabalho, o
CHORUS/
COOL.
Capítulo
5 Neste capítulo apresentamos a estrutura proposta para a simulação distri-buída de
modelos
construídos segundo oparadigma
de orientação a objetos. Sãoabordadas a estrutura local a cada
máquina
e as interações entre asmáquinas
quecompõem
o suporte de execução.Capítulo
6 Este finaliza o trabalho, mostrando os resultados obtidoscom
este trabalhoe as conclusões obtidas
com
omesmo.
São propostastambém
algumas
idéias paraSimulação
a
Eventos
Discretos
2.1
Introdução
Nos
dias de hoje a existência de grandes sistemas complexos já se tornouum
fatocomum.
Esse tipo de sistema encontrado
em
diversas áreasdo
conhecimentohumano
(econo-mia, telefonia, manufatura, entre outras) requer
um
cuidadoso estudo para o controlee
acompanhamento
de seus comportamentos,bem
como
para medidas dedesempenho
everificação de possíveis modificações. Isso tudo
pode
se mostrar inviável sepensarmos
naslimitações encontradas pelos
métodos
matemáticos convencionais.Uma
solução possívelpara conseguir as referidas medições e estudos é a simulação.
E
A
metodologia do estudo deum
sistema atravésda
simulação é simples:com
baseem
um
modelo
simplificadodo
sistema real, pode-se fazer a sua observaçãono
tempo
e realizaros estudos que se
fizerem
necessários. Talmodelo
deve reproduzir ocomportamento
dosistema real
com
a exatidão requerida para os estudos.Para
se conseguir êxitona
simulação deve-se obter, a partir do sistemaou
subsis-tema
em
estudo,um
modelo
que o represente segundo os aspectos mais relevantes docomportamento
em
estudo.Com
basena
complexidade imposta pelomodelo
escolhe-sequal técnica de simulação será utilizada para analisa-lo.
No
fim
obteremosum
modelo
de simulação, ou seja,
um
programa
decomputador
quecontém
a lógica operacional dosistema
ou
subsistemaem
estudo [PHB93].Em
uma
simulação otempo
pode
ser contado deuma
forma independente dotempo
real. Este
tempo
está vinculado a simulação e échamado
de“tempo
simulado” ou“tempo
lógico”, ou ainda
“tempo
virtual”. Isto permite que a simulação seja executada seguindouma
velocidade controlada, possibilitandouma
evolução do sistema compatívelcom
a observação e estudo domesmo.
2.2
Princípios
dos
Sistemas
Físicos
Todo
sistema físico obedece a dois principios básicos, cujo respeito deve ser garantidodurante a simulação de
um
modelo
domesmo:
ø Causalidade.
Em
um
dado
instante t o sistema possuium
estado que é dependentedo
seu estado inicial,do
própriotempo
t, e dos estados anteriores até omomento
t(incluindo este) [Mis86, Maz94]. Isso significa que o futuro não
pode
influenciar opassado. Este princípio deve ser garantido pelo simulador.
ø
Determzmsmo.
A
todo instante t existeum
valor positivo e, tal que ocomportamen-
to futuro do sistema
pode
ser completamente determinado até t+
e [Mis86]. Talpropriedade deve ser corretamente
mapeada
nomodelo
construído. Este princípioé de responsabilidade
da
modelagem
do sistema.2.3
Modelos
de Simulação
Um
sistemapode
ser vistocomo
uma
coleção de entidades que interagem entre si. Taisentidades representam as características de funcionamento do sistema.
Cada
entidadepode
ser descritacom
o auxílio de variáveis de estado e de funções quecuidam da
evoluçãodessas variáveis. Tais variáveis e funções se apresentam sob formas diferentes,
dependendo
do tipo de sistema a modelar. Existem duas abordagens que
podem
ser usadas para amodelagem
de sistemas:o Sistemas contínuos: neste caso a evolução do sistema é melhor representada de
forma
contínua.Para
descrever esse tipo decomportamento
amodelagem
do
sistemaé feita através de
um
conjunto de equaçoes diferenciais,montado
sobre as variáveisde estado, que assim evoluem de forma contínua.
‹› Sistemas discretos: a evoluçao do sistema é melhor
modelada
atravésda
ocorrênciade eventos
em
instantes discretos. Essecomportamento pode
ser representado através de transições de estado (eventos) quepossuem
pré e pós condições apli-cadas sobre as variáveis de estado.
Por questão de simplicidade, neste trabalho consideraremos apenas os sistemas discre-
2.4
Simulação
a
Eventos
Discretos
~
2.4.1
Evoluçao
do
Tempo
Simulado
Na
execução deuma
simulação deve-se escolhercomo
otempo
simulado evoluirá.Levando-se
em
conta que sempre deverao ser respeitados os dois princípios básicos dossistemas físicos (causalidade e determinismo) existem duas formas basicas de fazer evoluir
o
tempo
[RW89]:ø Simulação coordenada pelo tempo. Neste tipo o
tempo
evoluiem
passos fixos (ticks),de duração 6. Depois de cada passo, o simulador verifica a existência de eventos que
possuam
data de ocorrência igual à data atual notempo
simulado e os executa.Após
isso, o simulador avança o
tempo
simuladoem
maisum
passo.O
grandeproblema
desse tipo de simulação reside na escolha que deve ser feita do valor de 6. Valoresgrandes levarão ã perda de eventos, tornando a simulação errônea. Valores pequenos
levarão à perda de eficiência, pois resultarão
em
vários passossem
a ocorrência dealgum
evento. Essa forma de simulação se torna interessantequando
a densidade eespaçamento dos eventos
no
tempo
é regular [Maz94].0 Símulaçao coordenada pelos eventos. Nesta técnica o
tempo
simulado é avançado dotempo
de ocorrência deum
evento para otempo
de ocorrência dopróximo
evento.Com
issonao
se permite a ocorrência de etapas inúteis, já que após cada evoluçaono
tempo
simulado existirá aomenos
um
evento a ser tratado.No
presente trabalhooptamos
pela simulação coordenada pelos eventos, pois esta égeralmente mais eficiente e permite aproveitar melhor o paralelismo potencial
em
modelosde grandes dimensões, devido ao seu maior assincronismo.
2.4.2
Estrutura dos
Modelos
Para
permitir a execução deuma
simulaçãoem
um
computador
é necessário traduzir osaspectos estruturais e dinâmicos do sistema
em
estudo paraum
modelo
de simulação.Existem várias abordagens utilizadas para realizar essa tradução. Tais abordagens
procuram
descrever asmudanças
de estado e as suas ações resultantes.As
principais são [Maz94]:ø Orientadas a eventos. Neste caso cada evento no sistema é representado por
uma
condição para sua ocorrência e pelas ações que serão executadas
quando
dessaø Oríentadas a processos.
Aqui
cada entidade domodelo tem
sua representaçãoatravés de
um
processo, que executa ações representando asmudanças
de esta-do, o avanço do
tempo
simulado e as relaçõescom
as outras entidades do sistema.Alguma
dessas ações são de duração não nula notempo
simulado.As
interaçõesentre processos
podem
ser feitas por recursos (objetoscomuns
acessados por váriosprocessos), por ativação e desativação direta de processos entre si, ou por troca de
mensagens.
Neste trabalho
optamos
por utilizar omodelo
discreto de simulação usandouma
abor-dagem
demodelagem
por processos e mensagens. Fizemos estas escolhas por achar queeste
modelo
é o que mais se adapta ao tipo de estudo realizado nesta dissertação, alémde ser o mais
adequado
à execuçãoem
uma
plataforma distribuída.2.4.3
Mecanismo
Básico
de Simulação
Na
simulação a eventos discretosdevemos
controlar aordem
dos eventos a serem tratados.Isto deve ser feito para se garantir o respeito à causalidade (garantir que
nenhum
eventoserá executado antes de outro
com
data de execução anterior). Para isso utiliza-se o “escalonador”, quepode
serimplementado
através deuma
fila,na
qual os eventos aprocessar são ordenados de
forma
crescente segundo a data de ocorrência de cadaum
deles]
A
figura 2.1 mostra oesquema
básico deum
escalonador.O
primeiro eventoda
filaserá o
próximo
evento a ser tratado.A
data de ocorrência deste evento correspondeao instante presente no
tempo
simulado.O
tratamento deste eventopode
gerar novoseventos, que por sua vez são colocados
no
escalonador(mantendo
ainda a ordenaçãocrescente).
Assim
sendo, os outros eventos do escalonador sao considerados potenciais,pois
podem
sermodificados
ou cancelados no tratamento dos eventos anteriores._ _ escalonador de eventos atualização _ eventos lad simu o cancelamento de eventos Figura 2.1:
Um
escalonador.O
esquema
de execução definido pelo escalonador garante que todo evento será tratado depois dos eventos dos quais elepode
depender causalmente, pois estestêm
uma
data deocorrência anterior ã do evento
em
questão.Esse
mecanismo
tem
utilidade tantona
simulação orientada a eventos quantona
orien-tada a processos.
No
primeiro caso, todos os eventos do sistema são gerenciados porum
escalonador único.
No
segundo caso, cada processopode
manterum
escalonador internopara gerenciar a execução de seus eventos locais.
2.5
Simulação
Distribuída
A
simulação seqüencial de modelos de grandes dimensõespode
exigirum
esforçocompu-
tacional considerável, que
pode
facilmente significar dias oumesmo
semanas
de processa-mento. Entretanto, nesses sistemas existe
normalmente
uma
quantidade de paralelismopotencial significativo, gerado por atividades
com
baixo grau de dependência,em
setoresdistintos do sistema.
A
distribuiçãoda
simulação sobreum
conjunto de processadorespode
desta formaaumentar
em
muito a velocidade de execução do simulador,mas
osmecanismos
de simu- lação e de sincronização entre processosdevem
ser capazes de explorar esse paralelismo potencial deforma
eficiente.O
problema
centralna
execução distribuída deuma
simulação é ocompromisso
per-manente
entre o aproveitamentomáximo
do paralelismo potencial domodelo
e o respeitoao princípio de causalidade, essencial a qualquer simulação. Diversos trabalhos foram efe-
tuados
na
busca de soluções a esseproblema
[CM79,CM81,
Mis86,RW89,
Fuj90, Maz94].As
principais soluções serão abordadasna
seqüência deste capítulo.2.5.1
Estrutura dos
Modelos
Para
melhor apresentar osmecanismos
de sincronização empregadosem
simulações distri-buídas,
vamos
primeiramente definiruma
estrutura básica para os modelos de simulação considerados.Usando
oparadigma
processo-mensagem,podemos
definirum
modelo
como
sendo constituído por
um
conjunto de processos quecomunicam
entre si pormensagens
trocadas através de
uma
rede estática de canaisFIFO
(figura 2.2):°
Rede
estática de processos: cada processomodela
uma
entidadedo
sistema.Para
simplificar o estudo dos algoritmos de sincronização envolvidos, a topologia do
mo-
delo é estática (onúmero
de processos é constante e os canais de comunicação entre6
Ê
im; . 31lmc 1 4]
w
[mb › 2]Figura 2.2:
Modelo
de simulação.0
Comunicação
por troca de mensagens: iremos modelar as interações entre entida-des no sistema real através de trocas de mensagens entre os respectivos processos
no
modelo.Como
no sistema real as interações entre as entidades ocorrem de for-ma
instantânea, consideramos que otempo
de transferência dasmensagens
entreprocessos é nulo no
tempo
simulado. Isso significa queuma
mensagem
que sai deum
processo no instante t chega obrigatoriamente nomesmo
instante t ao processoreceptor.
0
Canal
FIFO
ilimitado entre processos: para as trocas demensagens
os processosusam
canais de comunicação unidirecionais,FIF
O
(First In First Out) e ilimitados.Essas características asseguram que as mensagens entre dois processos quaisquer
circularão dentro de
uma
ordem
correta.Os
canais são não-limitados para evitarque bloqueios ocorram
na
transmissão de mensagens.° Referência temporal única: no sistema real todas as entidades
possuem
uma
re-ferência temporal única, logo, esta característica deve existir
na
simulaçãotambém.
Na
simulação seqüencial clássica isso é mantido deuma
forma simplesl,mas
no casoda
simulação distribuída o controle pode ser mais complexo,como
veremos a seguir.2.5.2
Gestão
do
Tempo
Simulado
A
questão mais importante da simulação a eventos discretos distribuída é a que se refereao
problema
do respeito à causalidade.Na
simulação seqüencial,um
relógio único é usa-do
para coordenar a seqüênciaem
que serão tratados os eventosdo
sistema, garantindo1Em
um
simulador seqüencial o andamento do tempo simulado é representado porum
relógio atua-lizado antes de cada tratamento de evento. Este relógio serve de referência temporal única a todos os
desta
forma
a causalidade.Na
simulação distribuída aevolução dotempo
simulado devetambém
seguiruma
referência única,mas
o contexto paralelo permite que cada processo secomporte
como
um
simulador seqüencial quase independente. Desta formapodemos
vis-lumbrar duas estratégias distintas para a evolução do
tempo
simuladoem
uma
simulaçãodistribuída:
o
Abordagem
síncrona.Todos
os processos domodelo avançam
de maneira síncronano
tempo
simulado.Para
isso, cada processo determina a data de seu próximoevento a tratar e a
comunica
aum
processo controlador, que calcula omínimo
entretodas as datas recebidas e envia esse dado de volta para os processos.
Com
essevalor os processos
podem
avançar notempo
simulado atéum
tempo mínimo
seguro[Maz94].
A
implementaçãodo
relógio globalpode
ser centralizada(um
processodedicado atuando
como
sincronizador), ou distribuída (algumas propostaspodem
ser encontrada
em
[RW89]).o
Abordagem
assíncrona.Cada
processo gerenciauma
cópia local do relógio de si-mulação,
chamada
relógio local, que evoluiem
função do estado local do processo[RW89]. Admite-se assim
uma
evolução assíncrona dos relógios locais dos processos,e portanto
podem
ocorrer defasagens entre eles, notempo
simulado. Nesse contex-to assíncrono,
mecanismos
especiaisdevem
ser empregados para gerenciar otempo
simulado e garantir o princípio de causalidade.
Além
disso, todamensagem
enviadapor
um
processo deve carregar sua data de envio (estampilha).No
nosso trabalhooptamos
pelaabordagem
assíncrona, pois esta permite soluçoes to-talmente distribuídas (sem
um
controle centralizado).Além
disso, as soluçõs assíncronaspossuem normalmente
maiordesempenho
permitindo explorar melhor o paralelismo po-tencial do
modelo
[RW89].2.6
Garantir
a Causalidade
Dentro
da
simulação assíncrona deve-se garantiruma
evolução correta dotempo
simulado,sem
que ocorraalguma
violação à leida
causalidade. Garantiruma
evolução correta dotempo
simulado e o respeito ao princípio de causalidadeem
um
modelo
distribuído no qualos relógios locais dos processos
podem
evoluir de maneira assíncrona é, à primeira vista,uma
tarefa complicada.No
entanto, no artigo [CM81]Chandy
e Misrademonstram
que, secada processo preservar localmente o princípio de causalidade e os canais de comunicação
forem
FIFO,
então o princípio de causalidade será respeitado pela simulaçãocomo
um
Para
preservar a causalidade localmente, cada processo deve tratar todos os seus even-tos locais (eventos internos ou
mensagens
recebidas de outros processos)na
ordem
estritade suas datas de ocorrência no
tempo
simulado. Por exemplo,na
figura 2.3, o processo p,-deve tratar as
mensagens
recebidasem
seus canais de entradana
ordem
[m4 , 3], [ml , 4],[mz , 7] e [m3 , 9]: [mz z 7l lml › 4] [m4 › 3]
a
[m3 › 9]Figura 2.3: Respeito local à causalidade.
Entretanto,
quando houverem
canais vazios (semmensagem
recebida)na
entrada deum
processo, estepode
encontrar dificuldade para estabelecer aordem
correta dasmen-
sagens a consumir, pois novas
mensagens
podem
chegar nos canais vazios.No
exemplo da
figura 2.4, o processo pi não
pode
decidir sobre aordem
deconsumo
dasmensagens
pre-sentes
em
suas entradas, poisuma
novamensagem
com
estampilha qualquerpode
chegarno canal vazio. ima › 4] [ml v ll [m2 › 6]
Q
?Figura 2.4: Processo
em
espera demensagem.
Para
resolver esse problema duas classes de estratégia foram propostas [Fuj90]:ø Estratégia pessimista: busca-se garantir, a priori, que as
mensagens
serao sempreconsumidas
na
ordem
de suas estampilhas, ou seja, o princípio de causalidadenunca
é violado. Assim, a execução do processo
pode
ser suspensa até que a definiçãoinequívoca
da
próximamensagem
a serconsumida
possa ser feita.Mecanismos
adicionais
podem
ser necessários para evitar a ocorrência de bloqueios,como
veremoso Estratégia otimista: aqui as
mensagens
já disponíveis nos canais de entrada deum
processo são consumidasna ordem
de suas estampilhas,mesmo
se estaordem
não
for definitiva.Caso
mais tardecheguem
mensagenscom
estampilhas menoresque aquelas já tratadas (violação local do princípio
da
causalidade), a simulação doprocesso deve ser refeita a partir daquele ponto, de forma a considerar as mensagens que
chegaram
atrasadas.2.6.1
Estratégias
Pessimistas
Primeiramente propostas
em
[CM79], essas soluções sãotambém
conhecidascomo
meca-nismos conservativos ou técnicas de correção a priori. Elas tentam assegurar
quando
oprocessamento de
um
evento será seguro, isto é, casoum
processo possuaum
evento nãoprocessado
em
algum
dos seus canais de entrada, ele possa chegar a conclusãoem
um
tempo
finito de quepode
tratar esse eventosem
risco de violar o princípio de causalidade,pois estará seguro de que não chegará a ele outro evento
com
estampilhamenor
[Fuj90].Relógio
do Canal
eRelógio
de
Entrada
Conforme
visto, a transferência demensagens
através deum
canal obedeceuma
ordem
FIFO,
que permite estabeleceruma
ordem
crescente de estampilhas neste. Assim, aestampilha
da
últimamensagem
recebida através deum
canal estabeleceuma
datamínima
para a
próxima
mensagem
que atravessar esse canal. Esta datamínima
échamada
de“relógio do canal” (channel time).
Um
processopode
determinar a estampilhamínima
da próxima
mensagem
que rece-berá
com
base nos relógios de seus canais de entrada.O
mínimo
entre todos os relógiosdos canais de entrada define
uma
grandeza quechamaremos
de “relógio de entrada” (inputclock)
do
processo.Todas
asmensagens
presentesna
entrada deum
processocom
uma
estampilha igualou
inferior ao seu relógio de entradapodem
ser consumidas pelo processosem
risco deviolação do princípio de causalidade.
Caso
nenhuma mensagem
da entrada possa serconsumida, o processo deve aguardar a evolução de seu relógio de entrada, que depende
da
evolução dos relógios dos canais de entrada, e portantoda
chegada de novas mensagens.O
Risco de
Bloqueios
O
controle doconsumo
demensagens
através dos relógios dos canais de entrada permitegarantir o respeito ao princípio de causalidade,
mas
ele gera outro problema: a possibili-Tal situação ocorre
quando
se formaum
ciclo de processosem
espera, cadaum
aguar-dando
uma
mensagem
de seu respectivo canal de entrada que possui omenor
relógio decanal.
A
figura 2.5 ilustrauma
situação de bloqueio típica (onde rl,~ representa o relógiolocal
do
processo l, [mi , t] representauma
mensagem
lcom
estampilha t, e rc, representa[ma›4l
Q
Ê
lmbvsl-í»
<i-
I'l1=3 I`l2=2 I'C1=3 o relógiodo
canalFigura 2.5: Situação de bloqueio.
Nesta situaçao, pl nao
pode
consumir [ma , 4] pois existe a possibilidade de receberuma
mensagem com
estampilha 2í
t<
4 de pz e, por sua vez, pz nãopode
consumir[mb , 5] pois
pode
receberuma
mensagem
estampilhada 35
t<
5 de pl.Como
a decisão decada processo é local ao
mesmo, sem
informações externas, a chegada de novasmensagens
não
mudará
a situação de bloqueio.Duas
estratégiaspodem
ser utilizadas para tratarda
possibilidade de bloqueios:através de
mecanismos
especiais, pode-se prevenir a ocorrência de bloqueios ou detec-tar e resolver eventuais bloqueios.
Prevenção
de
Bloqueios
Uma
proposta para prevenir bloqueios utiliza mensagens de controle para evitar que taissituações ocorram. Essas mensagens são
chamadas
de “mensagens nulas”[CM79,
Maz94].Ao
envia-las,um
processocomunica
a outrouma
“previsão” (ou lookaheaal) sobre seucomportamento
futuro.Ao
enviaruma
mensagem
nula [null , rlz-+
Õ],com
Õ2
O e rl,- seurelógio local, o processo se
compromete
a não enviar novas mensagens antes de Õ unidadesde
tempo
simulado. Esta previsão é calculada a partir de dadoscomo
a duraçãomínima
do
tratamento de cadamensagem,
ocomportamento
do processo, etc.Neste
método
os processosmantêm
seus relógios de canal atualizados através do enviode
mensagens
nulas.Convém
ressaltar que essas mensagens nulas não correspondemà
nenhuma
atividade específica do sistema físico,mas
servem apenas ao propósito desincronização entre processos.
Toda
vez queum
processo enviauma
mensagem
não-nula porum
canal de saída, ele envia outra, nula, através de cadaum
dos outros canais de saída. Estamensagem
não contém
nenhuma
informação, apenas a previsão do próximo envio demensagem
do processo.
A
função dessamensagem
é fazercom
que o relógio do canal de entradado
processo receptor (e o relógio do canal de saída do processor emissor) seja avançado.Tal
mensagem
indica que sobre aquele canal não será enviada outramensagem
com
uma
estampilha
menor
do que a estampilhada
mensagem
nula.Ao
receberuma
mensagem
nula, o processo receptor pode recalcular seu relógio deentrada
(mínimo
dos relógios dos canais de entrada) e eventualmente liberar para consu-mo
mensagens
cujas estampilhas sejam inferiores ao novo relógio de entrada. Elepode
também
reavaliar seu relógio local, avançando-o, ecom
isso enviar novasmensagens
nulascom
melhores previsões Õ a seus sucessores [Maz94].Na
figura 2.6, apareceum
exemplo
do uso demensagens
nulas.O
processo pl enviauma
mensagen
nula a cadaum
de seus sucessores após o envio deuma
mensagem
não- nula [ma , 7] para outro processo.Com
o recebimento dasmesmas,
os processos pz epg atualizam seus relógios de canal de entrada e
chegam
aum
novo valor de relógio deentrada.
Caso
existissemmensagens
que nãopudessem
ser consumidas pelos processospz e pg, antes daquele novo valor, as
mesmas
poderiam
ser tratadas agora. pz e pgpodem
também
enviar novasmensagens
nulas a seus sucessores.[null , 7-l-6]
'
Q
[ma),Vp1:7
[null , 7-l-Õ]Figura 2.6:
O
uso demensagens
nulas.Detecção
eResolução de
Bloqueios
Outra forma
de vencer os bloqueios é através da detecçao e correçao dessas situaçoes[CM81,
Mis86]. Para isso esta estratégia deixa a simulação prosseguir livremente até queseja detectado
um
bloqueio.A
partir disso, tenta-se resolver o impasse para liberar asimulação.
soluciona-lo.
O
mecanismo
para detecçãopode
ser encontradoem
[Mis86], e baseia-seem
técnicas clássicas de detecção de bloqueios [BT87, CJS87,
SMP88,
Ray92].As
estratégiasde resolução se baseiam no fato de que a
mensagem com
amenor
estampilhaem
toda asimulação é
sempre
segura para ser entregue ao processo receptor [Fuj90].Com
base nesseprincípio a
mensagem
mais antigaem
dadomomento
da simulação poderá ser entregueao seu respectivo receptor. Para fazer isso deve-se descobrir qual a
mensagem
mais antigana
simulação inteira, solução que não se mostra muito eficaz.A
segunda
solução é a proposta de execuçãoem
fases [CM81].Chandy
e Misrapropõem
o uso deum
sítio especial no modelo,chamado
controlador, que detecta o blo-queio e inicia a resolução do
mesmo.
A
cada fase, 0 processo que faz partedo
ciclobloqueado envia a seus sucessores
uma
atualização hipotética, desconsiderando os seuscanais vazios,
da
datamínima
do próximo envio demensagem
[Maz94].Com
os valoresrecebidos de seus predecessores ele recalcula a sua própria data para a fase seguinte. Es-
sa fase é repetida várias vezes até que se
obtenham
valores estáveis de relógio de canal.Neste ponto, pelo
menos
uma
mensagem
pode
ser transmitida antes dopróximo
bloqueio[CM81].
Em
[Fuj90] édemonstrado
que essa estratégiaaumenta
a velocidade da simulaçãoapenas
em
casosem
que o bloqueio envolve muitos processos e onúmero
demensagens
enviadas é
muito
grande. Existeum
nível crítico de quantidade de mensagens.Quan-
do a população de
mensagens
cai abaixo desse nível, a performance se torna pobre erelativamente constante.
2.6.2
Estratégias
Otimistas
Nas
estratégias otimistas todas as mensagens que já se encontram nos canais de entradade
um
processopodem
ser tratadas.Não
se espera pela verificação de segurança dasmesmas
.em relação à lei de causalidade.A
simulação é executadanormalmente
até queuma
mensagem
com
estampilhamenor
que as que já foram tratadas chegue ao processo.Esta situação
pode
ocorrer por força do assincronismo entre os diversos processadoresenvolvidos
na
simulação, etambém
pelotempo
(físico) de trânsito dasmensagens
entre eles.A
chegada deuma
mensagem
retardatária provocauma
situação errônea que exigerecuperação.
Para
isto a simulação deve dealguma
forma tratar amensagem
queacabou
de chegar antes das outras que já foram tratadas.
Uma
abordagem
do tipo otimista para simulação assíncrona distribuída foi propostapor Jefferson e Sowizral [J ef85,
RW89,
Fuj90]. Essa abordagem,chamada
deTime
Warp,utiliza o
paradigma
do“Tempo
Virtual”.No
caso deuma
violação de causalidade otempo
O
Retorno no
Tempo
Simulado
VQuando
uma
mensagem
retardatária chega aum
processo(mensagem
cuja data de envio éanterior ao relógio local do receptor), a simulação neste processo retrocede até
um
tempo
simulado anterior ao
da
estampilhada
mensagem
recém-chegada.A
simulaçãono
processo é então retomada, considerando amensagem
recém-chegadaem
sua posição correta. Retroceder a simulaçãoem
um
processo implicaem
retornara
um
estado anterior e eventualmente cancelar mensagens quetenham
sido enviadas demodo
errôneo, através do envio de pedidos de cancelamento (anti-mensagens). Para tal,cada processo deve armazenar seus estados anteriores,
bem
como
os estados anteriores desuas entradas e as
mensagens
enviadasem
suas saídas, o quepode
constituiruma
massa
de dados considerável [Jef85].
TVG
(Tempo
Virtual Global)
Para
armazenar
todas asmensagens
enviadas e os estados anteriores assumidos pelosprocessos é necessária
uma
quantidade significativa de memória, o quepode
tornar inviávela simulação de grandes modelos.
Vimos
nas estratégias pessimistas queem
um
dado
instante amensagem
mais anti-ga
em
esperaem
toda a simulaçãopode
ser tratadasem
risco de violar a causalidade.Com
base nessa constataçãopode
ser estabelecidoum
valor detempo
simulado,chamado
“Tempo
Virtual Global”(TVG),
abaixodo
qual os estados dos processos e os envios demensagens
são estáveis, e portantopodem
ser descartados.O
TVG
é calculado periodicamente levando-seem
conta os relógios locais dos processose as estampílhas das
mensagens
e anti-mensagens não tratadas ouem
trânsito.2.7
Conclusão
Este capítulo apresentou os principais tópicos referentes a simulaçao
em
ambientes dis-tribuídos.
Para
fazer isso foram apresentados os dois princípios queregem
todo sistemafísico, e que deverão ser respeitados ao longo de toda simulação: o determinismo e a
causalidade.
Foram
mostradostambém
os dois tipos de modelos de simulação existentes:o contínuo e o discreto. Dentro
da abordagem
discreta vimos as formas de converter ossistemas
em
estudoem
modelos de simulação.Vimos
quepodemos
fazer isso deuma
forma
orientada a eventos, ou orientada a processos.É
necessário controlarcomo
otempo
simulado é avançado dentro deuma
simulação.através do
tempo
ou dos eventos do sistema.Na
abordagem
coordenada pelos eventosexiste
um
mecanismo normalmente
utilizado para garantir o respeito à causalidade: oescalonador.
Com
essa base prontapudemos
expandir nosso estudoem
direção ao nosso objetivo: asimulação ocorrendo
em
ambientes distribuídos. Foi apresentado omodelo
queadotamos
no
nosso trabalhoem
termos de processos comunicantes através de troca de mensagens.Esse
modelo
servirá de base aos demais capítulos.Vimos
que omaior
problema nesse tipo de simulação é a garantia do respeito ã causa-lidade, já que
na
ausência deum
relógio únicodevemos
nos preocuparcom
o sincronismoentre os processos.
Na
busca de soluções vimos quais as abordagens existentes: a simu-lação síncrona e a assíncrona.
Dentro
da
simulação assíncronamostramos
a existência de duas abordagens diferentespara tentar garantir a causalidade: as estratégias otimistas e pessimistas.
Vimos
sucin-tamente
como
ométodo
otimista funciona e quais os pontos principais nessa abordagem.Na
abordagem
pessimista vimos quais os tópicos de maior importância para semanter
acoerência dentro de
uma
simulação.Vimos
como
tentar resolver o problema do bloqueioatravés
da
prevençãoda
ocorrência domesmo
mantendo
os relógios dos canais sempreatualizados.
No
capítulo a seguir veremoscomo
uma
simulaçãopode
serimplementada
através de linguagens orientadas a objetos.Veremos
quais a formas adotadas para isso, e qualescolhemos para o nosso trabalho. Será então mostrado
como
a simulaçãopode
ser de-Simulação
Orientada
a
Objetos
3.1
Introdução
No
capítulo anteriorestudamos
os conceitos fundamentaisda
simulação por computador,seus
mecanismos
básicos e a implementação destes.Abordamos
também
os principaisproblemas associados a simulação distribuída e algumas soluções propostas
na
literatura.Neste capítulo
devemos
considerar a simulação distribuída ocorrendoem
uma
plataformaorientada a objetos.
É
inegável ebem
conhecido o conjunto de facilidades queobtemos
com
aprogramação
orientada a objetos: o encapsulamento, o reaproveitamento de código, o
polimorfismo
entre outras.
A
aceitaçãoda programação
orientada a objetos é tão grande hojeem
dia, que já existem ambientes de desenvolvimento para praticamente todos os sistemas
operacionais.
O
uso de objetosem
simulações a eventos discretos não é recente, muito pelo contrario.Esse
paradigma
tem
suas próprias origensna
necessidade de modelar detalhadamente enti-dades
do
mundo
real para fins de simulação. Prova disto é a linguagem Simula[BDMN73],
a primeira a incorporar os conceitos de classes, objetos,
métodos
e atributos.No
decorrer dos últimos anos a orientação a objetos se tornouuma
poderosa ferramentade
programação
geral, trazendo benefíciostambém
para o contextoda
simulação.3.2
Simulando
com
Objetos
O
usoda programação
orientada a objetosna
construção de simulações a eventos discretosé bastante simples e intuitivo. Nesse contexto, entidades reais são
modeladas
por objetos,que pertencem a determinadas classes, de acordo
com
suas características e funcionalida-Assim
como
no
sistema real existem entidades ativas (como robôs, carrinhos, etc.) epassivas
(como
depósitos, bufiers, etc.), no ambiente de simulaçãodevem
existir objetosativos e passivos.
A
possibilidade de existência de mais deum
objeto ativona
simulação(o que é a situação normal) leva à necessidade de suporte a concorrência entre objetos
no
ambiente de simulação. Desta forma, ao contrário dos ambientes genéricos de
programação
a objetos, o ambiente de
programação
de simulações orientadas a objetos deve proverfacilidades para a gestão
da
concorrência entre objetos,como
suporte a threads, semáforos,etc.
Da
mesma
forma
queem
uma
simulação a eventos discretos clássica,em
um
ambienteseqüencial de simulação orientado a objetos, estes
também
estão sob o controle deum
escalonador. Esse
mecanismo
se encarrega de ativar os objetos de acordocom
a evoluçãodo
tempo
simulado, demodo
a preservar o princípio de causalidade.Em
um
dado
instante,o objeto
em
execuçãopode
solicitar a execução ou suspensão de outros objetos ativos,manipular objetos passivos e finalmente suspender-se à espera de
uma
reativação futura.Normalmente
encontramos duas abordagens para construçao de ambientes de simu- lação orientados a objetos:o Linguagens especzficas. Nesta
abordagem
é desenvolvidauma
nova linguagem deprogramação, estendendo-se
uma
já existente ou criando-seuma
inédita. Esta abor-dagem tem
avantagem
de que o compiladorou
o pré-processadorpode
prover veri-ficação estrita de tipos, geração de código otimizado, etc. [MB95].
Como
exemplodessa
abordagem
podemos
citar a linguagen Simula[BDMN73].
o Bibliotecas especializadas. Nesta
abordagem
constrói-seuma
biblioteca de funçõesespecíficas à simulação, a partir de
uma
linguagem padronizada ebem
conhecida.As
principais vantagens destemodelo
são que oprogramador
não precisamudar
oseu ambiente de programação, e,
em
princípio,uma
maior variedade de plataformasfísicas de execuçao
pode
ser considerada.Como
exemplos dessaabordagem
podemos
citar as bibliotecas
C++SIM
[Uni94] eCNCL
[JSB+96],ambas
baseadasem
C++.Na
seqüência deste textovamos
apresentarcom
mais detalhesC++SIM,
uma
típicabiblioteca para a
programação
de simulações a eventos discretos orientadas a objetos.C++SIM
éuma
biblioteca simples,mas
poderosa e flexível, e será de grande importânciapara o desenvolvimento do nosso trabalho,
como
veremos no capítulo 5.3.2.1
C++SIM
A
bibiliotecaC++SIM
[Uni94] foi construídaem
C++, no contexto do projeto Arjunaø Facilidade de aprendizado e uso.
As
classes são simples e de fácil entendimento.o Correta abstração.
Como
amesma
é construídaem
C++
não existe diferença entreo
paradigma
usado nomodelo
a ser simulado e o da biblioteca.o Flexibilidade e extensibilidade.
É
possível acrescentar novas classes, além de modi-ficar as já existentes.
ø Eficiência.
Como
é geradoem
C++, o código final é rápido e depequeno
tamanho.e Portabilidade.
O
código fonteda
biblioteca é disponível epode
ser facilmentecom-
pilado para
uma
variedade de sistemas operacionais.A
grandevantagem
dessa biblioteca é a construção do ambiente de simulação basea-da
em uma
hierarquia de classes.Com
isso pode-se modificar qualqueruma
das suas propriedadescom
a alteração de poucos itens.A
bibliotecaC++SIM
se baseia nos conceitos apresentados pela linguagem Simula[BDMN73].
A
simulação éformada
por objetos ativos, que são instâncias de classesem
C++.
Cada
objeto ativo nomodelo
possuiuma
thread associada à sua execução, o quepermite usar o conceito de multithreads
com
certa transparência.Na
modelagem
deum
sistema usando a bibliotecaC++SIM,
esta fornece as classesbásicas para a
modelagem,
e o usuário precisa então definir as classes quemodelem
osistema a ser simulado.
As
classes básicascontém
osmétodos
principais para controlartodo o processo de simulação. Para construir o
modelo
a ser simulado o usuário deveentão definir, a partir das classes básicas, novas classes que irão
compor
aimagem
domodelo
real.A
figura 3.1na
página 20 mostraum
esquema
explicativodo
processo demodelagem.
A
simulação será executada peloprograma
resultanteda
compilação das classes básicascom
as definidas pelo usuário. Assim, a classemain
resultante dessa compilação iráiniciar o processo de simulação, através da instanciação dos vários objetos que
formam
omodelo
a ser simulado. Durante a simulação, objetos poderão ser criadosou
destruídos,dependendo
domodelo
em
execução.Ao
finalda
simulação todos os objetosda
simulação são destruídos e o controle é retornado à. classe main.A
bibliotecaC++SIM
écomposta
porum
conjunto reduzido de classes, cujos elementosprincipais apresentaremos
na
seqüência do texto. Para ajudarna
compreensão a figura3.2,
na
página 21, mostraum
esquema
com
a relação de herança entre as principais classesI
Classes Básicas da Biblioteca
C++SIM
Í
Classes do modelo
a ser simulado
(definidas pelo usuário)
Classe Main do Modelo
L
Compilação
Programa de Simulação
(executável)
Figura 3.1:
Modelagem
de processosProcessos
-Classe Process
A
classe Process é a responsável pela definição de todas as entidades participantesda
simulação, aqui
também
chamadas
de “processos”. Nesta biblioteca, cada entidade ativapossui
uma
thread independente associada aomesmo.
Isso proporciona a noção de ati-vidade necessãria para a divisão
da
simulaçãoem
processosl.A
classe Process define osestados possíveis que
um
processopode
assumir a qualquer instante da simulação [Uni94]:o Ativo.
É
o processo que esta sendo executado nomomento.
Este, antesda
suaexecução, estava
na
“cabeça”da
fila do escalonador.ø Suspenso.
É
o processo que estána
fila de eventos do escalonador. Este se tornaráativo
no
tempo
de ativaçao correspondente constantena
fila.o Passivo.
É
o processo que não está na fila de eventos. Este não será executado amenos
que outro processo o coloque de voltana
fila.ø Terminado.
E
o processo que não está na fila de eventos enem
possui mais ações aserem executadas. Este não poderá mais ser ativado
na
simulação atual.1 - ~ 1 I 1 I I . . ~
No
entantouma
simulaçaoem
C++SIM e constitutida porum
unico processo UNIX.A
divisaoem
Resource ~ Random
Stream
K
I<~IrI
Thread. Type SchedulerTrigger Queue Process
_
'_
_' S emaphore Objetos Ativos (definidos pelo usuário) EntztyFigura 3.2:
As
classes deC++SIM
São
também
definidos outrosmétodos
para controlar o estado deum
processo: verifi-cação
da
situação do processo (terminado ou passivo); reescalonamento do processo (nafila de eventos); cancelamento do processo; e ativação (ou reativação) de
um
processoem
qualquer posição do
tempo
simulado.Escalonador
-Classe
Scheduler
A
bibliotecaC++SIM
utiliza omesmo
paradigma
apresentado no capítulo 2 para controlarsua lista de eventos, ou seja, sob
uma
simulação a eventos discretos o escalonador controlaqual será. o
próximo
evento a se tornar ativo. Neste caso, os eventos correspondem àsfuturas reativações de processos suspensos.
A
partir domomento
em
queum
processo éreativado (executado), ele
pode
gerar outros eventos (pedidos de reativação de processos) que serão enviados para o escalonador e inseridos levando-seem
conta a data de ativação dos outros eventos já presentes.Quando
não houver mais eventosna
lista,ou
seja, a filade processos do escalonador estiver vazia, então a simulação sera concluída.
~
Funçoes
Aleatórias -Classe
Random
Stream
Para
a construção deum
modelo
de simulação énormalmente
necessario o uso de geradoresde
números
aleatórios para obtermosum
comportamento próximo da
situação real.de distribuição aleatória uniforme entre O e 1 (Rand0mS'tream), a partir
da
qual outrasclasses são definidas: Um`formStream, Ea:ponentz`alStream, NormalStream, etc.
Entidades Assíncronas
-Classe Entity
Em
muitas circunstâncias a execução deum
eventopode
estar condicionada não somentea
uma
data de ocorrência,como
vimos até agora,mas
também
a outras condições,como
o término
da
execução de outro evento, a liberação dealgum
recurso (semáforo), etc.Eventos dessa
ordem
podem
ocorrer a qualquermomento
notempo
simulado, e por issosão
chamados
“eventos assincronos”.O
mecanismo
básico do escalonador,como
visto até agora, nãotem
fiexibilidade sufi-ciente para tratar de
forma
eficiente eventos dessa natureza. Por esta razão, a bibliotecaO++SIM
estendeu a noção de processos de simulação, inerentemente síncronos, para en-tidades de simulação, cujo escalonamento
pode
depender de condições assíncronas.As
entidades são tratadas pelo escalonador
como
processos.Além
dos estados possíveis aosprocessos, as entidades
podem
assumir outros dois estados:0 Esperando.
O
processo está aguardando a ocorrência deum
evento específico paraser executado, que
pode
seruma
data determinada, o términoda
execução de outroprocesso, a liberação de
um
semáforo, ou outra condição especificada pelo usuário.O
processoem
espera não é colocadona
fila do escalonador,mas
em
filas especiaischamadas
“trigger qaeues”.Todos
os processos que esperam a ocorrência domesmo
evento são agrupados
em uma
mesma
trigger queue.Na
ocorrência do evento a aplicaçãopode
então optar por só “disparar” o primeiro processoda
fila ou todosos processos que estão
na
espera daquele evento.‹› Interrompido.
O
processo que outrora estavaem
estado de espera foi interrompidoantes que o evento pelo qual aguardava ocorresse.
Semáforos
-Classe
Semaphore
Para
queum
processoou
entidade consiga alocarcom
exclusividadealgum
recurso dis-ponivel
na
simulação, a bibliotecaO++SIM
coloca semáforos à disposição do modelo.Quando
um
processo tenta alocarum
recurso tentando pegarum
semáforo, e omesmo
se encontra indisponível, esse processo é suspenso automaticamente e colocado
na
trig-ger queue correspondente ao semáforo, até que este seja disponibilizado. Para tornar
um
semáforo disponível outra vez o processo que o alocou devechamar
um
método
para3.2.2
Uma
Simulação
em
C++SIM
IInicialmente todas as instâncias
da
classe Process se encontram no estado “passivo”, edevem
ser ativadas paratomar
parte na simulação. Essa ativação é responsabilidade doprimeiro objeto “processo” para o qual o controle é passado logo após a inicialização da
simulação.
Normalmente
a thread principal doprograma
de simulação criaum
processo controlador que é responsável por coordenar a execução da simulação inteira. Esse con-trolador cria e ativa todos os processos da simulação,
bem
como
o escalonador.O
mesmo
é
também
responsável pela definição demétodos
para a suspensão da thread principal,permitindo a execuçao e o encerramento da simulaçao.
Normalmente
o controlador deve possuir pelomenos
dois métodos:o Awatt. Esse
método
échamado
dentro da thread principal, suspendendo-a e trans-ferindo o controle para o processo controlador.
0 Exit. Esse
método
échamado
para o encerramentoda
simulação.Para
o encerramentoda
simulação deve-se suspender os processos que ainda estãoexecutando e retornar o controle para o processo controlador. Por sua vez, este limpa
o escalonador e suspende a execução deste. Feito isso, o processo controlador passa
os processos que estão
em
estado “suspenso” para o estado “terminado” e destrói asinstâncias desses objetos
na
memória.Após
isso o controle é passado para a threadprincipal para que esta termine o
programa
normalmente.Existem métodos
especiais para encerrar a simulação a qualquer instante. Essesmétodos
são úteisquando
existeuma
situação especial que possa causar o encerramen-to
da
execuçãoda
simulação.Além
disso, existem ainda classes extras para o controleestatístico e para a depuraçao dos modelos.
3.3
Simulando
com
Objetos
Distribuídos
Além
dosmecanismos
básicos necessários à. gestão de simulações a eventos discretos, aconstruçao de
um
ambiente de simulaçao orientada a objetos sobreum
contexto distri-buído possivelmente heterogêneo implica em:
‹›
Mapear
modelos expressosem
termos de objetos emétodos
auma
estrutura maisapropriada ã execuçao
em
um
contexto distribuído,como
processos e mensagens.0 Distribuir os objetos entre as diversas