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:

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.