INF3140 / INF4140 MODELLER FOR PARALLELLITET. PMA-gruppen. Institutt for informatikk Universitetet i Oslo.

Like dokumenter
INF4140 MODELLER FOR PARALLELLITET. PMA-gruppen. Institutt for informatikk Universitetet i Oslo.

INF3140 Modeller for parallellitet INF3140/4140: Programanalyse

INF3140 Modeller for parallellitet INF3140/4140: Låser og Barrierer

INF4140: Låser og Barrierer (Locks and Barriers)

Læringsmål og pensum. Utvikling av informasjonssystemer. Oversikt. Systemutvikling Systemutvikling i seks faser Femstegs prosedyre for programmering

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

LITT OM OPPLEGGET. INF1000 EKSTRATILBUD Stoff fra uke September 2012 Siri Moe Jensen EKSEMPLER

Plan. Oppgaver og repetisjon Eksempler med fikspunkt og induksjon: 1. sortering 2. divisjon 3. Heis? IN 315: Foilsett 9: Unity: Arkitekturer

Kodegenerering, del 2: Resten av Kap. 8 pluss tilleggsnotat (fra kap. 9 i ASU ) INF5110 V2007

Forelesning 9 mandag den 15. september

MAT1030 Diskret matematikk

Forelesere VELKOMMEN TIL MAT-INF Forelesere MAT-INF /8-2005

Forelesning 22 MA0003, Mandag 5/ Invertible matriser Lay: 2.2

MAT1030 Forelesning 30

Invarianter, +lstander og li1 mer seman+kk

MAT1030 Diskret matematikk. Kompleksitetsteori. Forelesning 29: Kompleksitetsteori. Dag Normann KAPITTEL 13: Kompleksitetsteori. 7.

Hypotesetesting. Notat til STK1110. Ørnulf Borgan Matematisk institutt Universitetet i Oslo. September 2007

Innhold. Introduksjon til parallelle datamaskiner. Ulike typer parallelle arkitekturer. Prinsipper for synkronisering av felles hukommelse

Leksjon 3. Kontrollstrukturer

Vekst av planteplankton - Skeletonema Costatum

Løsningsforslag til seminar 4 Undervisningsfri uke

Mer kodegenerering: Tilleggsnotat fra AHU Om Javas Byte-kode INF april 2009

INF oktober Dagens tema: Uavgjørbarhet. Neste uke: NP-kompletthet

Mesteparten av kodingen av Donkey Kong skal du gjøre selv. Underveis vil du lære hvordan du lager et enkelt plattform-spill i Scratch.

Kompleksitetsanalyse Helge Hafting Opphavsrett: Forfatter og Stiftelsen TISIP Lærestoffet er utviklet for faget LO117D Algoritmiske metoder

Hva er en algoritme? Har allerede sett på mange algoritmer til nå i IT1101. Forholdet mellom en algoritme og et program. Algoritme program prosess

Introduksjon til objektorientert. programmering. Hva skjedde ~1967? Lokale (og globale) helter. Grunnkurs i objektorientert.

GetMutex(lock) { while(testandset(lock)) {} } En context switch kan ikke ødelegge siden testen og endringen av lock skjer i samme instruksjon.

TMA4100 Matematikk 1, høst 2013

Uendelige rekker. Konvergens og konvergenskriterier

Kodegenerering del 3: Tilleggsnotat fra AHU Samt litt om class-filer og byte-kode INF5110 V2007. Stein Krogdahl, Ifi UiO

GJENNOMGANG UKESOPPGAVER 6 MER OM OBJEKTORIENTERING OG UML

UNIVERSITETET I OSLO

MAT1030 Diskret matematikk

Ukeoppgaver fra kapittel 3 & 4

Models of Concurrency

MAT1030 Forelesning 7

Beskrivelse av programmeringsspråket Simpila INF Kompilatorteknikk Våren 2012

Velkommen til. INF våren 2017

ALGORITMER OG DATASTRUKTURER

Kapittel 4: Logikk (predikatlogikk)

INF1000 undervisningen INF 1000 høsten 2011 Uke september

INF 1000 høsten 2011 Uke september

Oppsummering av digitalteknikkdelen

UNIVERSITETET I OSLO

INF3140 Modeller for parallellitet INF3140/4140: Monitorer

Forelesning 28: Kompleksitetsteori

