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 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;
         }
       }