Download præsentationen
Præsentation er lastning. Vent venligst
Offentliggjort afJohanne Laugesen Redigeret for ca. et år siden
1
DS-kursusgang nr. 4 IPC generelt IPC eksempel: beskedkøer IPC tidsforbrug: kontekstskift, skedulering C: abstraktion, funktionsbiblioteker
2
IPC i server klient boss worke r manag er server
3
Hvorfor IPC ? Processer har behov for at udveksle information Eksempler på kommunikation: boss-proces sender input data til "worker"-proces 1 proces fortæller ander processer: "jeg er i kritisk region, hold jer væk" ● administrator-proces fortæller boss-proces at en bruger skal have flere rettigheder
4
Implementation af IPC Processer har ikke umiddelbart adgang til hinandens data. På grund af indkapsling i adresserum. Derfor må IPC gå via operativsystemets systemkald. CDK: invocation (invokation (?) af en indkapslet ressource) Tråde i samme proces deler data er ikke IPC kræver ikke systemkald / invokation af indkapslet ressource
5
Forskellige metoder til IPC Den mest udbredte metode: sockets ● er en grænseflade til TCP/IP ● internt mellem processer på samme maskine ● mellem processer på forskellige maskiner ● understøttes af mange operativsystemer og sprog ● bruges af middleware til implementation af rpc, RMI, http, o.m.a. Andre metoder/faciliteter til IPC Message passing Signaler Delt hukommelse mellem separate processer Semaforer Pipes Filer (eks.: låsefiler)
6
Ren tekstbaseret kommunikation.. manager boss "hello.... grant privileges.... stop service.... raise priority of service.... bye" ● Nødvendigt at konstruere parser Mange fejlmuligheder, - mange fejl først vil vise sig på køretidspunktet ?
7
Fordele ved distribuerede objekter og fjernprocedurekald Højniveau-programmering lade systemet (oversætter, RMI,..) håndtere detaljer jf. løkker i stedet for GOTO-sætninger, Java i stedet for C,.. Typecheck vil afsløre fejl allerede på oversættelsestidspunktet "metoden gant_privileges findes ikke.." Muliggør udarbejdelse af abstrakt design Overordnet design kan abstrahere fra fordeling af objekter på processer og maskiner CORBA: højere abstraktionsniveau end RMI: uafhængig af programmeringssprog
8
DS-kursusgang nr. 4 IPC generelt IPC eksempel: beskedkøer IPC tidsforbrug: kontekstskift, skedulering C: abstraktion, funktionsbiblioteker
9
Grundlæggende om Unix beskedkøer Afsender- proces hej Modtager- proces.. msgsnd(,"hej",..);.. msgrcv(..);.. Stammer fra AT&T / System V Tilgås via systemkald: msgsnd(), msgrcv(), msgget(), msgctl() Afsender bruger msgsnd() og skal bl.a. angive den besked der ønskes afsendt hvilken kø der ønskes sendt til
10
Selve beskedkøen kan opfattes som et separat adresserum Bruger-proces 1 Bruger-proces 2 Kerne Beskedkø
11
Beskedkøer: features … Persistent (eksisterer uafhængigt af processer) Tilgås af vilkårligt mange processer Rettighedsstyring Valgfrihed ml. synkron/asynkron kommunikation Prioritet Andre egenskaber: ● beskeder forbruges ● afsenderproces får ikke besked om modtagelse/forbrug ● modtagerproces kan ikke (automatisk) se afsenderproces
12
Prioritet og synkronisering 12 … Prioritet: ● prioritetsværdi (P>0) angives af afsender som del af besked ● prioritetsparameter angives af modtager: ● 0: modtag uden prioritet (FIFO) ● X (X>0): modtag første besked med prioritetsværdi P=X ● -Y (Y>0): modtag første besked med P <= Y ● (diverse andre muligheder) Synkronisering: ● på modtagerside hvis der ikke er passende besked: ● bloker (synkron modtagelse) ● returner med passende (fejl)meddelelse (asynkron modtagelse) ● på afsenderside: bloker eller returner hvis manglende plads
13
Format af besked … struct m_struct { long int priority; char a[X] } Første attribut (long int) skal have positiv værdi Anden attribut (a) skal være char array Den ved erklæringen angivne længde (X) af arrayet er ligegyldig ● Antallet af bytes der sendes/modtages angives eksplicit af begge parter ● Dette antal bytes overføres uanset arrayets længde priority a a[o] a[1] 1 17 23
14
Format af besked: eksempler // Simpel besked struct tekst_besked { long int prioritet; char txt[40]; } // Kompleks besked struct ordre { long int rute; // hvilken flyrute ? char ordre[1]; // 'b' = bestil, 'a' = afbestil int antal; // antal billetter char navn[40]; // personen der afgiver ordren } - Vigtigt at typen ordre bruges af begge parter - Fejl hvis modtager læser ordre som tekst_besked
15
msgget() og msgctl: Oprettelse og nedlæggelse beskedkø Beskedkøer skal ● oprettes (via reference til globalt navn) ● have et navn (reference) i den enkelte proces ● tilknyttes rettigheder ● knyttes til processer som ressourcer ● (bruges) ● nedlægges msgget(, ) msgid = msgget(117,IPC_CREAT | 0666); /* opretter kø hvis ikke eksisterer + sætter rettigheder = rw-rw-rw- */ msgctl(,IPC_RMID,NULL);
16
Afsendelse // Simpel besked struct tekst_besked { long int prioritet; char txt[40]; }.. struct tekst_besked min_besked = {1,"hej"};.. msgsnd(,(void *)&min_besked,40, ); hvorfor pointer ?
17
Modtagelse msgrcv(,, );
18
Lighedspunkter i systemkald: beskedkøer ~ filbehandling start fd = open(,..)msqid = msgget(,..) operationFilerBeskedkøer brug read(fd,&buf,size) write(fd,&buf,size) msqsnd(msgid,&mess,siz,..) msgrcv(msqid,&mess,siz,..) slut close(fd)msgctl() Adskillelse ml. globalt navn og lokal reference Rettighedskontrol Filer og beskedkøer arbejder med pointere til blokke af data Blokkene kopieres af operativsystemet under systemkaldenes udførelse
19
Sammenligning filer/beskedkøer Generelle egenskaber Kapacitet ? Persistens ? Tilgængelighed ?
20
Ekstra: Filbehandling Filbehandling i C ikke med i kursets litteratur (hverken kursorisk eller 'almindelig'). Se: ● Muldner kapitel 5 ● Muldner-opgaver 5-1, 5-5, 5-11, 7-11 og 11-6.
21
Højniveau-læsning fra (almindelig) fil #include main () { int c; FILE *filehandle; if ((filehandle = fopen("myfile.c","r")) == NULL) exit(EXIT_FAILURE); while ((c = fgetc(filehandle)) != EOF) putchar(c); fclose(filehandle); } ● fopen/fclose/fgetc m.fl. arbejder med filer via en pointer til en FILE struktur som bl.a. rummer en buffer ● bemærk funktions-orienteret tilgang, modsat " filehandle.fgetc() " ● ungetc() lægger 1 tegn tilbage i bufferen (opgave 5-11)
22
Lavniveau-læsning fra fil #include main () { int c, fd, count = 1; fd = open("myfile.c",O_RDONLY); if (fd < 0) exit(EXIT_FAILURE); while ((count = read(fd,&c,1)) > 0) write(1,&c,1); close(fd); } open/read/write/close arbejder med filer via en fildeskriptorer man skal selv oprette en buffer symbolsk talkonstant
23
DS-kursusgang nr. 4 IPC generelt IPC eksempel: beskedkøer IPC tidsforbrug: kontekstskift, skedulering C: abstraktion, funktionsbiblioteker
24
Omkostninger ved IPC Tid - der kan være tidsmæssigt overhead pga.: ● kontekstskift ● skedulering ● netværksforsinkelse (men ikke ved beskedkøer) Plads - her er begrænsningerne: ● kapacitet af netværk ● størrelse af arbejdslager
25
Opgave 2: måling af tidsforbrug ved beskedkommunikation (t/r) 1 byte: 0,000.008 sekund 650 MHz Intel Pentium
26
16 B Samme tid
27
X KB 0,000.004 sekund (bruger-mode) 0,000.004 sekund (kerne-mode) + 0,000.004 sekund per KB (kerne-mode) Svinger +/- 10% Samlet tid lidt større (andre processer)
28
Synkronisering af processerne i opgave 2 Klient Server msgget() msgsnd() msgrcv() msgsnd() msgrcv() msgsnd() msgrcv() msgsnd() msgrcv()... 1 iteration: ● klient sender besked ● server modtager besked og echoer den tilbage ● klient modtager besked
29
Tidsforbrug ved message passing proces 1 msgget() tråde i bruger tilstandtråde i kerne tilstand trap til kernen for at privilegeret kode kan udføre msgget() skedulator vælger ny proces proces 2 msgget() Scenarie 1: oprettelse og tilkobling til kø
30
Tidsforbrug ved message passing proces 1 msgrcv(.., ) ● trap til kernen ● proces 1 blokeres (ingen passende besked) ● skedulator vælger ny proces proces 2 msgsnd() Scenarie 2: synkron læsning ● skedulator vælger proces 1 (af-blokerede processer prioriteres) ● proces 1 kopierer i kerne-mode proces 1
31
Tidsforbrug ved message passing: konklusion Tidsmæssigt overhead: ● kontekstskift ved alle basale operationer ● synkron kommunikation kan medføre ekstra invokation af skedulator Pladsmæssigt overhead: ● beskeder ligger og fylder op indtil de bliver læst/forbrugt
32
Skedulerings-politik Målsætning: Effektivitet (cpu-udnyttelse) CPU-en aktiv hele tiden processer der venter på i/o skal give plads til andre høj prioritet til processer der skifter tilstand fra blokeret til klar Målsætning: Lav svartid (interaktive brugere) lille kvantum retfærdighed ift. samlet forbrug ! Målsætning: Effektivitet (II) (færdiggørelse af processer) stort kvantum De to primære virkemidler er: ● størrelse af det tidskvantum, den enkelte proces skeduleres ad gangen ● prioritetsregler
33
Simpel skeduleringsmulighed: Round-Robin indenfor 1 kø kørendeklar Lav-niveau skedulator bruger simpel kø (FIFO) af processer der er klar lsftpcc ftpccls ftpccls
34
Fordel ved stort tidskvantum P1 (1 kvantum)P2 (1 kvantum) Proces- skift Proces- skift... Minimering af spildtid - tid til processkift er lille i forhold til tidskvantum
35
Fordel ved lille tidskvantum P1P2 Proces- skift Proces- skift... P117 Hvornår bliver det min tur ? Et lille tidskvantum er vigtigt for lavere svartid til interaktive processer forudsat: det pgld. input kan behandles inden for 1 tidskvantum der er mange processer processer, der har været i/o-blokerede, ikke prioriteres systematisk
36
Dynamisk prioritet: placering af ikke-blokerede processer i prioritetsklasser ftp ls cc Httpd ikke med da den er i klasse for sig pga. høj statisk prioritet Prioritet 4 Prioritet 3 Prioritet 1 Har ventet på disk input Har ventet på terminal input Har brugt megen cpu-tid Prioritet 2
37
Skedulering - opsummering Enkelte særligt vigtige processer kan give forrang med statisk prioritet f.eks. webserverproces Alle andre processer har principielt lige adgang til cpu-en Størrelsen af tidskvantum vælges som kompromis Dynamisk prioritet bruges til finjustering undgå nedprioritering af processer der blokeres ofte sikre en (begrænset) nedprioritering af processer der har kørt længe
38
DS-kursusgang nr. 4 IPC generelt IPC eksempel: beskedkøer IPC tidsforbrug: kontekstskift, skedulering C: abstraktion, funktionsbiblioteker
39
Abstraktion i C Eksempel: Vi ønsker at skjule detaljerne vedr. beskedkøer (parametrene til systemkaldene) I det enkelte beskedkø-program bruger vi altid de samme flag m.m. ● Beskeder har altid prioritet = 1 ● Modtager læser altid u-prioriteret ● Rettigheder er altid rw-rw-rw- ● etc. C er et imperativt sprog uden klasser. ● den væsentligste mekanisme til abstraktion er funktioner: ● send() kan kalde msgsnd() med faste parametre ● definition og erklæring af send() i separate filer
40
Struktur af C-programmer #include void klient(..); int main(..) {..} void klient(..) {..} En C-kildetekstfil ("oversættelsesenhed") indeholder: direktiver (#include, #define) til præprocessoren erklæringer bl.a. af funktioner og globale variable definitioner af funktioner (jf. metoder i Java) Et oversat C-program (flere filer) skal indeholde: 1 main-funktion
41
Definition af funktioner void klient(..,..); int main(int argc,char *argv[]) {..} void klient(..,..) {..} void betyder at funktionen ikke har returværdi. argc er antallet af parametre (inkl. programnavnet selv) argc parameteroverføres da arrayet selv ikke har informationen char *argv[] er en erklæring af argv som : et array af tegn-pointere = et array af strenge
42
Erklæring af funktioner I programteksten bør en funktion erklæres før den kaldes, enten ved dens definition eller ved en prototype (helst). (definitionen kan include's fra en headerfil) Prototypen skal angive samme signatur, dvs. typer af parametre og eventuel returværdi, mens navne på parametre er ligegyldige (og kan udelades). Prototyper anbringes meget ofte i såkaldte header-filer (.h). void klient(..,int); int main(..,..) {.. klient(..,1000000);.. } void klient(..,int iterationer) {.. }
43
Erklæring + definition af funktioner i separate filer /* beskeder.h */ struct besked { long int prioritet; char a[2048] } int send(besked * bsk,int antal_byte); /* beskeder.c */ int send(besked * bsk,int antal_byte) { msgsnd(..); }
44
OO-lignende programstruktur /* beskeder.h */ struct besked { long int prioritet; char a[2048] } #define MIN_PRIORITET 1 #define MIT_MSGGET_FLAG 0666|IPC_CREAT int init_besked(besked *bsk); int send(besked * bsk,int antal_byte); Datastruktur X og alle tilhørende funktioner og macroer m.m.: ● x.h: erklæring af funktioner, definition af macroer ● x.c: definition af funktioner ● Svarer til gruppering af klasse X's metoder og attributter
45
Erklæring + definition af funktioner: er der noget galt ? int f1(); int main(..,..) { int a = f1(); }
46
Erklæring + definition af funktioner: svar int f1(); int main(..,..) { int a = f1(); } Fejl: der mangler en definition af f1(). Hvem detekterer fejlen ? gcc -c f.c # ikke en fejl ifølge oversætter # -c betyder 'kun oversætter' gcc -o f f.o # men en fejl ifølge linker, # som terminerer med fejlværdi # -o betyder 'outputfil' gcc -o f f.c # oversættelse + linkning i 1 kald #.c indikerer C kildetekst
47
Erklæring + definition af funktioner: er der noget galt ? int f2(int); int f2(int, int); int main(..,..) { int a = f2(0); int b = f2(0,0); } int f2(..) {..;} int f2(..,..) {..;}
48
Erklæring + definition af funktioner: svar int f2(int); int f2(int, int); int main(..,..) { int a = f2(0); int b = f2(0,0); } int f2(..) {..;} int f2(..,..) {..;} Fejl: et funktionsnavn kan ikke overloades.
49
Erklæring + definition af funktioner: er der noget galt ? int f3(); int f4(); int main(..,..) { int a = f3(0); int b = f4(); } int f3() {..;} int f4(int c) {..;}
50
Erklæring + definition af funktioner: svar int f3(); int f4(); int main(..,..) { int a = f3(0); int b = f4(); } int f3() {..;} int f4(int c) {..;} Ingen fejl. Erklæringen af f3/f4 betyder at antallet af parametre ikke er fastlagt ● overskydende aktuelle parametre bruges ikke ● overskydende formelle parametre instantieres ikke ● for at fastlægge tom parameterliste kræves i stedet brug af f(void)
51
Erklæring + definition af funktioner: er der noget galt ? int main(..,..) { f5(); } void f5() {..;}
52
Erklæring + definition af funktioner: svar int main(..,..) { f5(); } void f5() {..;} ● OK at der ikke er eksplicit erklæring (men kun implicit erklæring via kaldet). ● Men advarsel for at implicit erklæring ikke matcher definition: Den implicitte erklæring fortolkes som en erklæring af en integer-funktion (default).
53
Erklæring + definition af funktioner: er der noget galt ? void f6(void); int main(..,..) { f6(); } void f6(void) {return 0;}
54
Erklæring + definition af funktioner: svar void f6(void); int main(..,..) { f6(); } void f6(void) {return 0;} Oversætter advarer om at der returneres en værdi på trods af void-type.
55
Genbrug af klasser/funktioner Java: Klasser samles i pakker, og evt. jar-filer Genbrugs-program oversættes Bruger-program (inkl. importsætning) oversættes g.javag.class b.javab.class
56
Oversættelse i C = egentlig oversættelse + linkning myprogr.cmyprogr.omyprogr cc -c myprogr.ccc -o myprogr myprogr.o.o-filer: objektfiler = maskinkode men ikke linket, dvs. har ikke adresser på definitioner af eksterne funktioner, hvilket muliggør inkremental oversættelse Flag: flaget -c betyder: spring link-fasen over flaget -o betyder: placer output i den angivne fil (første parameter) hvorvidt cc -o er oversættelse eller oversættelse+linkning afgør oversætteren ud fra endelsen af inputfil cc -o myprogr myprogr.c
57
Oversættelse Hvad er input og output til C-oversætteren/linkeren ? cc -o hello hello.o world.o Hvad er forskellen i forhold til cc -o hello world.o hello.o
58
Genbrug af C-funktion uden bibliotek getline.c myprogr.c getline.o myprogr.omyprogr cc -c getline.c cc -c myprogr.ccc -o myprogr myprogr.o getline.o Ved at liste getline.o som parameter til linkningen kommer definitionerne i getline.o med i myprogr (statisk linkning) ● objektfiler linkes 1 ad gangen, hvorunder udefinerede symboler (funktioner) akkumuleres og resolveres i tekstlig rækkefølge
59
Genbrug af C-funktioner v.hj.a. biblioteker f2.c p.c f2.o p.op ar crv lib.a f1.o f2.o Ved at liste lib.a som parameter til linkningen kommer de relevante definitionerne i lib.a med i p (stadig statisk linkning) f1.cf2.olib.a cc -o p p.o lib.a
Lignende præsentationer
© 2024 SlidePlayer.dk Inc.
All rights reserved.