Models of Concurrency Martin Steffen 1 University of Oslo, Norway INF3140 Høst 2007
Dagens program Mer asynkron meldingsutveksling Interagerende prosesser med ulike kommunikasjonsmønstre Oppsummering av erfaringer Remote procedure call ( RPC ) Hva RPC er Eksempler: klokketjener, strømfletting, verdi-ombytting Rendezvous Hva rendezvous er Eksempler: buffer, klokketjener, verdi-ombytting Kombinasjoner av RPC, rendezvous og meldingsutveksling Eksempler: Begrenset buffer, lesere og skrivere Martin Steffen (UiO) Models of Concurrency 2007 2 / 32
Interagerende prosesser: ombytting av verdier Studerer prosesser som likemenn (eng. peers ). Bruker følgende modellproblem: Gitt n prosesser P[0],..., P[n 1], n > 1 Hver prosess har et tall lagret i lokal variabel v Mål: alle prosesser skal få vite største og minste tall Sammenligner og vurderer ulike kommunikasjonsmønstre: Martin Steffen (UiO) Models of Concurrency 2007 3 / 32
Interagerende prosesser: ombytting av verdier Studerer prosesser som likemenn (eng. peers ). Bruker følgende modellproblem: Gitt n prosesser P[0],..., P[n 1], n > 1 Hver prosess har et tall lagret i lokal variabel v Mål: alle prosesser skal få vite største og minste tall Sammenligner og vurderer ulike kommunikasjonsmønstre: P 5 P 4 P 5 P 4 P 5 P 4 P 1 P 0 P 3 P 0 P 3 P 0 P 3 P2 P 1 P 2 P 1 P 2 sentralisert symmetrisk ringformet Martin Steffen (UiO) Models of Concurrency 2007 3 / 32
Sentralisert løsning: kommentarer P 5 P 4 P 1 P 0 P2 P 3 Prosess P[0] er koordinator : P[0] gjør beregningen, dvs. finner største og minste tall. De andre prosessene bare sender sine tall og venter på svar fra P[0]. Telling av utvekslete meldinger: Ett send receive-par per melding nok å telle antall send: P[0]: n 1 P[1],..., P[n 1]: (n 1) 1 Totalt (n 1) + (n 1) = 2(n 1) meldinger utvekslet n kanaler nødvendig. Martin Steffen (UiO) Models of Concurrency 2007 4 / 32
Sentralisert løsning: kode chan values ( i nt ), r e s u l t s [ 1.. n 1]( i n t smallest, i nt l a r g e s t ) ; process P [ 0 ] { # koordinator prosess i nt v =... ; # anta v i n i t i a l i s e r t i nt new, s ma llest = v, l a r g e s t = v ; # i n i t i a l i s e r i n g # faa tak i v e r di e r og l agre s t o e r s t og minst for [ i = 1 to n 1] { r eceive values (new ) ; i f (new < s m allest ) s ma llest = new ; i f (new > l a r g e s t ) l a r g e s t = new ; } # send r e s u l t a t e t t i l de andre prosessene for [ i = 1 to n 1] send r e s u l t s [ i ] ( smallest, l a r g e s t ) ; } process P[ i = 1 to n 1] { i nt v =... ; i nt smallest, l a r g e s t ; send values ( v ) ; r e ceive r e s u l t s [ i ]( smallest, l a r g e s t ) ; } # Fig. 7.11 i Andrews ( l i t e problem r e t t e t ) Martin Steffen (UiO) Models of Concurrency 2007 5 / 32
Symmetrisk løsning: kommentarer P 5 P 4 P 0 P 3 P 1 P 2 Single-program, multiple data ( SPMD ) -løsning: Hver prosess utfører samme program og kommuniserer resultatet til alle andre. n prosesser som hver sender n 1 meldinger, dvs. totalt n(n 1) meldinger utvekslet. n kanaler nødvendig Martin Steffen (UiO) Models of Concurrency 2007 6 / 32
Symmetrisk løsning: kode chan values [ n ]( i n t ) ; process P[ i = 0 to n 1] { i nt v =... ; i nt new, s ma llest = v, l a r g e s t = v ; # send v t i l de n 1 andre prosessene for [ j = 0 to n 1 st j!= i ] send values [ j ] ( v ) ; # faa tak i n 1 v er d i e r # og l agre s t oerst og minst. for [ j = 1 to n 1] { # j ikke brukt i loekka r eceive values [ i ] ( new ) ; i f (new < s m allest ) smallest = new ; i f (new > l a r g e s t ) l a r g e s t = new ; } } # Fig. 7.12 i Andrews Martin Steffen (UiO) Models of Concurrency 2007 7 / 32
Ringformet løsning: kommentarer P 5 P 4 P 0 P 3 P 1 P 2 Nesten symmetrisk, bortsett fra P[0], P[n 2] og P[n 1]. Hver prosess utfører samme program og sender svaret videre (hvis nødvendig). Teller antall send: P[0]: 2 P[1],..., P[n 3]: (n 3) 2 P[n 2]: 1 P[n 1]: 1 Totalt 2 + 2(n 3) + 1 + 1 = 2(n 1) meld. utvekslet. n kanaler nødv. Martin Steffen (UiO) Models of Concurrency 2007 8 / 32
Ringformet løsning: kode (1) chan values [ n ]( i n t smallest, i nt l a r g e s t ) ; process P [ 0 ] { # i n i t i a l i s e r utveklsingen i nt v =... ; i nt smallest = v, l a r g e s t = v ; # send v t i l neste prosess, P[ 1 ] send values [ 1 ] ( smallest, l a r g e s t ) ; # faa globale s ma llest og l a r g e s t f ra P[ n 1] # og send dem videre t i l P[ 1 ] r e ceive values [ 0 ] ( smallest, l a r g e s t ) ; send values [ 1 ] ( smallest, l a r g e s t ) ; } Martin Steffen (UiO) Models of Concurrency 2007 9 / 32
Ringformet løsning: kode (2) process P[ i = 1 to n 1] { i nt v =... ; i nt smallest, l a r g e s t ; # motta s ma llest og l a r g e s t saa langt, # og oppdater dem ved sammenlingning med v r e ceive values [ i ] ( smallest, l a r g e s t ) i f ( v < s ma llest ) s m allest = v ; i f ( v > l a r g e s t ) l a r g e s t = v ; # send r e s u l t a t e t t i l neste, og vent paa globalt r e s u l t a t send values [( i +1) mod n ]( smallest, l a r g e s t ); i f ( i < n 1) r eceive values [ i ] ( smallest, l a r g e s t ) ; # send glob. res. videre, men ikke f r a P[ n 1] t i l P[ 0 ] i f ( i < n 2) send values [ i +1]( smallest, l a r g e s t ) ; } # Fig. 7.3 i Andrews ( r e t t e t ) Martin Steffen (UiO) Models of Concurrency 2007 10 / 32
Erfaring med meldingsutveksling Meldingsutveksling velegnet for applikasjoner der prosesser kommuniserer enveis over én eller flere kanaler. Kan også lage klient-tjener-applikasjoner ved meld.utv., men: Hver klient må ha egen svarkanal Generelt: to-veis kommunikasjon må realiseres med 2 kanaler Gir mange kanaler RPC og rendezvous passer bedre for klient-tjener -applikasjoner. Martin Steffen (UiO) Models of Concurrency 2007 11 / 32
Remote Procedure Call: hovedidé kallende prosess paa maskin A kalt prosedyre paa maskin B op foo(formals); # deklarasjons... call foo(args); -----> proc foo(formals) # ny prosess lages... <----- end;... Martin Steffen (UiO) Models of Concurrency 2007 12 / 32
RPC (forts.) RPC kombinerer noen elementer fra monitorer og meldingsutveksling Som vanlig prosedyrekall, men kaller og kalt prosedyre kan være i ulike adresserom, f.eks. på ulike maskiner i nettverk. Kallerprosessen blokkerer til kalt prosedyre er ferdig, som ved monitor-kall og synkron meldingsutveksling. Asynkron programmering støttes ikke direkte. 1 En ny prosess håndterer hvert kall. Potensielt toveis kommunikasjon: kaller sender argumenter og mottar resultat. 1 Men: Creol... Martin Steffen (UiO) Models of Concurrency 2007 13 / 32
RPC: modul, prosedyre, prosess Modul : ny programmeringskonstruksjon for både prosedyrer, og prosesser. module M g r e n s e s n i t t for eksporterte operasjoner ; body v a r i a b e l d e k l a r a s j o n e r ; i n i t i a l i s e r i n g s k o d e ; prosedyrer for eksport erte operasjoner ; l okale prosesser ; end M Moduler kan være i ulike adresserom Prosedyrer og prosesser i M: kan dele variable utføres samtidig (eng. concurrent) må synkronisering for gjensidig utelukkelse kan kun kommunisere med prosesser i M ved prosedyrer eksportert av M Martin Steffen (UiO) Models of Concurrency 2007 14 / 32
RPC: operasjoner Deklarasjon av operasjon O: op O(formelle arg.) [ returns type ] ; Implementasjon av operasjon O: proc O(formelle arg.) [ returns variabel ] { lokale variabeldeklarasjoner; setninger } Kall av modul Ms operasjon O: call M.O(aktuelle arg.) Prosesser : som før. Martin Steffen (UiO) Models of Concurrency 2007 15 / 32
Eksempel: Klokketjener (RPC) Problem: Lage modul som tilbyr klokke-tjenester til prosesser i andre moduler. Klokketjeneren har to operasjoner synlige for klientprosesser: get time() returns int returnerer klokkeslettet delay(int interval) lar prosess sove i spesifisert antall tidsenheter Flere klienter dvs. flere prosesser kan utføre operasjoner samtidig behov for beskyttelse av variable. Klokketjeneren har en intern prosess som får avbrudd (eng. interrupts) fra en maskinvareklokke og oppdaterer sin klokke. Martin Steffen (UiO) Models of Concurrency 2007 16 / 32
Kode: Klokketjener (RPC 1) module TimeServ er op get time () returns i n t ; op delay ( i nt i n t e r v a l ) ; body i nt tod = 0; # k l o k k e s l e t t e t sem m = 1; # for gj e n s i d i g u telukkelse sem d [ n ] = ([ n ] 0); # for ventende prose sser queue of ( i nt waketime, i nt p r ocess i d ) napq ; ## naar m == 1, tod < waketime for ventende prosesser proc get time () r eturns time { time = tod ; } proc delay ( i n t i n t e r v a l ) { P(m) ; # anta myid unik og i [0, n 1] i n t waketime = tod + i n t e r v a l ; s ett inn ( waketime, myid) paa r e t t sted i napq ; V(m) ; P(d [ myid ] ) ; } process Clock.... end TimeServ er # vent paa aa b l i vekket Martin Steffen (UiO) Models of Concurrency 2007 17 / 32
Kode: Klokketjener (RPC 2) process Clock { i n t id ; s t a r t maskinvareklokka ; while ( true ) { vent paa avbrudd, og r e s t a r t maskinvareklokka tod = tod + 1; P(m) ; # mutex while ( tod >= minste waketime i napq) { f j e r n ( waketime, id ) fra napq ; V(d [ id ] ) ; } V(m) ; } } end TimeServer # Fig. 8.1 i Andrews ( f e i l r e t t e t ) # vekk prosess # mutex Martin Steffen (UiO) Models of Concurrency 2007 18 / 32
Rendezvous RPC: Tilbyr intermodul-kommunikasjon Programmeren må lage synkronisering eksplisitt Rendezvous: Kjent fra språket Ada (US DoD) Kombinerer kommunikasjon mellom og synkronisering av prosesser Lager ikke ny prosess ved kall. I stedet: gjør rendezvous med eksisterende prosess Operasjoner utføres én av gangen synch send og receive kan betraktes som primitiv rendezvous. Martin Steffen (UiO) Models of Concurrency 2007 19 / 32
Rendezvous: hovedidé kallende prosess paa maskin A kalt prosess paa maskin B op foo(formals);...... # eksisterende prosess call foo(args); -----> in foo(formals) -> BODY;... <----- ni Martin Steffen (UiO) Models of Concurrency 2007 20 / 32
Rendezvous: modul-deklarasjon module M op O 1 ( typer ) ;... op O n ( typer ) ; body process P 1 { v a r i a b e l d e k l a r a s j on e r ; while ( true ) in O 1 ( v a r i a b l e ) and B 1 > S 1 ;... [ ] O n ( v a r i a b l e ) and B 1 > S n ; ni }... andre prosesse r end M Martin Steffen (UiO) Models of Concurrency 2007 21 / 32
Rendevous: uttrykkssyntaks Kall: c a l l O i (expr 1,..., expr m ) ; Innputt-setning, serie av guarde de uttrykk: in O 1 (v 1,...v m1 ) and B 1 > S 1 ;... [ ] O n(v 1,... v mn ) and B n > S n ; ni Bestanddeler i guard: and B i synkroniseringsuttrykk (valgfri) S i setninger (1 eller flere) Variablene v 1,...,v mi kan refereres av B i og leses/skrives av S i. Martin Steffen (UiO) Models of Concurrency 2007 22 / 32
Rendezvous: semantikk for innputt-setningen Gitt følgende: in... [ ] O i (v i,..., v mi ) and B i > S i ;... ni Guard en slår til når O i kalles og B i sann (eller utelatt). Utførelse av in-setningen: Blokkerer til guard for en operasjon slår til Hvis flere guard er slår til, betjen det eldste kallet Verdier returneres til kaller Så er call- og in-setningene ferdige Martin Steffen (UiO) Models of Concurrency 2007 23 / 32
Eksempel: begrenset buffer (rendezvous) module BoundedBuf f er op deposit ( elem ), fetch ( r e s u l t elem ) ; body process Buffer { elem buf [ n ] ; i n t front = 0, rear = 0, count = 0; while ( true ) in deposit ( item ) and count < n > buf [ rear ] = item ; count++; rear = ( rear +1) mod n ; [ ] fetch ( item ) and count > 0 > item = buf [ front ] ; count ; f ront = ( front +1) mod n ; ni } end BoundedBuffer # Fig. 8.5 i Andrews ( modulo navn ) Martin Steffen (UiO) Models of Concurrency 2007 24 / 32
Eksempel: klokketjener (rendezvous) module TimeServ er op get time () returns i n t ; op delay ( i nt ) ; # NB: absolutt tid som argument op t i ck ( ) ; # k a l l e s ved timer s t y r t avbrudd body process Timer { i n t tod = 0; s t a r t maskinvare timer ; while ( true ) in get time () r eturns time > time = tod ; [ ] delay ( waketime ) and waketime <= tod > skip ; [ ] t i c k () > { tod++; r e s t a r t maskinvare timer &; ni } end TimeServer # Fig. 8.7 i Andrews Martin Steffen (UiO) Models of Concurrency 2007 25 / 32
RPC, rendezvous og meldingsutveksling Programmerer nå med blanding av primitiver: forespørsel håndtering effekt call proc prosedyrekall (RPC) call in rendezvous send proc dynamisk prosess-laging send in asynkron meldingsutveksling Martin Steffen (UiO) Models of Concurrency 2007 26 / 32
RPC, rendezvous og meldingsutveksling Programmerer nå med blanding av primitiver: forespørsel håndtering effekt call proc prosedyrekall (RPC) call in rendezvous send proc dynamisk prosess-laging send in asynkron meldingsutveksling i tilleg (ikke i Andrews) asynkron prosedyrekall, wait-by-necessity, futures Martin Steffen (UiO) Models of Concurrency 2007 26 / 32
Rendezvous, meldingsutveksling og semaforer sammenhenger Sammenligning av innputt-setning og receive: in O(a 1,...,a n ) -> v 1 =a 1,...,v n =a n ni receive O(v 1,...,v n ) Sammenligning av meldingsutveksling og semaforer: send O() og receive O() V(O) og P(O) Martin Steffen (UiO) Models of Concurrency 2007 27 / 32
Eksempel: begrenset buffer (igjen) module BoundedBuf f er op deposit ( elem ), fetch ( r e s u l t elem ) ; body elem buf [ n ] ; i nt front = 0, rear = 0; # l okale operasjoner som s imulerer semaforer op empty (), f u l l (), mutexd (), mutexf ( ) ; send mutexd ( ) ; send mutexf ( ) ; # i n i t. semaforer t i l 1 for [ i = 1 to n ] # i n i t. empty semaforen t i l n send empty ( ) ; proc deposit ( item ) { r eceive empty ( ) ; r eceive mutexd ( ) ; buf [ rear ] = item ; rea r = ( r ear +1) mod n ; send mutexd ( ) ; send f u l l ( ) ; } proc fetch ( item ) { r eceive f u l l ( ) ; r e ceive mutexf ( ) ; item = buf [ front ] ; front = ( front +1) mod n ; send mutexf ( ) ; send empty ( ) ; } end BoundedBuffer # Fig. 8.12 i Andrews ( modulo navn ) Martin Steffen (UiO) Models of Concurrency 2007 28 / 32
Primitivet?O i rendezvous Nytt primitiv på operasjoner, jf. empty(...) for bet.var. og kanaler.?o betyr antall utestående forespørsler på operasjon O. Nyttig i innputt-setningen for å gi prioritet: in O 1 (...) -> S 1 ; [] O 2 (...) and?o 1 == 0 -> S 2 ; ni Her prioriteres O 1 over O 2. Martin Steffen (UiO) Models of Concurrency 2007 29 / 32
Lesere og skrivere, beskyttet adgang module ReadersWriters op read ( r e s u l t types ) ; # bruker RPC op write ( types ) ; # bruker rendezvous body op s tartread (), endread ( ) ; # l o kale op.... databasen (DB )... ; proc read ( vars ) { c a l l s tartread ( ) ; # faa leseadgang... l e s vars fra DB... ; send endread ( ) ; # f r i g i DB } process Writer { i n t nr = 0; while ( true ) in s tartread () > nr++; [ ] endread () > nr ; [ ] write ( vars ) and nr == 0 >... s k r i v vars t i l DB... ; ni } end ReadersWriters Martin Steffen (UiO) Models of Concurrency 2007 30 / 32
Lesere og skrivere: preferanse skr. module ReadersWriters op read ( r e s u l t types ) ; # bruker RPC op write ( types ) ; # bruker rendezvous body op s tartread (), endread ( ) ; # l o kale op.... databasen (DB )... ; proc read ( vars ) { c a l l s tartread ( ) ; # faa leseadgang... l e s vars fra DB... ; send endread ( ) ; # f r i g i DB } process Writer { i n t nr = 0; while ( true ) in s tartread () and? write == 0& > nr++; [ ] endread () > nr ; [ ] write ( vars ) and nr == 0 >... s k r i v vars t i l DB... ; ni } end ReadersWriters Martin Steffen (UiO) Models of Concurrency 2007 31 / 32
References I [1] G. R. Andrews. Foundations of Multithreaded, Parallel, and Distributed Programming. Addison-Wesley, 2000. Martin Steffen (UiO) Models of Concurrency 2007 32 / 32