Hoofdprogramma
// create a new simulation model
Model model = new Model
("network");
// create all processes
NetworkComponent[]
network_processes = new NetworkComponent[NBR_PROCESSES] ; //
NetworkComponent is a child of Process
for (int i = 0; i <
NBR_PROCESSES; i++)
{
network_process[i] = new NetworkComponent( ... component parameters ...
);
model.AddProcess(network_process[i]);
}
// connect the processes with
channel
NetworkConnection conn = new
NetworkConnection(network_process[0], network_process[1], bandwidth);
// NetworkConnection is a child of Channel, bandwidth is a parameter of
the channel
model.AddConnection(conn);
... more connections ...
// Show model
ModelVisualisation modelvis = new
ModelVisualisation(model); // a subclass of JPanel
getContentPane().add("Center", modelvis);
repaint();
// Start Simulation
model.StartSimulation();
De gedragsfunctie van een proces
Het gedrag van een proces bepaald hoe hij reageert op
een inkomend event.
Het event komt binnen via een inputchannel
en op een zeker tijdstip (de timestamp).
Dit event kan:
- de staat van het proces
veranderen (de attributen van het object)
- het event via een
outputchannel doorsturen, met het tijdstip dat het event aankomt in het
volgende proces.
- een nieuw event creeren
en via een outputchannel doorsturen. Dit event kan van een
zelf-gedefinieerde event-subklasse zijn, met extra attributen
De gedragsfunctie is dus van die aard:
public void f(event e, timestamp t, int inputChannel)
{
mDelay = ...; //
attribute of specific process
sendToOutput(e, t +
mDelay, outputChannel);
EventType1 myEvent =
new EventType1( ... parameters ...);
sendToOutput(myEvent, t + mDelay,
outputchannel);
}
Een proces heeft natuurlijk een constructor waarin de parameters worden
ingesteld en een proces 'weet' ook hoeveel input- en outputchannels hij
heeft.
Voorbeeld van een proces:
NetworkComponent & NetworkConnection
Let op: deze code is niet
volledig, sommige dingen kan je niet onmiddellijk zo simpel doen als
het hier staat. Ik hoop dat je daar zelf achter komt.
public
void f(event e, timestamp t, int inputChannel)
{
// 1. is event aangekomen?
if (e.mDestination == mMyID)
{
delay = e.mDepartureT - t; // hoe
lang het event onderweg was
...
}
// 2. event routing:
bepalen naar welke outputchannel het event moet
else
{
// gegeven:
e.mDestination // waar het event naar
toe moet
mNbrOutputChannels
int output_channel = ... // te bepalen
mbv routing-algoritme
// 3. naar het volgend proces sturen: bepalen wanneer hij daar
aankomt
Wanneer komt het eventje aan in het volgend proces? Als de
connectie vrij is, is de delay van het pakket zijn grootte gedeeld door
de bandbreedte. Als de connectie nog niet vrij is, wordt het pakketje
gebufferd en pas opgestuurd als alle vorige aangekomen zijn. Maar voor
de simulatie, moeten we het bufferen niet uitvoeren, we kunnen immers
al voorspellen wanneer het gaat aankomen, nl. de tijd dat de buffer
leeg gaat zijn plus de pakketdelay. Je mag uitgaan van een oneindige
buffer. Merk op de dat de bandbreedte in feite een eigenschap is van de
channel en we die dus als attribuut van een NetworkConnection-channel
definieren (zie ook hoofdprogramma).
int event_arrival_time;
if (t >
mPreviousEventArrivalTime)
// the previous event has arrived: the
channel is free
{
event_arrival_time = t + e.mDataSize / mOutputChannels[output_channel].mBandwidth;
}
else
{
event_arrival_time = mPreviousEventArrivalTime + e.mDataSize / mOutputChannel[output_channel].mBandwidth;
}
SendToOutput(e, event_arrival_time, output_channel);
mPreviousEventArrivalTime = event_arrival_time;
}
}