• Nenhum resultado encontrado

Estruturas para recolha de dados e estruturas auxiliares

5.4 Projecto do programa de simulação

5.4.5 Estruturas para recolha de dados e estruturas auxiliares

As três estruturas principais implementadas para a obtenção e registo das estatís- ticas são MBStatBase, a sua derivada KodStats e a classe KStatsGenerico de- rivada desta última. A classe MBStatBase define apenas funções virtuais puras, tendo apenas função de interface para as classes derivadas. A classe KodStats

implementa quase todas as funções de MBStatBase, excepto duas, que são im- plementadas pela classe KStatsGenerico. O objecto ModuloBaseTabelas pos- sui um ponteiro para MBStatBase, mas como a esse ponteiro é atribuída uma instância de KStatsGenerico, quando ModuloBaseTabelas invoca uma função a que é executada é a de KStatsGenerico, ou a de KodStats no caso de não ter sido redefinida em KStatsGenerico (polimorfismo).

Para obtenção das estatísticas escalares foram necessários os objectos auxiliares TimedValue, TimedValueCL e VecTimeValueCL. TimedValue é um objecto es- tatístico que permite calcular valores correspondentes à média de uma medida, ponderada pelos intervalos de tempo que decorrem entre as recolhas de cada va- lor dessa medida. TimedValueCL é um vector de objectos TimedValue em que é guardado um valor da medida por CT e um valor correspondente ao agregado dos CT. Desta forma o número de elementos do vector TimedValueCL é igual ao número de CT mais um. Finalmente, VecTimeValueCL é um vector de objectos TimedValueCL, geralmente com tantos elementos quantos os ramos da rede. Na prática este vector é utilizado para armazenar medidas por ramo da rede ou por esquema de recuperação.

O registo das estatísticas vectoriais implicou a definição do objecto auxiliar OutVec, derivado do objecto cOutVector da biblioteca de classes do OMNeT++, e que permite o registo de valores através da função membro record de cOut- Vector.

Vários métodos da classe KodStats são responsáveis por registar no ficheiro de saídas vectoriais atributos do tipo OutVec, recorrendo à função regista, ou responsáveis por coligir valores dos atributos escalares, dos tipos TimedValue, TimedValueCL ou VecTimeValueCL, que no final da simulação serão registado no ficheiro de saídas escalares. A classe auxiliar largBandaStats foi também usada para registar valores estatísticos relativos à alteração da ocupação de LB.

Suporte para reservas, ocupações e múltiplos BCM

A informação da rede que deverá ser partilhada por todos os esquemas de re- cuperação e restante código é armazenada na classe InformacaoRede ou em instâncias de outras classes que podem ser acedidas através desta. Esta informa- ção inclui a topologia (carregada aquando do início da simulação) e as ocupações efectivas de cada ramo em cada instante. Estas informações são armazenadas di- rectamente em especializações do ModeloRestricaoLarguraBanda, mas tam- bém são agregadas em estruturas de dados específicas de alguns esquemas, como Delta_IJ_UV.

As ocupações dos ramos da rede são mediadas por um BCM. Estes foram implementados através de especializações da classe ModeloRestricaoLargu-

raBanda, designadas MRLB_MAM e MRLB_MAR. Estes tratam de armazenar

e gerir informação sobre as ocupações de cada ramo considerando as restrições associadas a cada CT. Permitem também receber informação sobre a disponibili- dade actual de LB em cada CT de acordo com essas restrições (e de acordo com as reservas RSVP activas).

A classe ReservaRSVP corresponde a uma implementação simplificada do RSVP. Implementa as funções associadas a reservas de caminhos simples (Reser-

vaCaminhoActivoUniforme, ReservaCaminhoRecuperacaoUniforme, liber-

taCaminhoActivoUniforme e libertaCaminhoRecuperacaoUniforme) e as

associadas às reservas de conjuntos de ramos não uniformes – necessários para suportar partilha de LB de protecção (reservaCaminhoRecuperacaoNaoUni-

forme e libertaCaminhoRecuperacaoNaoUniforme). Além destas funções

existem também funções auxiliares para obter o número de reservas RSVP ten- tadas, conseguidas e falhadas. Na implementação actual em geral todas as re- servas RSVP tentadas são conseguidas, uma vez que os esquemas verificam a ocupação/reserva antes de tentar fazer novas reservas, e que não há passagem de tempo entre as reservas dos vários ramos de um caminho.

As reservas possuem uma identificação, através da qual é possível saber em que ramos foi feita reserva e de que valor. A função ReservaCaminhoActivoU-

niforme permite fazer a reserva para o CA. Neste caso os ramos a reservar

formam um caminho (o nó em que um ramo termina é o início do ramo seguinte do caminho) e a LB necessária é a mesma em todos os ramos (tratando-se de uma reserva bastante simples). A função ReservaCaminhoActivoUniforme chama a função reservaCaminhoU que por sua vez irá utilizar o BCM para fazer a re- serva efectiva da LB (ocorre alteração das estruturas de informação do BCM, no respeitante ao CT em causa).

As reservas de LB associadas a CR que partilham LBP são geridas usando re- servas fictícias, uma vez que o valor a reservar por ramo pode ser diferente entre eles e os ramos a reservar podem não constituir um caminho. Estas questões são tratadas pelas reservas não uniformes. Para o conseguir, altera-se na prática um conjunto de reservas “reais” que já existem (uma por ramo) em função das modificações necessárias. É criada também uma nova reserva “fictícia” na qual são indicados todos os ramos efectivamente usados pelo caminho com um valor de LB zero (simplesmente para manter o registo de recursos usados). Para além de muitas reservas “fictícias” podem existir vários conjuntos de reservas “reais” simultaneamente, a cada um dos quais corresponde uma assinatura. Esta situa-

ção ocorre quando tivermos simultaneamente vários esquemas que precisem de fazer reservas não uniformes que são manipuladas independentemente. Estas reservas complexas são criadas pelo método reservaCaminhoRecuperacaoNa-

oUniforme.

As funções de libertação de recursos podem simplesmente libertar a LB em ca- minhos uniformes anteriormente reservados (libertaCaminhoActivoUniforme,

libertaCaminhoRecuperacaoUniforme). Pode também ser necessário liber-

tar reservas não uniformes (é o caso de libertaCaminhoRecuperacaoNaoU-

niforme) e nesse caso as variações a fazer nas reservas devem ser calculadas

previamente, fora da função, uma vez que não podem geralmente ser inferidas das reservas anteriores.