Home Papers Reports Projects Code Fragments Dissertations Presentations Posters Proposals Lectures given Course notes
<< 4. Java Remote Method Invocation (RMI)6. Transaction Basics in Borg >>

5. Borg; message passing, strong mobility, synchronization

Werner Van Belle1 - werner@yellowcouch.org, werner.van.belle@gmail.com

1- Programming Technology Lab (PROG) Department of Computer Science (DINF) Vrije Universiteit Brussel (VUB); Pleinlaan 2; 1050 Brussel; Belgium

Abstract :  These are course notes I made to teach distributed systems for the VUB. I used these in 1998-1999; 1999-2000. These were mainly based on the research I conducted at that time.

Reference:  Werner Van Belle; Borg; message passing, strong mobility, synchronization;
See also:
An old copy of the Borg site when it was operational


Borg

Praktisch

De volgende reeks oefeningensessies is vooral gericht op Borg, een gedistribueerde pico variant ontwikkeld op PROG. Er zijn versies runnende onder Windows NT, 98, 95 en Linux (De linux versie is ontwikkeld door Koen Bailleul, contacteer hem hiervoor indien nodig). Documentatie in verband met pico kan u vinden online op http://pico.vub.ac.be.

Info

Onderstaand is een beschrijving van de gedistribueerde pico interpreter, genaamd Borg, dewelke op Prog ontwikkeld is. Het is een interpreter waarbinnen verschillend processen een eigen code en data space hebben. Alle natives steken in de wortel-omgeving van de interpreter. Elk proces dat gecreeerd wordt word in een eigen environment gestart.

Elke window die gecreeerd wordt instantieert twee ‘agents’. De eerste agent is de user interface agent. (blijft vast op de gegeven machine), de tweede agent is de ‘denk’ agent. Deze agent kan migreren naar andere plaatsen (die een Borg agent systeem draaien).

Objecten

Objecten worden in dit systeem gecreeerd als volgt

Makepoint(x,y)::
  {
  Getx()::x;
  Gety()::y;
  Setx(nx)::x:=nx;
  Sety(ny)::y:=ny;
  Clone()
  }

Afstammen van objecten gebeurt als volgt (de code spreekt voor zich)

Makepoint(x,y)::
  {
  Getx()::x;
  Gety()::y;
  Setx(nx)::x:=nx;
  Sety(ny)::y:=ny;
  MakeSquare(w)::
    {
    GetW()::w;
    SetW(nw)::w:=nw;
    Clone()
    };
  Clone()
}

Agents

Een proces kan gecreeerd worden (in de grafische werkomgeving althans) door op new te klikken of door een file open te doen en een agentname in te tikken (Voor de duidelijkheid een agent is bij ons een proces met eigen code en data space. Dus in dit geval refereren naar een proces of naar een agent is hetzelfde.)

Bij de creatie van een proces wordt een naam geassigned aan het proces. Deze naam wordt gebruikt om te refereren naar het proces. Bv: "tecra/ses1". Achter elke Borg interpreter steekt een module die berichten van het ene proces naar het andere kan doorgeven. Deze module (router) wordt bij het starten van het systeem geinitialiseerd met een ini file. Deze ini file bevat de naam van de interpreter en eventueel een referentie naar een forwarding router zodat men een interconnectie van interpreters kan maken.

Message handling

Messages kunnen van proces tot proces gestuurd worden door eerst te refereren naar de communicatiepartner en een call te doen alsof men tegen een object praat. Bijvoorbeeld: Om een bericht te sturen naar een proces genaam "tecra/ses2":

A:remotedict("tecra/ses2")

A.display(200)

Gelieve op te merken dat calls naar remote processen altijd asynchroon zijn. Als de selector van een message send een remote dictionary is zal de call onmiddelijk void retourneren. De pararamters die meegegeven worden aan dergelijke call worden automatiusch geserialiseerd en gedeserialiseerd. Aangaande het serializeren van berichten tussen agents:


Zender

Draad

Ontvanger

Integer

Network integer

Integer

String

String

String

Identifier

String met identifier tag

Identifier

Lokale Dictionary

Referentie naar dictionary binnen proces

Referentie naar remote dictionary binnen het zendende proces

Referentie naar een afgelegen dictionary

Referentie naar afgelegen dictionary

  • als deze referentie refereert naar mezelf -> wordt de echte dictionary,

  • als de referentie niet referereert naar mezelf -> blijf gewoon een remote reference

Callbacks & Continuation Passing Style

Aangezien alle functie calls asynchroon zijn: leg uit hoe men toch antwoorden kan terugsturen… Geef een voorbeeld in de praktijk.

Zoals in de opgave van de nameserver al gebleken is hebben we vaak een probleem met het terugsturen van berichten in een asynchrone omgeving. Hoe kunnen we dit opvangen op een ietwat mooiere methode ? Wat zijn de problemen daarvan ? (CPS)

Answer: Callbacks:

Agent Tecra/ses1
----------------

Calculate(...,callback)::
  {
  <some calculation>;
  callback.Answeris(...)
  }
  
Agent Tecra/ses2
----------------

Answeris(...)::
  { 
  display("The answer is: ");
  display(result) 
  };

agent: remotedict("Tecra/ses1");
agent.Calculate(#,agentself())

Nameserving

Zoals reeds duidelijk is moeten we telkens als we refereren naar een ander proces zelf een remote dictionary maken. Dit is iets wat straight forward gebeurt doch toch zijn nadelen heeft. Als we bijvoorbeeld onze code op een andere machine (met een andere naam starten) moeten we deze referentie aanpassen. Daarom zou het handig zijn een nameserver te gebruiken aan wie we steeds het adres van een agent kunnen vragen. Schrijf dergelijke nameserver in Borg.

Bespreek hoe we de bovenstaande nameserver kunnen integrereren in de Borg infrastructuur zodat we weer wat minder code moeten schrijven.

Migratie

Een mogelijkheid die Borg bied is het serializeren van processen en deze processen tijdens de loop van hun executie te migreren naar andere machines. Migratie wordt als volgt ondersteund:

Calcul(pars)::
  { 
  <some calculation>;
  display("before moving");
  agentmove(remotedict("otherplace.tecra"));
  display("after moving") 
  }

main(pars,callback)::
  callback.Answeris(calcul(pars))

Oefening 1:

Ontwerp een broadcasting service waarbij events gerepeat worden naar de gejoinde clients. (een whiteboard systeem zodoende)

Oefening 2:

Pas deze broadcast service aan zodat we aan de event service een aktieve filter kunnen meegeven die migreert naar de host die de broadcasting service runt.

Synchronisatie

We willen een 'sync' implementeren die syncroniseert tussen verschillende agents en pas verder werkt op het ogenblik alle agents gesyncronissert zijn. Hoe kan dit geimplementeerd worden. (bespreek het protocol). Breid dit protocol uit zodat er data over de sync gestuurd kan worden. Schrijf dergelijke primitieve in pico.

http://werner.yellowcouch.org/
werner@yellowcouch.org