Dagens tema: Parallellstyring

Like dokumenter
IN 147 Program og maskinvare

Dagens program. Operativsystemer Prosesser og systemkall i UNIX Hente prosessens nummer Starte prosesser Vente på prosesser Utføre programmer

Dagens tema: Synkronisering

Dagens tema: Synkronisering

IN 147 Program og maskinvare. Dagens tema:

Oppsummering av IN147 siste del Operativsystemer Parallellisering Veien videre

IN 147 Program og maskinvare

Dagens tema: Liten repetisjon Håndtering av statusverdier

Dagens tema: Parallellisering Generelt Fraktaler Generelt Julia-kurven Vindussystemet X Parallellitet i UNIX Signaler. IN 147 Program og maskinvare

Dagens tema. Nyttige programmer Programmet make. Flyt-tall Representasjon av flyt-tall. Standarden IEEE 754. Systemkall i Unix

Dagens tema. Nyttige programmer Programmet make. Hvis én fil endres, hvilke filer må da kompileres på nytt?

Dagens tema (kapittel 15 i Englander-boken)

Programmeringsspråket C

EKSAMEN. Operativsystemer. 1. Læreboken "A Practical Guide to Red Hat Linux" av Mark Sobell 2. Maks. tre A-4 ark med selvskrevne notater.

Prosesser. Dagens tema. Hva er en prosess? En prosess er et program under utførelse.

Dagens tema. C-programmering. Nøkkelen til å forstå C-programmering ligger i å forstå hvordan minnet brukes.

Dagens tema. Parallellitet Generelt Fraktaler Polling og avbrudd Multiprosessering i UNIX Opprettelse av prosesser Signaler

Dagens tema INF1070. Info om C. Cs preprosessor. Feilsøking. Dag Langmyhr,Ifi,UiO: Forelesning 31. januar 2005 Ark 1 av 29