Ny EKSAMEN. Operativsystemer og nettverk

Dagens temaer. Fra kapittel 4 i Computer Organisation and Architecture. Kort om hurtigminne (RAM) Organisering av CPU: von Neuman-modellen

Concurrency. Lars Vidar Magnusson. September 20, Lars Vidar Magnusson () Forelesning i Operativsystemer September 20, / 17

Tre måter å lese fra terminal. Java 4. Eksempel. Formatert utskrift til skjerm

Dagens plan INF3170 Logikk. Obliger og eksamen. Forelesning 1: Introduksjon, mengdelære og utsagnslogikk. Christian Mahesh Hansen og Roger Antonsen

Mer kodegenerering: Tilleggsnotat fra AHU. INF mai Stein Krogdahl,

ENC ENKEL AKSE og KLIPPE LENGDE KONTROLLER for PLATESAKSER

INF mai 2014 Stein Krogdahl, Ifi, UiO

Velkommen til MAT1030!

MAT1030 Diskret Matematikk

var y :{x :T R}; S endvar y

Løsningsforslag til underveisvurdering i MAT111 vår 2005

D: Ingen trykte eller håndskrevne hjelpemiddel tillatt. Bestemt, enkel kalkulator tillatt.

SKOLEEKSAMEN I. SOS4010 Kvalitativ metode. 19. oktober timer

Velkommen til INF Kompilatorteknikk

Ark 1 av 18. programmeringsspråkenes. Velkommen til IN 211. verden. IN 211 Programmeringsspråk

Kort notat om parallellstyring IN147

VELKOMMEN TIL MAT-INF1100(L) Knut Mørken Rom 1033, Niels Henrik Abels hus

Hvordan blir jeg en ordentlig informatikkstudent? Kurs i studiestrategier med fokus på INF1000

Plan for dagen. Kræsj-kurs i sanntidsprogrammering. Måter å tenke på. Programmering intro. Tråder & synkronisering

GJENNOMGANG UKESOPPGAVER 3 KRAVHÅNDTERING

Dagens temaer. Dagens temaer hentes fra kapittel 3 i Computer Organisation and Architecture. Kort repetisjon fra forrige gang. Kombinatorisk logikk

Betinget eksekvering og logiske tester i shell

Forelesning 1. Algoritmer, pseudokoder og kontrollstrukturer. Dag Normann januar Vi som skal undervise. Hva er diskret matematikk?

Eksamen 1T høsten 2015, løsningsforslag

PRIMTALL FRA A TIL Å

Dagens tema. Dagens tema hentes fra kapittel 3 i Computer Organisation and Architecture. Sekvensiell logikk. Flip-flop er. Tellere og registre

Fortsettelses kurs i Word

Kompleksitetsanalyse

Om Kurset og Analyse av Algoritmer

INF1000 Variable. Marit Nybakken 27. januar 2004

Oppgavene 1, 2, 4, 5, 6, 9, 12 og 13 passer best til å løses ved en datamaskin.

Velkommen til. IN1010 Objektorientert programmering Våren 2018

Stein Gjessing. Institutt for informatikk. Universitetet i Oslo. Institutt for informatikk

Dagens tema: 12 gode råd for en kompilatorskriver. Sjekking av navn. Lagring av navn. Hvordan finne et navn?

Fra sekvensielt til parallelt

Leksjon 3. Kontrollstrukturer

Øvingsforelesning i Matlab (TDT4105)

TDT4110 Informasjonsteknologi, grunnkurs Uke 35 Introduksjon til programmering i Python

Løsningsforslag ukeoppg. 9: okt (INF Høst 2011)

Kodestil i C++ Introduksjon. Navnekonvensjoner. Globale variabler. Simen Hagen

INF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme, del 2

UNIVERSITETET I OSLO ØKONOMISK INSTITUTT

Binomisk fordeling. Tilfeldige variabler. MAT0100V Sannsynlighetsregning og kombinatorikk

INF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme, del 2

INF3140 Modeller for parallellitet INF3140/4140: Semaforer

INF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme, del 2

Fakultet for informasjonsteknologi, Kontinuasjonsløsning på SIF8037 Distribuerte systemer og ytelsesvurdering (Distribuerte systemer kun)

er et er et heltall. For eksempel er 2, 3, 5, 7 og 11 primtall, mens 4 = 2 2, 6 = 2 3 og 15 = 3 5 er det ikke.

