INF4140 MODELLER FOR PARALLELLITET PMA-gruppen Institutt for informatikk Universitetet i Oslo http://www.ifi.uio.no/~pma (versjon 27.8.08) INF 4140 H08 Uke 1, side 1.
Modeller for parallellitet Forelesere Joakim Bjørk (IFI) Olaf Owe (IFI) Marcel Kyas (IFI) joakimbj@ifi.uio.no olaf@ifi.uio.no kyas@ifi.uio.no Alle i 3. etg ForskningsParken, innenfor kantina, i PMA-gangen Hjemmeside for kurset http://www.uio.no/studier/emner/matnat/ifi/inf4140/h07/ Pensum Gregory R. Andrews: Foundations of Multithreaded, Parallel, and Distributed Programming Vi planlegger noe tilleggsstoff omkring distribuerte systemer. INF 4140 H08 Uke 1, side 2.
Vurderingsform Tre obliger som må godkjennes. Avsluttende eksamen. Forelesninger Onsdag kl. 14:15-16:00 Alfa/Omega NR, 4.etg i Informatikkbygget. Grupper Gruppelærer: Joakim Bjørk, stipendiat på PMA-gruppen Gruppe 1: Torsdag kl. 14:15-16:00, Foredragssalen, Veglaboratoriet Starter neste uke. NB: Vil muligens finne andre lokaler/andre tider etterhvert. INF 4140 H08 Uke 1, side 3.
Dagens plan Innledning innhold i kurset motivasjon: hvorfor er dette kurset viktig noen enkle eksempler og betraktninger Start litt om parallellprogrammering ved kritiske regioner og venting interferens await-språket INF 4140 H08 Uke 1, side 4.
Hva dette kurset handler om Fundamentale problemstillinger knyttet til samarbeidende parallelle prosesser Tenkemåter knyttet til utvikling av parallelle prosesser Ulike språklige mekanismer og paradigmer Dypere forståelse av parallelle prosesser: (uformell og litt formell) analyse, egenskaper INF 4140 H08 Uke 1, side 5.
Parallelle prosesser Sekvensielt program: én kontrolltråd Parallelt program: flere kontrolltråder Parallelle prosesser trenger å utveksle informasjon. Vi skal studere to ulike måter å organisere kommunikasjonen mellom prosesser: Lesing og skriving til felles variable (del I av kurset) Kommunikasjon ved meldinger mellom prosesser (del II av kurset) INF 4140 H08 Uke 1, side 6.
Oversikt over temaer i kurset Del I: Felles Variable atomiske operasjoner interferens vranglås (deadlock), livelock, liveness, fairness parallelle programmer med låser, kritiske regioner og (aktiv) venting semaforer og passiv venting monitorer formell analyse (Hoare logikk), invarianter Java: tråder og synkronisering INF 4140 H08 Uke 1, side 7.
Oversikt over temaer i kurset Del II: Kommunikasjon asynkron og synkron meldingsutveksling Basis-mekanismer: RPC (remote procedure call), rendevous, klient/tjener setting, kanaler Javas mekanismer analyse ved hjelp av historier asynkrone systemer standard eksempler INF 4140 H08 Uke 1, side 8.
Start Da starter vi med Del I: felles variable Språklige mekanismer og teori for prosesser som opererer på felles programvariable. Hvorfor bruke felles variable? virkeligheten er slik: Eks. flere CPU-er inne i en maskin. naturlig interaksjon for tett koblede systemer. brukes i mange viktige språk, som i Javas trådbegrep. late som om man har mange prosesser, for å få en naturlig oppdeling kan oppnå bedre effektivitet ved at flere ting kan skje samtidig. Eks. å ha flere aktive vinduer på en gang. INF 4140 H08 Uke 1, side 9.
Enkelt eksempel Vi har programvariable x, y og z. La oss se på følgende program: før bak {x er a og y er b} x := x + z; y := y + z; {x er her a+z og y er b+z} Hvis vi har operasjoner på data som kan gjøres uavhengig av hverandre, kan det være en fordel å gjøre disse samtidig. Betingelsene beskriver tilstanden til programvariablene før og etter programsetningene og kalles hhv. for- og bak-betingelse. Disse betingelsene er ment å gi forståelse av programmet, og er ikke del av den koden som eksekveres. Kunne man bruke parallellitet her? INF 4140 H08 Uke 1, side 10.
Parallell-operator Utvider språket med en konstruksjon for parallell komposisjon: co S 1 S 2... S n oc; Eksekvering av en parallell komposisjon skjer ved samtidig eksekvering av delprosessene S 1,..., S n og terminerer normalt hvis alle delprosessene terminerer normalt. Eksempel Dermed kan vi skrive eksempelet som: {x er a og y er b} co x := x + z y := y + z oc; {x er a+z og y er b+z} INF 4140 H08 Uke 1, side 11.
Interaksjon mellom prosesser Prosesser som lever i samme system, kan interagere med hverandre på to ulike måter: Samarbeid for å oppnå et resultat Konkurranse om felles ressurser Organiseringen av denne interaksjonen vil vi kalle synkronisering av prosessene. Gjensidig utelukking (Mutex). Vi innfører kritiske regioner av programinstruksjoner som ikke kan eksekveres samtidig. Betingelsessynkronisering. En prosess må vente på at en bestemt betingelse er oppfylt før eksekvering kan fortsette. INF 4140 H08 Uke 1, side 12.
Samtidige prosesser: Atomiske operasjoner Bokas definisjon: En operasjon er atomisk hvis den ikke kan deles inn i mindre enheter. Alternativ definisjon: En operasjon er atomisk hvis den kan forstås uten å deles inn i mindre enheter. Hva som er atomisk avhenger av språket man jobber i: fin-kornet og grov-kornet atomiskhet. F.eks.: Lesing og skiving av en programvariabel er gjerne atomært. Noen (høy-nivå) språk kan ha tilordning x := e som én atomisk operasjon, andre som flere: lesing av variable i uttrykket e, beregning av verdien e, etterfulgt av skriving til x. Merk: Vi kan late som om atomiske operasjoner ikke skjer samtidig! Merk: En setning med høyst én atomisk del-operasjon, i tillegg til operasjoner på lokale variable, kan anses som atomisk! INF 4140 H08 Uke 1, side 13.
Atomiske operasjoner: programvariable Behandlingen av programvariable er fundamental: Også kommunikasjon mellom prosesser kan representeres ved variable, f. eks. en kommunikasjonskanal som en variabel av type sekvens. Til hver programvariabel assosieres en mengde med atomære operasjoner, f. eks. lesing og skriving til vanlige programvariable, sending og mottak på kommunikasjonskanaler, etc. Atomære operasjoner på en variabel x kalles x-operasjoner. Gjensidig utelukking Atomære operasjoner på en variabel kan ikke skje samtidig. INF 4140 H08 Uke 1, side 14.
Eksempel Vi skal nå se på programmet Hva blir slutt-tilstanden her? P 1 P 2 int x = 0; co x := x + 1 x := x 1 oc; {?} Vi antar at hver prosess blir eksekvert på en egen prosessor, med eget register, og at x er del av et felles tilstandsrom med programvariable. Aritmetiske operasjoner i de to prosessene kan utføres samtidig, men lese- og skriveoperasjoner på x må gjøres sekvensielt. Rekkefølgen på disse operasjonene er avhengig av relativ prosessorhastighet. Utfallet av slike program blir dermed svært vanskelig å forutsi! INF 4140 H08 Uke 1, side 15.
Atomære lese- og skriveoperasjoner P 1 P 2 int x := 0; co x := x + 1 x := x 1 oc; {?} Det er 4 atomære x-operasjoner: P 1 leser (R1) verdien i x, P 1 skriver (W1) en verdi til x, P 2 leser (R2) verdien i x, og P 2 skriver (W2) en verdi til x. R1 må skje før W1 og R2 før W2, så disse operasjonene kan sekvenseres på 6 måter: R1 R1 R1 R2 R2 R2 W1 R2 R2 R1 R1 W2 R2 W1 W2 W1 W2 R1 W2 W2 W1 W2 W1 W1 0-1 1-1 1 0 Utfra tabellen kan vi angi slutt-tilstanden til programmet: x= 1 x=0 x=1. Programmet er altså ikke-deterministisk : resultatet kan variere fra eksekvering til eksekvering. int x := 0; co x := x + 1 x := x 1 oc; {x= 1 x=0 x=1} INF 4140 H08 Uke 1, side 16.
Antall mulige kjøringer Hvis vi har 3 prosesser, hver med et gitt antall atomiske operasjoner, vil vi få følgende antall mulige eksekveringer: prosess 1 prosess 2 prosess 3 antall kjøringer 2 2 2 90 2 2 3 210 2 3 3 560 3 3 3 1680 4 4 4 34 650 5 5 5 756 756 NB: Ulike eksekveringer kan gi opphav til ulike slutt-tilstander. Umulig, selv for ganske enkle systemer, å se på hver mulige eksekvering for seg! For n prosesser med m atomiske setninger hver, er formelen (n m)! m! n INF 4140 H08 Uke 1, side 17.
at-most-once -egenskapen Definisjon. Et uttrykk e oppfyller egenskapen hvis det inneholder høyst én atomisk operasjon på en delt variable som andre prosesser skriver til. En tilordning x := e oppfyller egenskapen hvis enten e oppfyller egenskapen og x ikke leses av andre, eller x er delt og e ikke snakker om delte variable. Slike uttrykk/setninger kan anses som atomiske! Eksempler: (la z være en lokal variabel): x := 0; y := 0;co x := x + 1 y := x + 1 oc x := 0; y := 0;co x := y + 1 y := x + 1 oc; {x og y er 1 eller 2} x := 0; y := 0;co x := y + 1 x := y + 3 y := 1 oc; {y=1 x= 1, 2, 3, 4} co z := y + 1 z := y 1 y := 5 oc z := x x... {er z nå 0?} x := x... {samme som skip?} if y > 0 then y := y 1 fi if y > 0 then y := y 1 fi INF 4140 H08 Uke 1, side 18.
Kursets første programmeringsspråk: await-språket vanlige sekvensielle, imperative konstruksjoner som tilordning, if-, for- og while-setninger cobegin-konstruksjonen for parallell aktivitet prosesser kritiske regioner await-setninger for (aktiv) venting og betingede kritiske regioner INF 4140 H08 Uke 1, side 19.
Programmeringsspråket: Syntaks Vi bruker følgende syntaks for basale konstruksjoner: Deklarasjoner int i := 3; int a[1:n]; int a[1:n] = ([n] 1); int a[n]; tilsvarerint a[0:n-1]; int a[n] = ([n] 0); Sekvensielle setninger Tilordning x:=e; a[n]:=e; a[n]++; tilsvarera[n]:= a[n]+1; sum +=i; tilsvarersum:=sum+i; Sammensatt setning { setninger } Kondisjonal if (betingelse) setning While-løkke while (betingelse)setning For-løkke for [i=0 to n-1] setning INF 4140 H08 Uke 1, side 20.
Parallelle setninger co S 1 S 2... S n oc; Hver arm S i inneholder en programsetning som blir utført i parallell med de øvrige armene. co-setningen terminerer når alle armene S i har terminert. Neste instruksjon etter co-setningen eksekveres etter at co-setningen har terminert. Parallelle prosesser process foo { Prosesser kjører i bakgrunnen int sum := 0; Prosesser evalueres i vilkårlig rekkefølge. for [i= 1 to 10] Prosesser deklareres (som metoder/funksjoner ) sum += i; x := sum; } INF 4140 H08 Uke 1, side 21.
Eksempel process bar1 { for [i = 1 to n] write(i);} Starter én prosess. Tallene skrives ut i stigende rekkefølge. process bar2[i=1 to n] { write(i); } Starter n prosesser. Tallene skrives ut i tilfeldig rekkefølge fordi eksekveringsrekkefølgen på prosessene er ikke-deterministisk. INF 4140 H08 Uke 1, side 22.
Lese- og skrivevariable La V : statement variable set være en syntaktisk funksjon som beregner mengden av programvariable som refereres i programmet. W : statement variable set er mengden av (skrive)variable som kan bli endret av programmet. V[v:=e] = V[e] {v} W[v:=e] = {v} V[S 1 ; S 2 ] = V[S 1 ] V[S 2 ] W[S 1 ; S 2 ] = W[S 1 ] W[S 2 ] V[if (b) S ] = V[b] V[S] W[if (b) S ] = W[S] V[while (b) S ] = V[b] V[S] W[while (b) S ] = W[S] der V[e] er mengden av variable i uttrykket e. NB: Vi antar her at += og ++ tilordninger skrives helt ut. INF 4140 H08 Uke 1, side 23.
Disjunkte prosesser Parallelle prosesser er uten interferens hvis de er disjunkte, dvs. uten felles programvariable: V[S 1 ] V[S 2 ] = Variable som bare leses, kan imidlertid ikke gi opphav til interferens. Det er derfor tilstrekkelig med følgende interferens kriterium: V[S 1 ] W[S 2 ] = W[S 1 ] V[S 2 ] = INF 4140 H08 Uke 1, side 24.
Semantiske begrep En tilstand i et parallelt program består av verdien til programvariablene på et gitt tidspunkt i eksekveringen. Hver prosess eksekverer uavhengig av de andre ved å modifisere programvariable vha. atomære operasjoner. En eksekvering av et parallelt program kan modelleres ved en historie, dvs. en sekvens av operasjoner på programvariablene, alt. som en sekvens av tilstander. For ikke-trivielle parallelle programmer finnes det veldig mange mulige historier. Synkronisering brukes til å begrense mulige historier. INF 4140 H08 Uke 1, side 25.
Egenskaper En egenskap ved et program er et predikat som er sann for alle mulige historier til programmet. To typer: Sikkerhetsegenskaper sier at programmet ikke vil komme til en uønsket tilstand. Progresjonsegenskaper sier at programmet vil komme til en ønsket tilstand (liveness). Partiell korrekthet : Programmet kommer til en ønsket slutt-tilstand hvis programmet terminerer (sikkerhetsegenskap). Terminering: Lengden på alle historier er endelige. Total korrekthet : Programmer terminerer og er partielt korrekt. INF 4140 H08 Uke 1, side 26.
Egenskaper: Invarianter Definisjon. En felles egenskap for alle tilstander som kan oppstå ved eksekvering, i.e. egenskap som holder til enhver tid. sikkerhetsegenskap hensiktsmessig for ikke-terminerende systemer (unngår å snakke om en sluttilstand) global invariant snakker om tilstanden til mange prosesser på én gang, gjerne total-systemet lokal invariant snakker om tilstanden til én prosess. man kan vise at en invariant er korrekt ved å vise at den gjelder initielt, og at hver atomisk setning vedlikeholder den. Merk: slipper å se på alle mulige eksekveringer! INF 4140 H08 Uke 1, side 27.
Hvordan sjekke egenskaper ved programmer? Testing eller debugging øker tilliten til programmet ved prøving, men gir ingen garanti for korrekthet. Operasjonell resonnering utprøver alle historiene til et program. Formell analyse : Metode for å regne på egenskaper ved et program uten å prøve historiene én og én. En test kan påvise feil, men aldri påvise korrekthet! INF 4140 H08 Uke 1, side 28.
Kritiske regioner Gjensidig utelukking: kombinerer sekvenser av operasjoner til kritiske regioner som oppfører seg som atomære operasjoner. Når interferenskravet til parallelle prosesser ikke holder, bruker vi synkronisering til å begrense de mulige historiene. Synkronisering gir grov-kornete atomære operasjoner. Notasjonen< S > betyr atsutføres atomært. Atomære operasjoner: Interne tilstander er ikke synlige for andre prosesser. Variable kan ikke endres av andre prosesser. Eksempel Eksemplet fra tidligere kan nå skrives som: int x := 0; co < x := x + 1 > < x := x 1 > oc; {x er her 0} INF 4140 H08 Uke 1, side 29.
Betingede kritiske regioner Innfører følgende uttrykk: < await (B) S; > Det boolske uttrykketbspesifiserer en ventebetingelse. Hakeparentesene antyder at kroppenseksekveres som en atomær operasjon. Eksempel < await (y > 0) y := y-1; > Variabelenyblir først minket når betingelseny > 0 holder. INF 4140 H08 Uke 1, side 30.
Betingede kritiske regioner (2) Mutex: < x := x+1 ; y := y+1 ; > Betingelsessynkronisering: < await (teller > 0) ; > Vi kan brukeawait til å spesifisere begge synkroniseringsmetodene: int teller = 1;... < await (teller > 0) teller := teller-1; > start region kritiske setninger; teller := teller+1; slutt region Invariant: 0 teller 1 INF 4140 H08 Uke 1, side 31.
Eksempel: produsent/konsument synkronisering LaProducer være en prosess som leverer data til en prosessconsumer. int buf, p := 0, c := 0; process Producer { process Consumer { int a[n];... int b[n];... while (p < n) { while (c < n) { < await (p == c) ; > < await (p > c) ; > buf := a[p] b[c] := buf p := p+1; c := c+1; } } } } Denne type synkronisering kalles for gjerne for busy waiting. INF 4140 H08 Uke 1, side 32.
Eksempel (forts) a: buf: p: c: n: b: Global Invariant : c <= p <= c+1 Lokal Invariant (Producer) : 0 <= p <= n En invariant holder i alle tilstander i historien til programmet. INF 4140 H08 Uke 1, side 33.