Meddelanden
Meddelandesändning handlar om hur trådar (eller processer) kommunicerar
med varandra. Det här avsnittet tar upp defintioner och teorier, i
följande avsnitt avhandlas design och implementation.
Litteratur
Detta avsnitt behandlas ytterst knapphändigt kurslitteraturen. Sid
281-286 kan läsas som en (inte särskilt bra) introduktion till
meddelandehantering.
Vad är ett meddelande?
Trådar kan kommunicera med varandra genom att skicka meddelanden.
När en tråd skickar ett meddelande till en annan lämnar
den över datat i meddelandet till den mottagande tråden. Datat
ägs
alltså endast av en tråd i taget vid meddelandesändning.
Motsatsen är att två trådar delar datat och genom någon
listig form av synkronisering båda kan uppdatera och läsa om
vartannat. Detta senare är alltså inte meddelandesänsning.
Nu kanske frågan "Vad är det för skillnad på ett
meddelande och ett vanligt metodanrop?" dyker upp. Svaret är att det
inte behöver vara någon skillnad alls. Metodanrop är ett
sätt att skicka meddelanden, lika väl som det kan vara ett sätt
att hantera delat data.
På sid 286 i kursboken finns en uppräkning av vad ett meddelande
kan utgöras av. Några exempel är:
-
Parametrar vid metodanrop Om meddelandet skickas genom ett enkelt
metodanrop kan det naturligtvis bestå av alla typer som kan vara
aktuella parametrar. I Java är det dels primitiva typer som int,
char,
double
och dels objektreferenser.
-
Händelseobjekt Denna metodik används till exempel vid
händelsehanteringen i AWT. Meddelandet består av ett objekt
som beskriver händelsen (till exempel ett ActionEvent om användaren
klickat på en knapp).
-
Class-filer Meddelandet kan bestå av en class-fil som mottagaren
ska exekvera. Denna metodik används bland annat när en applet
ska startas.
-
Begäran om metodanrop Det som skickas är namnet på
en metod som finns hos mottgaren och de aktuella parametrarna till metoden.
Mottagaren utför anropet av metoden med de angivna parametrarna. Detta
är ett vanligt sätt att anropa distribuerade objekt, där
mottagaren finns i en annan dator eller i alla fall en annan process än
sändaren.
-
Exekverbara objekt Meddelandet består av till exempel ett
Runnable-objekt som mottagaren ska exekvera.
Ett annat sätt att kategorisera meddelanden är som referenskopiering
eller värdekopiering, dvs om det som skickas är en pekare eller
det pekaren pekar på. Den övre bilden visar referenskopiering.
I det fallet kopieras endast pekaren (referensen) till datat. Både
sändare och mottagare kommer att ha referenser till samma data vilket
ger upphov till en kritisk sektion. Den undre bilden beskriver värdekopiering
vilket innebär att en kopia av hela datat skapas. Sändare och
mottagare kommer då att lokalt ha en egen uppsättning av datat.
Adressering
Två huvudtyper av adressering kan särskiljas: direkt och indirekt.
Vid direkt adressering känner sändaren till mottagarens adress,
till exempel dess processid eller nätverksadress. Meddelandet kan
då skickas direkt till mottagaren. Vid indirekt adressering skickas
meddelandet via någon sorts mellanstation. Olika typer av mellanstationer
är brevlåda, port och kanal (pipe på engelska). Brevlådan
karaktäriseras av att flera processer kan både lägga meddelanden
i den och hämta meddelanden ur den. Till en port kan flera processer
skicka meddelanden men endast en kan ta emot och med en kanal slutligen
kan endast en process skicka och endast en ta emot.
Semantik
Synkron sändning (rendezvous)
Enkel synkron sändning (övre bilden) innebär att
sändare och mottagare väntar in varandra så att båda
samtidigt befinner sig på den punkt i exekveringen där överlämnandet
av meddelandet sker. Dubbel synkron sändning (undre bilden)
innebär att sändaren väntar tills mottagaren returnerar
någon form av kvittensmeddelande.
Asynkron sändning
Asynkron sändning innebär att sändaren kan sända
när som helst och hur ofta som helst utan att bry sig om ifall meddelandena
över huvud taget tas emot. Flödeskontroll innebär
att mottagaren på något sätt kan meddela sändaren
att sluta eller börja sända. Används inte flödeskontroll
är det stor risk att meddelanden går förlorade på
grund av att mottagaren inte hinner med att ta emot dem.