Informasjon om C. Dagens tema INF1070 INF1070 INF1070 INF1070. Den viktigste kilden til informasjon om C (utenom en god. C-funksjonene.

IN 147 Program og maskinvare

Programmeringsspråket C

IN 147 Program og maskinvare

Programmeringsspråket C

Nyttige Linux-kommandoer. Hvordan du kan jobbe mer effektivt Dag Langmyhr

Kort notat om parallellstyring IN147

IN 147 Program og maskinvare

Pekere og vektorer. Dagens tema. I C gjelder en litt uventet konvensjon:

Dagens tema. Det siste om C Pekere og vektorer. Pekere til pekere. Vanlige pekerfeil. struct-er og typedef. Lister. Feilsøking

Kapittel 1 En oversikt over C-språket

IN 147 Program og maskinvare. Vranglås De spisende filosofer Lettvektsprosesser Moderne synkroniseringsmetoder Meldinger Monitorer Linda

Del 1 En oversikt over C-programmering

Programmeringsspråket C Del 3

Programmeringsspråket C Del 3

Oving 2. Oppgave 1. #include <stdio.h> int main(int argc, char **argv) { char *navn = argv[1]; printf ("Navnet ditt er %s\n", navn); } Oppgave 2

Dagens tema INF2270. Cs preprosessor. Separat kompilering av C funksjoner. C og minnet. Dag Langmyhr,Ifi,UiO: Forelesning 5. februar 2007 Ark 1 av 15

Programmeringsspråket C Del 3

IN 147 Program og maskinvare

Oversikt. Introduksjon Kildekode Kompilering Hello world Hello world med argumenter. 1 C programmering. 2 Funksjoner. 3 Datatyper. 4 Pekere og arrays

Dagens tema. Kort repetisjon om rutiner. Programmering i C Variable og adresser. Vektorer. Tekster. Preprosessoren. Separat kompilering

Prosesstabeller (PCB - Prosess Control Block) Se på PD: kommandoene ps og top Bakgrunnsprosesser Opprettelse av prosesser:

IN 147 Program og maskinvare. Velkommen til IN 147. Program- og maskinvare

Programmeringsspråket C Del 2. Michael Welzl

IN 147 Program og maskinvare

Dagens tema INF1070. Signaturer. Typekonvertering. Pekere og vektorer. struct-er. Definisjon av nye typenavn. Lister

Programmeringsspråket C Del 2

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

Programmeringsspråket C Del 3

Programmeringsspråket C Del 3. Hans Petter Taugbøl Kragset

Definisjon av prosess

Dagens tema: Datastrukturer

Programmeringsspråket C Del 2

Programmeringsspråket C Del 2

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

IN 147 Program og maskinvare

Oversikt over IN147(A):

Oversikt. Beskrivelse Bash. 1 UNIX shell. 2 Kommandolinje som brukergrensesnitt. 3 Input og output. 4 Bash builtins. 5 Linux utilities.

Signaturer. Dagens tema. En vanlig feil int-funksjon. Dette kan noen ganger gi rare feilmeldinger: INF1070 INF1070 INF1070 INF1070

IN 147 Program og maskinvare. Vanlige feil ved bruk av pekere Feilsøking Debuggere

alternativer til felles hukommelse store parallelle datamaskiner Tema for denne forelesningen: in 147, våren 1999 parallelle datamaskiner 1 9

Programmeringsspråket C Del 2. Hans Petter Taugbøl Kragset

Dagens tema. C-programmering. Nøkkelen til å forstå C-programmering ligger i å forstå hvordan minnet brukes.

Løsningsforslag til eksamen i IN 147 og IN 147A

Dagens tema. Rutiner i LC-2 Og her er tilsvarende kode for LC-2: Funksjoner i C Her er det samme programmet i C: Kort repetisjon om rutiner

Dagens tema: Enda mer MIPS maskinkode

UNIVERSITETET I OSLO

Dagens tema INF1070. Vektorer (array er) Tekster (string er) Adresser og pekere. Dynamisk allokering

En prosess kan sees på som et stykke arbeid som skal utføres på datamaskinen. Ofte vil det være flere prosesser/tråder på datamaskinen samtidig.

Oppgave 1 Oversettelse (vekt 16%)

IN 147 Program og maskinvare

GJØVIK INGENIØRHØGSKOLE

HØGSKOLEN I SØR-TRØNDELAG

Sikkerhet: Virus Sikkerhet i operativsystemet Maskinstøtte for sikkerhet Trojanske hester Ormer. IN 147 Program og maskinvare.

Cs preprosessor. Dagens tema. Betinget kompilering

Dagens tema C, adresser og pekere

Ark 3 av 26. printf("i adresse %08x ligger b med verdien %d.\n", &b, b); printf("i adresse %08x ligger a med verdien %d.

Fra Python til Java, del 2

IN 147 Program og maskinvare

Del 4 Noen spesielle C-elementer

Vektorer. Dagens tema. Deklarasjon. Bruk

Løsningsforslag til eksamen i IN 147(A)

Bli Kjent med Datamaskinen Introduksjon ComputerCraft PDF

Hvordan en prosessor arbeider, del 1

Semantikk. Dagens tema Kjøresystemer (Ghezzi&Jazayeri 2.6, 2.7) Semantikk. Semantikk. En måte å svare på: gi semantikken til språket!

Mer om Perl INF3110/4110. Filer og bruk av disse. Lister. Tabeller. Søking og regulære uttrykk. Oppsummering

Lynkurs i shellprogrammering under Linux

EKSAMEN. Operativsystemer. Kontroller at oppgaven er komplett før du begynner å besvare spørsmålene.

HØGSKOLEN I SØR-TRØNDELAG

Steg 1: Vår første datamaskin

Sprettende ball Introduksjon Processing PDF

Programmering i C++ Løsningsforslag Eksamen høsten 2005

IN 147 Program og maskinvare

Dagens tema. Cs preprosessor Separat kompilering av C-funksjoner C og minnet Oversikt over operatorene

IN 147 Program og maskinvare. Dagens tema

Dagens tema. Mer om C Enkle datatyper Sammensatte datatyper: Vektorer og matriser Tekster Mengder Strukturer Unioner Ringbuffere

ToPlayer. Introduksjon: Skrevet av: Ruben Gjerstad Eide og Kine Gjerstad Eide

Oppgave 1 JK-flip-flop (Total vekt 20%)

INF1010 Tråder II 6. april 2016

HØGSKOLEN I SØR-TRØNDELAG

Transkript:

Nyttige forklaringer Sikker opprettelse av nye prosesser Hva er en kommandotolker? Dagens tema: Parallellstyring Generelt Synkronisering med filer Synkronisering med rør Synkronisering med felles lager Ark 1 av 26 Forelesning 5.4.2000

Hvordan kvele et UNIX-system? Selv om UNIX-implementasjoner er godt sikret, finnes det kode som kveler de aller fleste: while(1) {... fork();... hvor det ikke er tilstrekkelig mange kall på wait. Som en løsning har jeg skrevet safefork som kun tillater seks prosesser mer; forøvrig oppfører den seg akkurat som fork. Koden ligger på ~in147/kode/safefork.c. Alle IN147-studenter anmodes intenst om å bruke safefork i stedet for fork. Kopiér filen til området der programmet ditt ligger. Forelesning 5.4.2000 Ark 2 av 26

Kommandotolkeren En kommandotolker (ofte kalt «shell» på engelsk) er et program som leser brukerens kommandolinjer og kaller de riktige programmene. De vanligste kommandotolkerne heter sh (Bourne shell), csh (C shell) og bash («Bourne-again shell»). Snart kommer ifish (Ifi shell). En kommandotolker fungerer grovt sett slik: while (1) { skriv klarsignal ( prompt ) les brukerens kommandolinje splitt linjen i kommando og parametre if ( tolkerkommando som exit eller cd ) { utfør kommandoen else{ if(safefork()==0){ finn programfilen til kommandoen execve( programfil, parametre, omgivelse ); else{ vent til barnet er ferdig Forelesning 5.4.2000 Ark 3 av 26

Hvordan finne programmene? Når brukeren gir en kommando som tail, hvilken programfil menes da? Det finnes (foreløbig) 24 åpne filer som heter tail på systemet. Omgivelsesvariabelen PATH forteller hvilke filområder som kommandotolkeren skal lete i: maskin navn> printenv PATH /home/ansatte/03/dag/bin:/local/x11r5/bin:/local/x11r5/bin/pbm:/local/java/bin: /local/bin:/local/ssh/bin:/local/bin/msdos:/opt/sunwspro/bin:/usr/openwin/bin: /usr/ccs/bin:/usr/ucb:/usr/bin:/local/gnu/bin:/local/qt/bin:.: /hom/dag/public:/local/drift/bin:/local/metamail/bin De aktuelle områdene er angitt med kolon som skilletegn. Hvis man lurer på hvilken programfil som velges, kan man skrive maskin navn> which tail /usr/ucb/tail Forelesning 5.4.2000 Ark 4 av 26

Bakgrunn om parallellstyring Fraktalprogrammet tar 26 sekunder å produsere på SGI-maskinen modsognir når vi er alene der. Hvorledes kan det gjøre raskere? Forbedre algoritmen? Lite å hente her. (Jeg bruker allerede cc -O.) Stjele prosessortid fra andre? Ingen god løsning. Parallellisering? Mulighet med størst potensiale. Forelesning 5.4.2000 Ark 5 av 26

Parallellisering En naturlig parallellversjon av fraktalprogrammet består av én eller flere prosesser som beregner punkter i fraktalbildet, og én prosess som tegner opp punktene. De evige spørsmål Når det er snakk om parallellprogrammering, er det alltid to spørsmål som må besvares: Hvordan skal data overføres? Hvordan skal arbeidet synkroniseres? Begrepet parallellstyring omfatter disse to tingene. Forelesning 5.4.2000 Ark 6 av 26

Polling og avbrudd Når vi har flere parallelle prosesser, vil de gå med ulik hastighet. Vi ønsker at disse kan kommunisere med hverandre for å synkronisere kjøringen, overbringe data eller fordi en feil har oppstått. Hvordan skal så disse prosessene kommunisere? På laveste nivå finnes det tre generelle muligheter: polling, avbrudd, og flaggavbrudd. Forelesning 5.4.2000 Ark 7 av 26

En analogi Anta at du skal på restaurant; din venn/venninne Inge bestiller bord. Polling Du ringer ofte, f.eks. hvert 5. minutt. +: Enkelt å avtale : Kaster bort mye tid. : Kan ringe for sent. Avbrudd Inge ringer deg. +: Kaster ikke bort tid. +: Øyeblikkelig respons. : Avbrudd på ubeleilig tidspunkt. Flaggavbrudd Du skaffer deg en automatisk telefonsvarer. +: Kaster ikke bort mye tid. +: Ikke avbudd på ubeleilig tidspunkt. : Ikke øyeblikkelig respons. Forelesning 5.4.2000 Ark 8 av 26

Parallellitet i UNIX UNIX benytter mer høynivå mekanismer for parallellstyring. Disse er laget for «aktiv» men «grovkornet» parallellitet: Det er ganske billig å opprette nye prosesser. Det antas at prosesser normalt kommuniserer lite eller ingenting. Opprettelse av nye prosesser Som tidligere nevnt, opprettes nye prosesser ved kall på fork. Om ønsket, kan prosessens innhold endres ved å kalle på execve. Forelesning 5.4.2000 Ark 9 av 26

Parallellstyring med filer Hovedprogrammet main Hovedprogrammet starter n barneprosesser til å gjøre hver sin del av jobben; når de er ferdige kan den lese filene og tegne opp vinduet. int main(int argc, char *argv[]) { time_t start_tid = time(null); int n_proc, status, ix; char f_name[200]; n_proc = argc <= 1? 1 : atoi(argv[1]); for (ix = 1; ix <= n_proc; ++ix) { if(safefork()==0){ write_file(ix, (ix-1)*nx/n_proc, ix*nx/n_proc-1); exit(0); for (ix = 1; ix <= n_proc; ++ix) wait(&status); x147open(nx, NY); for (ix = 1; ix <= n_proc; ++ix) { plot_file(ix); sprintf(f_name, "/tmp/frak-%d.data", ix); unlink(f_name); printf("det hele tok %d sekunder.\n", time(null)-start_tid); x147pause(); return 0; Forelesning 5.4.2000 Ark 10 av 26

Funksjonen write file Denne funksjonen lager filen /tmp/frak-p num.data for ix 1 ix ix 2. void write_file(int p_num, int ix1, int ix2) { FILE *f; char f_name[200]; float x, y; int ix, iy; sprintf(f_name, "/tmp/frak-%d.data", p_num); f = fopen(f_name,"w"); for (ix = ix1; ix <= ix2; ++ix) { x = x1+ix*(x2-x1)/(nx-1); for (iy = 0; iy < NY; ++iy) { y = y1+iy*(y2-y1)/(ny-1); fprintf(f, "%d %d %d\n", ix, iy, fraktal(x,y,255.0,max)); fclose(f); Forelesning 5.4.2000 Ark 11 av 26

Funksjonen plot file Denne funksjonen tegner opp data fra filen frak-p num.data. void plot_file(int p_num) { FILE *f; char f_name[200]; int ix, iy, fval; sprintf(f_name, "/tmp/frak-%d.data", p_num); f = fopen(f_name,"r"); while (fscanf(f, "%d%d%d", &ix, &iy, &fval)>0) { x147plot(ix, iy, fval); if (iy == 0) { x147sync(); if (x147done) exit(0); fclose(f); Forelesning 5.4.2000 Ark 12 av 26

Resultater Dette forsøket på parallellisering falt ikke heldig ut: Ikke-parallell tegning 26s frakfil 1 41s frakfil 2 27s frakfil 3 23s frakfil 4 22s frakfil 5 22s frakfil 6 21s Vurdering + Enkelt å programmere. Åpning, skriving, lukking, lesing og fjerning av filer tar ganske mye tid. Hovedprogrammet kan ikke tegne noe før alle barna er ferdige med beregningene. Forelesning 5.4.2000 Ark 13 av 26

Rør i UNIX UNIX-rør brukes når barneprosesser vil kommunisere med søsken eller sitt opphav. Rør brukes ofte på kommandolinjen for å koble standard ut i det første programmet til standard inn i det andre: maskin navn> grep dag logg-fil sort more Rør opprettes med systemkallet pipe: int pip[2];. pipe(pip); Resultatet er et rør med to filnumre: pip[0] benyttes til lesing. pip[1] benyttes til skriving. Forelesning 5.4.2000 Ark 14 av 26

Å skrive til et rør Man kan sende n byte med data (lagret i buffer) til et rør med systemkallet w_bytes = write(pip[1], buffer, n); Returverdien w bytes forteller hvor mange byte som faktisk ble skrevet (og det vil vanligvis være n). Å lese fra et rør Man kan lese fra et rør med kommandoen r_bytes = read(pip[0], buf2, n); Data skal plasseres i buf2 hvor det er plass til n byte. Returverdien r bytes forteller hvor mange byte som faktisk ble mottatt; det vil ofte være mindre enn n. Synkronisering Man oppnår synkronisering ved at read om nødvendig blir blokkert til det er mer data å lese, og write må vente når røret er fullt. Forelesning 5.4.2000 Ark 15 av 26

Eksempel Bruk av rør IN 147 Program og maskinvare #include <stdlib.h> #include <stdio.h> #include <unistd.h> extern pid_t safefork(); int main(void) { int pip[2]; pipe(pip); if (safefork()) { /* Foreldren */ char *melding = "Hei på deg!"; write(pip[1], melding, strlen(melding)+1); else { /* Barnet */ char buffer[20]; int n; n = read(pip[0], buffer, 20); printf("mottatt %d tegn: %s \n", n, buffer); exit(0); return 0; Kjøring Mottatt 12 tegn: Hei på deg! Dette fungerer fordi selve røret eksisterer «utenfor» prosessen; følgelig blir ikke røret kopiert av safefork, bare referansene i pip. Forelesning 5.4.2000 Ark 16 av 26

Fraktalprogrammet med rør Hovedprogrammet starter barneprosessene og henter så kolonner fra røret for å tegne dem ut. int main(int argc, char *argv[]) { int pip[2]; int n_done=0, n_proc, n, iy; time_t start_tid = time(null); col_data b; n_proc= argc <= 1? 1 : atoi(argv[1]); pipe(pip); for (n = 1; n <= n_proc; ++n) { if (safefork()==0) { gen_area(pip, NX*(n-1)/n_proc, NX*n/n_proc-1); exit(0); x147open(nx, NY); while (n_done < n_proc) { n = read(pip[0], &b, sizeof(b)); if (b.xpos >= 0) { for (iy = 0; iy < NY; ++iy) x147plot(b.xpos, iy, b.ycol[iy]); else ++n_done; x147sync(); if (x147done) exit(0); printf("det hele tok %d sekunder.\n", time(null)-start_tid); x147pause(); Forelesning 5.4.2000 Ark 17 av 26

For å redusere lesetiden sendes én og én kolonne med data over røret. typedef struct { int xpos; /* -1="finished" */ unsigned char ycol[ny]; col_data; Funksjonen gen area regner ut kolonnene i buf og skriver dem til røret etterpå. void gen_area(int pip[], int xstart, int xend) { float x, y; int ix, iy; col_data buf; for (ix = xstart; ix <= xend; ++ix) { buf.xpos = ix; x = x1 + ix*(x2-x1)/(nx-1); for (iy = 0; iy < NY; ++iy) { y = y1 + iy*(y2-y1)/(ny-1); buf.ycol[iy] = fraktal(x, y, 255.0, MAX); write(pip[1], &buf, sizeof(buf)); buf.xpos = -1; write(pip[1], &buf, sizeof(buf)); Når prosessen er ferdig, sendes en kolonne med xpos= 1for å markere dette. Forelesning 5.4.2000 Ark 18 av 26

Kjøretid Ikke-parallell tegning 26s frakpipe 1 23s frakpipe 2 12s frakpipe 3 10s frakpipe 4 10s frakpipe 6 9s Vurdering av rør Dataoverføring skjer gjennom rørene, en col data hver gang. Synkronisering skjer ved at tegneprogrammet blokkeres inntil det er data i røret, og så leser data derfra. + Enkel programmering. + Sikker synkronisering. Kallene på read og write koster litt (men mye mindre enn lesing og skriving av filer). Forusetter at alle prosessene startes av samme urprosess. Forelesning 5.4.2000 Ark 19 av 26

Flere mekanismer I «klassisk UNIX» erfilerogrørdeeneste kommunikasjonsmulighetene. Dette er ofte ikke nok. Utviklerne av System V-varianten av UNIX laget derfor en utvidelse kalt SVIPC («System V IPC»). Denne utvidelsen omfatter felles lager (omtales i dag) semaforer (omtales neste uke) meldinger Felles lager Et felles lager kan brukes av flere prosesser fordi det ligger utenfor de vanlige prosessene. Det fjernes heller ikke automatisk når prosessene er ferdige. IPC = «interprocess communication». Forelesning 5.4.2000 Ark 20 av 26

Opprettelse av felles lager Et felles lager ligger tilsynelatende i alle prosesser som har tilgang til det. Følgende operasjoner må til for å opprette et felles lager med plass til 2 int-verdier: #include <sys/ipc.h> #include <sys/shm.h> int sh_mem_id, *sh_mem; sh_mem_id = shmget(ipc_private, /* Nøkkel */ 2*sizeof(int), /* Størrelse */ 0700); /* Beskyttelse */ sh_mem = shmat(sh_mem_id,0,0); Verdiene er nå tilgjengelige som sh mem[0] og sh mem[1]. Forelesning 5.4.2000 Ark 21 av 26

Fjerning av et felles lager Et felles lager fjernes ikke automatisk når en prosess dør. Følgende kall må til: shmctl(sh_mem_id, IPC_RMID, 0); Sjekk det godt Hvis et program feilet, kan man sjekke om det finnes et felles lager som ikke ble fjernet: maskin navn> ipcs -m Shared Memory: T ID KEY MODE OWNER GROUP m 6901 0x00000000 --rw------ dag dag Da kan lageret fjernes med kommandoen maskin navn> ipcrm -m 6901 Husk: Felles lager er en meget begrenset ressurs! Forelesning 5.4.2000 Ark 22 av 26

En løsning med felles lager Hovedprogrammet oppretter det felles lageret og barneprosessene. Det leser også data fra lageret og tegner det ut. int main(int argc, char *argv[]) { int n_proc, n_done = 0, nc, iy; time_t start_tid = time(null); n_proc= argc <= 1? 1 : atoi(argv[1]); sh_mem_id = shmget(ipc_private,sizeof(col_data),0700); sh_mem = shmat(sh_mem_id,0,0); sh_mem->xpos = -2; x147open(nx, NY); for (nc = 1; nc <= n_proc; ++nc) { if (safefork()==0) { gen_area(nx*(nc-1)/n_proc, NX*nc/n_proc-1); exit(0); while (n_done < n_proc) { if (sh_mem->xpos >= 0) { for (iy = 0; iy < NY; ++iy) x147plot(sh_mem->xpos, iy, sh_mem->ycol[iy]); x147sync(); if (x147done) { shmctl(sh_mem_id, IPC_RMID, 0); exit(0); else if (sh_mem->xpos == -1) ++n_done; printf("det hele tok %d sekunder.\n", time(null)-start_tid); x147pause(); shmctl(sh_mem_id, IPC_RMID, 0); return 0; Forelesning 5.4.2000 Ark 23 av 26

Funksjonen gen area beregner farger og bygger opp buf. Når den er full, legges den i felles lager. void gen_area(int xstart, int xend) { float x, y; int ix, iy; col_data buf; for (ix = xstart; ix <= xend; ++ix) { buf.xpos = ix; x = x1 + ix*(x2-x1)/(nx-1); for (iy = 0; iy < NY; ++iy) { y = y1 + iy*(y2-y1)/(ny-1); buf.ycol[iy] = fraktal(x, y, 255.0, MAX); *sh_mem = buf; buf.xpos = -1; *sh_mem = buf; Forelesning 5.4.2000 Ark 24 av 26

Kjøring Resultatet blir imidlertid ikke pent, og verre jo flere prosesser vi har. Kjøringene avsluttes også oftest med x147 error: Illegal coordinates (-1,2). Dette skyldes manglende synkronisering mellom prosessene! Forelesning 5.4.2000 Ark 25 av 26

Vurdering Dataoverføring over felles lager fungerer fint. Synkronisering er ved hjelp av en variabel (sh mem->xpos) og det er for primitivt. Data går tapt! + Rask dataoverføring. Produsentene av data er ikke synkronisert med konsumenten! Konsumenten benytter aktiv venting! Mye tid kastes bort. Felles lager er fint til dataoverføringen, men vi trenger en synkroniseringsmekanisme. Den kommer neste uke! Forelesning 5.4.2000 Ark 26 av 26