INF5110, onsdag 19. februar, Dagens tema: Parsering ovenfra-ned (top-down)

Algoritmer - definisjon

Kapittel 3: Litt om representasjon av tall

Transkript:

INF3140 / INF4140 MODELLER FOR PARALLELLITET PMA-gruppen Institutt for informatikk Universitetet i Oslo http://www.ifi.uio.no/~pma Uke 1, side 1.

Modeller for parallellitet Forelesere Johan Dovland (IFI) johand@ifi.uio.no Olaf Owe (IFI) olaf@ifi.uio.no Hjemmeside for kurset http://www.uio.no/studier/emner/matnat/ifi/inf3140/h06/ Pensum Gregory R. Andrews: Foundations of Multithreaded, Parallel, and Distributed Programming. Utsolgt fra forlaget! Men utdrag vil trykkes opp og deles ut, eller komme som kompendium på Akademika. Vi planlegger noe tilleggsstoff omkring distribuerte systemer. Forelesningene kan ta opp andre temaer. Disse er også pensum. Uke 1, side 2.

Vurderingsform Tre obliger som må godkjennes. Avsluttende eksamen. Forelesninger Tirsdag kl. 14:15-16:00, Veilabben (vil muligens finne andre lokaler etterhvert). Grupper Gruppelærer: Joakim Bjørk (stipendiat PMA) 4. etg IFI Gruppe 1: Onsdag kl. 10:15-12:00, Seminarrom 510 Veglaboratoriet Evt.:Gruppe 2: Fredag kl. 12:15-14:00, Seminarrom 510 Veglaboratoriet Starter neste uke. 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 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 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) 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 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 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 man har mange prosesser, for å oppnå bedre effektivitet ved at flere ting kan skje samtidig. Eks. å ha flere aktive vinduer på en gang. 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. Uke 1, side 10.

Parallelloperator 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} 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. 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, bergning av verdien e, etterfulgt av skriving til x. Vi kan late som atomiske operasjoner ikke skjer samtidig! Merk: En setning med høyst én atomisk del-operasjon, i tillegg til opersjoner på lokale variable, kan anses som atomisk! 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. 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! 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} 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 Uke 1, side 17.

at-most-once -egenskapen Definisjon. Et uttrykk e oppfyller egenskapen hvis det snakker om høyst én delt variable og inneholder høyst én atomisk operasjon på denne. En tilordning x := e oppfyller egenskapen hvis enten e oppfyller egenskapen og x ikke refereres av andre, eller x er delt og e ikke snakker om delt variable. (Samme som i merknad på foil 13). Slike uttrykk/setninger kan anses som atomiske! Eksempler: (la z være en lokal variabel): 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 oc z := x x {er z nå 0?} x := x {samme som skip?} if y > 0 then y := y 1; Boka: leses 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 Uke 1, side 19.

Programmeringsspråket: Syntaks Vi bruker følgende syntaks for basale konstruksjoner: Deklarasjoner int i := 3; int a([n] 1); int a[n]; tilsvarerint a[0:n-1]; int a([n] n); Sekvensielle setninger Tilordning x:=e; For-løkke a[n]++; tilsvarera[n] := a[n]+1; for [i = 0 to n-1]{ sum += i; tilsvarersum:=sum+i; a[i] := i; } Kondisjonal if (betingelse) setning While-løkke while (betingelse) setning 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] Neste instruksjon etter prosess-kroppen sum += i; evalueres med en gang. x := sum; } 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. 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. 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 ] = Dette kravet kan svekkes litt ( at-most-once -egenskapen): Uke 1, side 24.

Historier 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. For ikke-trivielle parallelle programmer finnes det veldig mange mulige historier. Synkronisering brukes til å begrense mulige historier. 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. 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 (ungå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. 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! 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} Uke 1, side 29.

Betingete 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. Uke 1, side 30.

Betingete kritiske regioner (2) Vi kan brukeawait til å spesifisere begge synkroniseringsmetodene: Mutex: < x := x+1 ; y := y+1 ; > Betingelsessynkronisering: < await (teller > 0) ; > 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. Uke 1, side 32.

Eksempel (forts) a: buf: p: c: n: b: Invariant : c <= p <= c+1 En invariant holder i alle tilstander i historien til programmet. Uke 1, side 33.