datalogi 1f forår 2003 multiprogrammering[4]
DESCRIPTION
Datalogi 1F Forår 2003 Multiprogrammering[4]. Kerner og processer Jørgen Sværke Hansen [email protected]. Planen for i dag. C/C++ eftermiddage? Repetition af kerner med afbrydelser Kerner med tvungent processkift Eksempel på anvendelse af processer/tråde i en web-server. C/C++ eftermiddage. - PowerPoint PPT PresentationTRANSCRIPT
![Page 2: Datalogi 1F Forår 2003 Multiprogrammering[4]](https://reader035.vdocuments.pub/reader035/viewer/2022070409/56814499550346895db1405d/html5/thumbnails/2.jpg)
Datalogi 1F: Multiprogrammering[4]
2
Planen for i dag
• C/C++ eftermiddage?
• Repetition af kerner med afbrydelser
• Kerner med tvungent processkift
• Eksempel på anvendelse af processer/tråde i en web-server
![Page 3: Datalogi 1F Forår 2003 Multiprogrammering[4]](https://reader035.vdocuments.pub/reader035/viewer/2022070409/56814499550346895db1405d/html5/thumbnails/3.jpg)
Datalogi 1F: Multiprogrammering[4]
3
C/C++ eftermiddage
• Et kursus i C++ programmering med fokus på programmering af kerner
• To ”teoretiske” øvelsesgange– en gang er sat til 11/3: 15-17– anden/første gang sidst i uge 10 eller i
uge 11
![Page 4: Datalogi 1F Forår 2003 Multiprogrammering[4]](https://reader035.vdocuments.pub/reader035/viewer/2022070409/56814499550346895db1405d/html5/thumbnails/4.jpg)
Datalogi 1F: Multiprogrammering[4]
4
Kerner med afbrydelser• Vi erstatter aktiv venten med:
– ventende processer placeres i ventekøer– afbrydelser aktiverer ventede processer
ved at flytte dem til klarkøen
• Bedre udnyttelse af CPU• Introduktion af parallelisme i kernen:
– afbrydelsesroutiner kan udføres når som helst (undtagen når vi lukker for afbrydelser)
– fokus på kritiske regioner
![Page 5: Datalogi 1F Forår 2003 Multiprogrammering[4]](https://reader035.vdocuments.pub/reader035/viewer/2022070409/56814499550346895db1405d/html5/thumbnails/5.jpg)
Datalogi 1F: Multiprogrammering[4]
5
Kerne med afbrydelser
KInitProc(…) KReadyQKSleep() KCurProcKPause()KSelectNewProcess()KInterruptHandler()
KInitSem() KReadChar()KWait() KWriteChar()KSignal()
KReadLine()KWriteLine()
readerProcwriterProc
KReadQKWriteQ
![Page 6: Datalogi 1F Forår 2003 Multiprogrammering[4]](https://reader035.vdocuments.pub/reader035/viewer/2022070409/56814499550346895db1405d/html5/thumbnails/6.jpg)
Datalogi 1F: Multiprogrammering[4]
6
Tætkoblede drivprogrammer• Hver slags hændelse (tegn skrevet,
tegn læst, …) er tilknyttet en ventekø:
char KReadChar() {
while(!(rdio(com1lsr) & 0x01))
KPause(KReadQ);
return rdio(com1Rbr);
}
![Page 7: Datalogi 1F Forår 2003 Multiprogrammering[4]](https://reader035.vdocuments.pub/reader035/viewer/2022070409/56814499550346895db1405d/html5/thumbnails/7.jpg)
Datalogi 1F: Multiprogrammering[4]
7
Synkronisering med ydre enheder
void KInterruptHandler() {if( rdio(com1Iir) & 2)
while(!KReadQ.isEmpty())
KReadyQ.Put(KReadQ.Get());else if( rdio(com1Iir) & 4)
while(!KWriteQ.isEmpty())
KReadyQ.Put(KWriteQ.Get());}
![Page 8: Datalogi 1F Forår 2003 Multiprogrammering[4]](https://reader035.vdocuments.pub/reader035/viewer/2022070409/56814499550346895db1405d/html5/thumbnails/8.jpg)
Datalogi 1F: Multiprogrammering[4]
8
Uheldig rækkefølge<KReadChar>
while(!(rdio(com1lsr) & 0x01))<UART>
sætter ready-bit<KInterruptHandler>
while(!KWaitQ.isEmpty())<KReadChar>
KPause(KReadQ);<KSelectNewProcess>
<sætter proces i ventekø>AAAAARGH: vi opdager ikke at tegnet er læst
![Page 9: Datalogi 1F Forår 2003 Multiprogrammering[4]](https://reader035.vdocuments.pub/reader035/viewer/2022070409/56814499550346895db1405d/html5/thumbnails/9.jpg)
Datalogi 1F: Multiprogrammering[4]
9
Problem
• Vi har to parallelle processer:– brugerproces– afbrydelsesroutine
der deler data:– kontrolregistre– proceskøer
• Vi må sikre udelelig udførsel af kritiske regioner
![Page 10: Datalogi 1F Forår 2003 Multiprogrammering[4]](https://reader035.vdocuments.pub/reader035/viewer/2022070409/56814499550346895db1405d/html5/thumbnails/10.jpg)
Datalogi 1F: Multiprogrammering[4]
10
Implementering af udelelighed• Luk for afbrydelser:char KReadChar() {
forbid(); while(!(rdio(com1lsr) & 0x01))
KPause(KReadQ);char ch = rdio(com1Rbr);permit();return ch;
}
• Nu bliver vi ikke afbrudt mellem check af statusregister og KWaitQ.Put()
• Men hvor bliver er åbnet for afbrydelser?
![Page 11: Datalogi 1F Forår 2003 Multiprogrammering[4]](https://reader035.vdocuments.pub/reader035/viewer/2022070409/56814499550346895db1405d/html5/thumbnails/11.jpg)
Datalogi 1F: Multiprogrammering[4]
11
Ny KPause• KPause skal skifte afbrydelsesniveau (ipl er en
del af processens tilstand):void KPause() {<gem afbrydelsesniveau i PKB>;<gem registre på stakken>;<gem stakpeger i PKB>;<find ny proces>;<gendan stakpeger fra PKB>;<gendan registre>;<gendan afbrydelsesniveau fra PKB>;
}
![Page 12: Datalogi 1F Forår 2003 Multiprogrammering[4]](https://reader035.vdocuments.pub/reader035/viewer/2022070409/56814499550346895db1405d/html5/thumbnails/12.jpg)
Datalogi 1F: Multiprogrammering[4]
12
Andre routiner derskal beskyttes?
• Afbrydelsesroutiner og alm. kernefunktioner deler køstrukturer
• Beskyt køoperationerne:
int isEmpty() { int oldipl = forbid(); int b = (size == 0); permit(oldipl); return b;};
![Page 13: Datalogi 1F Forår 2003 Multiprogrammering[4]](https://reader035.vdocuments.pub/reader035/viewer/2022070409/56814499550346895db1405d/html5/thumbnails/13.jpg)
Datalogi 1F: Multiprogrammering[4]
13
Kerner med tvungent processkift• Indtil nu har vi kun set på kerner med
frivilligt processkift via KPause()
• En afbrydelsesroutine sætter processen i klarkøen, men der kan gå lang tid inden den aktive proces opgiver CPU’en
• Vi vil tvinge et processkift som en del af afbrydelsen:– dette sikrer hurtigere behandling af
afbrydelser
![Page 14: Datalogi 1F Forår 2003 Multiprogrammering[4]](https://reader035.vdocuments.pub/reader035/viewer/2022070409/56814499550346895db1405d/html5/thumbnails/14.jpg)
Datalogi 1F: Multiprogrammering[4]
14
Ny afbrydelsesprocedure
void KInterruptHandler() { if(rdio(com1Iir) & 2)
KSleep (KReadyQ, KReadQ);
else if(rdio(com1Iir) & 4)
KSleep (KReadyQ, KWriteQ);
……
}Fejl i kursusbog bind 4 side 74
![Page 15: Datalogi 1F Forår 2003 Multiprogrammering[4]](https://reader035.vdocuments.pub/reader035/viewer/2022070409/56814499550346895db1405d/html5/thumbnails/15.jpg)
15
KSleep og vennerQueue<Process>* KPutQ, KGetQ;
void KSleep(Queue<Process>& put, Queue<Process>& get) { KPutQ = &put, KGetQ = &get; KPause();}
Registers* KSelectNewProcess (Registers* sp) { KCurProc->sp = sp; KPutQ->Put(KCurProc); KCurProc = KGetQ->Get(); return KCurProc->sp;}
![Page 16: Datalogi 1F Forår 2003 Multiprogrammering[4]](https://reader035.vdocuments.pub/reader035/viewer/2022070409/56814499550346895db1405d/html5/thumbnails/16.jpg)
16
Tvungent processkift - eksempel
AP: printl()
AP: KWriteChar
AP:BP1_start()
AP: KPause
BP1 sp
AP: Wait(sem)
AP:BP2_start()
BP2 sp
AP: ent_int
AP:KInterruptH…
PAL stakrammeP2
AP:KPause
Registre P2
AP:KSelectNewP… AP: KSleep
AP:KWriteLine
AP:KSelectNewP…
afbrydelse
Skift:• stakpeger• afbrydelsesniveau
Processkift sker EFTERbehandling af og kvittering forafbrydelse
a2a1a0gppcps
![Page 17: Datalogi 1F Forår 2003 Multiprogrammering[4]](https://reader035.vdocuments.pub/reader035/viewer/2022070409/56814499550346895db1405d/html5/thumbnails/17.jpg)
Datalogi 1F: Multiprogrammering[4]
17
SemaforroutinerNu kan vores semaforroutiner også bliveafbrudt: void KWait (KSem *sem) { if (!sem) KSleep(sem->WaitQ, KReadyQ); sem--; }• Førhen var dette sikkert fordi
afbrydelser ikke rørte ved semaforerne• Men nu kan en vilkårlig proces blive
afbrudt
![Page 18: Datalogi 1F Forår 2003 Multiprogrammering[4]](https://reader035.vdocuments.pub/reader035/viewer/2022070409/56814499550346895db1405d/html5/thumbnails/18.jpg)
En anden uheldig rækkefølge<BP1>
if(!sem) <antag sem == 1><Afbrydelse>
KPause(KReadyQ, KReadQ);. . . . . . <BP2>
<if(!sem)> <sem stadig == 1><BP2>
sem--;<Afbrydelse>
KPause(KReadyQ, KWriteQ);. . . . . . <BP1>
sem--;UUUPS:
der er 2 processer i kritisk region!!
![Page 19: Datalogi 1F Forår 2003 Multiprogrammering[4]](https://reader035.vdocuments.pub/reader035/viewer/2022070409/56814499550346895db1405d/html5/thumbnails/19.jpg)
Datalogi 1F: Multiprogrammering[4]
19
Nye semaforroutinerNu kan vores semaforroutiner ikke mereblive afbrudt:
void KWait (KSem *sem) {
forbid(); if (!sem) KSleep(sem->WaitQ, KReadyQ); sem--;
permit(); }
![Page 20: Datalogi 1F Forår 2003 Multiprogrammering[4]](https://reader035.vdocuments.pub/reader035/viewer/2022070409/56814499550346895db1405d/html5/thumbnails/20.jpg)
Datalogi 1F: Multiprogrammering[4]
20
Andre routiner derhar problemer?
• Måske KSleep generelt?• Kan vi klare at skifte proces mens vi skifter
proces? Registers* KSelectNewProcess
(Registers* sp) {
KCurProc->sp = sp;
KPutQ->Put(KCurProc);
KCurProc = KGetQ->Get();
return KCurProc->sp;
}
• De to globale variable KPutQ og KGetQ ser suspekte ud
![Page 21: Datalogi 1F Forår 2003 Multiprogrammering[4]](https://reader035.vdocuments.pub/reader035/viewer/2022070409/56814499550346895db1405d/html5/thumbnails/21.jpg)
Datalogi 1F: Multiprogrammering[4]
21
Endnu en uheldig rækkefølge<BP1>< KSleep(KReadyQ, myWaitQ) >< KPutQ = KReadyQ, KGetQ = myWaitQ >
<Afbrydelse>< KSleep(KReadyQ, KReadQ) >< KPutQ = KReadyQ, KGetQ = KReadQ >
<BP4>. . . . . .< KSleep(KReadQ, KReadyQ) >< KPutQ = KReadQ, KGetQ = KReadyQ >
<BP1>< KSelectNewProcess >< Sætter sig selv på KReadQ men
aktiverer proces fra KReadyQ >
![Page 22: Datalogi 1F Forår 2003 Multiprogrammering[4]](https://reader035.vdocuments.pub/reader035/viewer/2022070409/56814499550346895db1405d/html5/thumbnails/22.jpg)
Datalogi 1F: Multiprogrammering[4]
22
Morale• Man skal være forsigtig!!!!• Identificer alle variable der deles mellem
afbrydelsesroutiner og alm. kerneroutiner
• Foretag sikring af kritiske regioner
• Ved aflusning af kerner (f.eks. K1) kan det være en god ide at starte med helt at lukke for afbrydelser i kernen og så langsom bløde det op
![Page 23: Datalogi 1F Forår 2003 Multiprogrammering[4]](https://reader035.vdocuments.pub/reader035/viewer/2022070409/56814499550346895db1405d/html5/thumbnails/23.jpg)
Datalogi 1F: Multiprogrammering[4]
23
Kerner med periodisk processkift• Hidtil har vi udskiftet den kørende proces
ved afbrydelse fra I/O enhed:– Har vi kun en CPU tung proces, er det fint nok,
da den vil blive afbrudt– Men hvis vi har flere, kan der stadig gå lang tid
inden en ventende proces ”kommer til fadet”• KPause() kaldes typisk som led i et
systemkald:– ved hvert systemkald kunne man undersøge
om en proces har kørt for længe, og derefter kalde KPause
• Hvad med beregningstunge processer, der sjældent bruger systemkald?– Kræv at de skal indsætte frivillige processkift– Tving dem væk fra CPU’en
![Page 24: Datalogi 1F Forår 2003 Multiprogrammering[4]](https://reader035.vdocuments.pub/reader035/viewer/2022070409/56814499550346895db1405d/html5/thumbnails/24.jpg)
Datalogi 1F: Multiprogrammering[4]
24
Implementering af periodisk processkift
void KInterruptHandler (ulong a0) { if ( a0 & 0x01) KSleep(KReadyQ, KReadyQ); else . . . . . . }
• Hver gang uret afbryder puttes den aktive proces bagerst i klarkøen (round robin)
• Men hvad hvis der ingen aktiv proces er?
![Page 25: Datalogi 1F Forår 2003 Multiprogrammering[4]](https://reader035.vdocuments.pub/reader035/viewer/2022070409/56814499550346895db1405d/html5/thumbnails/25.jpg)
Datalogi 1F: Multiprogrammering[4]
25
Tomgangsprocessen• For at sikre, at der altid er en proces i
klarkøen, har vi en tomgangsproces:
void KIdleProcess { for(;;;) KSleep(KReadyQ,KReadyQ);
}
• men man kunne nu stadig bruge en venteløkke i selve KSelectNewProcess
![Page 26: Datalogi 1F Forår 2003 Multiprogrammering[4]](https://reader035.vdocuments.pub/reader035/viewer/2022070409/56814499550346895db1405d/html5/thumbnails/26.jpg)
Datalogi 1F: Multiprogrammering[4]
26
Brug af to sikkerhedsniveauer• Hardware indeholder en
eller flere bits, der viser sikkerhedsniveau, f.eks. (0) brugertilstand og (1) kernetilstand
• Ved afbrydelser skiftes til kernetilstand, f.eks. ved en trap operation
• Specielle privilegerede instruktioner kan kun udføres i kernetilstand, typisk instruktioner der har med ressourcedeling at gøre
kernetilstand
brugertilstand
trap/exception
skift tilbrugerniveau
![Page 27: Datalogi 1F Forår 2003 Multiprogrammering[4]](https://reader035.vdocuments.pub/reader035/viewer/2022070409/56814499550346895db1405d/html5/thumbnails/27.jpg)
Datalogi 1F: Multiprogrammering[4]
27
2 slags stakke• Når brugerprogrammer udføres i
brugertilstand benytter de en brugerstakpeger
• Systemkald samt afbrydelser udføres i kernetilstanden og benytter en kernestakpeger
• Kernestakpegeren peger på et andet lagerområde end brugerstakpegeren
• Kerne sp vil typisk være beskyttet mod skrivning og læsning fra brugertilstand
• Skiftet mellem stakpegerne foretages på Alphaerne af PAL koden ved skift mellem bruger og kernetilstand
![Page 28: Datalogi 1F Forår 2003 Multiprogrammering[4]](https://reader035.vdocuments.pub/reader035/viewer/2022070409/56814499550346895db1405d/html5/thumbnails/28.jpg)
Datalogi 1F: Multiprogrammering[4]
28
Brugerstak og kernestakeksempel
AP: calc()
AP: ent_int
AP: calc()
AP:KInterruptH…
AP:BP1_start()
PAL stakramme
BP1 sp
kerne sp
PAL registre:bruger sp: BP1 spkerne sp: 0x200000
BP1_start(void) { calc(t3_root);}
PAL registre:bruger sp: ikke def.kerne sp: 0x200000
afbrydelse
$sp = kerne spkerne sp = $sp$sp = bruger sp
![Page 29: Datalogi 1F Forår 2003 Multiprogrammering[4]](https://reader035.vdocuments.pub/reader035/viewer/2022070409/56814499550346895db1405d/html5/thumbnails/29.jpg)
Datalogi 1F: Multiprogrammering[4]
29
Processkift i afbrydelsesproceduren
• Hvis vi ønsker at skifte proces i en afbrydelsesprocedure skal vi dels:– gemme kørende proces’ tilstand– ændre brugerstakpeger i PAL register– gendanne nye proces’ tilstand
• Ændring af bruger sp er nemt:– PAL_rdusp læser bruger stakpeger fra PAL
register– PAL_wrusp skriver en ny bruger stakpeger til
PAL register• Men processernes tilstande omfatter:
– PAL stakramme– Registre gemt af ent_int (afbrydelsesniveau)
![Page 30: Datalogi 1F Forår 2003 Multiprogrammering[4]](https://reader035.vdocuments.pub/reader035/viewer/2022070409/56814499550346895db1405d/html5/thumbnails/30.jpg)
Datalogi 1F: Multiprogrammering[4]
30
Skift mellem stakke vedprocesskift under afbrydelse
Vi ser på fire eksempler• Skift mellem processer i brugertilstand:
– én kernestak– en kernestak pr proces
• Processkift med en proces i systemtilstand og en i brugertilstand
• Processkift ved indlejrede afbrydelser, f.eks.:– først afbrydelse fra UART (ipl 3)– KInterruptHandler afbrydes af uret (ipl 5)
![Page 31: Datalogi 1F Forår 2003 Multiprogrammering[4]](https://reader035.vdocuments.pub/reader035/viewer/2022070409/56814499550346895db1405d/html5/thumbnails/31.jpg)
31
PAL registre:bruger sp: XXXXXkerne sp: 0x200000
2 processer i brugertilstand:én kernestak
AP: calc()
AP: ent_int
AP: calc()
AP:KInterruptH…
AP:BP1_start()
PAL stakrammeP2
AP:KSelectNewP…
BP1 sp
kerne sp
AP: calc()
AP: calc()
AP:BP2_start()
BP2 sp
PAL registre:bruger sp: BP2 spkerne sp: 0x200000
PAL registre:bruger sp: BP1 spkerne sp: 0x200000
afbrydelse
Registre P2
PAL stakrammeP1
Registre P1Gem kopi af BP2s kernestak (f.eks. på brugerstakken)Gendan kopi af BP1s kernestak
![Page 32: Datalogi 1F Forår 2003 Multiprogrammering[4]](https://reader035.vdocuments.pub/reader035/viewer/2022070409/56814499550346895db1405d/html5/thumbnails/32.jpg)
32
2 processer i brugertilstand:en kernestak per proces
AP: calc()
AP: ent_int
AP: calc()
AP:KInterruptH…
AP:BP1_start()
AP:KSelectNewP…
BP1 sp
kerne sp
AP: calc()
AP: calc()
AP:BP2_start()
BP2 sp
afbrydelse
PAL stakrammeP1
Registre P1
AP: ent_int
AP:KInterruptH…
PAL stakrammeP2
AP:KSelectNewP…
kerne sp
Registre P2
PAL registre:bruger sp: BP2 spkerne sp: 0x200000
PAL registre:bruger sp: BP1 spkerne sp: 0x220000
PAL registre:bruger sp: XXXXXkerne sp: 0x200000
PAL registre:bruger sp: BP1 spkerne sp: 0x200000
![Page 33: Datalogi 1F Forår 2003 Multiprogrammering[4]](https://reader035.vdocuments.pub/reader035/viewer/2022070409/56814499550346895db1405d/html5/thumbnails/33.jpg)
33
2 processer: en i brugertilstand ogen i kernetilstand
AP: ent_sys
AP: printl()
AP: KWriteChar
AP:BP1_start()
AP: KPause
BP1 sp
kerne sp
AP: calc()
AP:BP2_start()
BP2 sp
afbrydelse
PAL stakrammeP1
Registre P1
AP: ent_int
AP:KInterruptH…
PAL stakrammeP2
AP:KSelectNewP…
kerne sp
Registre P2
AP:KSelectNewP…
AP: KPause
Skift:• brugerstakpeger• aktiv stakpeger• afbrydelsesniveau
![Page 34: Datalogi 1F Forår 2003 Multiprogrammering[4]](https://reader035.vdocuments.pub/reader035/viewer/2022070409/56814499550346895db1405d/html5/thumbnails/34.jpg)
34
Indlejrede afbrydelser
AP: ent_int
AP:KInterruptH…
PAL stakrammeP2
kerne sp Registre P2
AP: ent_int
AP:KInterruptH…
PAL stakrammeP2
Registre P2
AP:KSelectNewP…
AP: KPause
AP: calc()
AP: calc()
AP:BP2_start()
BP2 sp
afbrydelse
Er flag for processkift sat og er vi den sidsteafbrydelse?
AP:KSelectNewP…
AP: KPause
Så kan vi skifte tilen anden proces
afbrydelseVi sætter et flag, derfortæller at vi skalforetage et processkift
Duer ikke – vi var alleredei gang med at behandle etinterrupt
![Page 35: Datalogi 1F Forår 2003 Multiprogrammering[4]](https://reader035.vdocuments.pub/reader035/viewer/2022070409/56814499550346895db1405d/html5/thumbnails/35.jpg)
Datalogi 1F: Multiprogrammering[4]
35
Indlejrede afbrydelser
• Hvordan ved man at man er det ”eneste” interrupt?
• På stakken ligger et statusregister, der fortæller hvad afbrydelsesniveau var inden den aktuelle afbrydelse:– ipl == 0 => ingen forudgående afbrydelser
![Page 36: Datalogi 1F Forår 2003 Multiprogrammering[4]](https://reader035.vdocuments.pub/reader035/viewer/2022070409/56814499550346895db1405d/html5/thumbnails/36.jpg)
36
Linux tomgangsprocesvoid cpu_idle (void) {init_idle();current->nice = 20;current->counter = -100;
while (1) {void (*idle)(void) = pm_idle;if (!idle)
idle = default_idle;while (!current->need_resched)
idle();schedule();check_pgt_cache();
}}
![Page 37: Datalogi 1F Forår 2003 Multiprogrammering[4]](https://reader035.vdocuments.pub/reader035/viewer/2022070409/56814499550346895db1405d/html5/thumbnails/37.jpg)
Datalogi 1F: Multiprogrammering[4]
37
Multiprogrammeringseksempel: web server
klient
klientklient
klient
klient
klient
klient
server
![Page 38: Datalogi 1F Forår 2003 Multiprogrammering[4]](https://reader035.vdocuments.pub/reader035/viewer/2022070409/56814499550346895db1405d/html5/thumbnails/38.jpg)
Datalogi 1F: Multiprogrammering[4]
38
Klient-server kommunikation
Skab forespørgsel
Afkod forespørgsel
Behandl forespørgsel
Beregn svar
forespørgsel
svar
Behandl svar
Klient Server
![Page 39: Datalogi 1F Forår 2003 Multiprogrammering[4]](https://reader035.vdocuments.pub/reader035/viewer/2022070409/56814499550346895db1405d/html5/thumbnails/39.jpg)
Datalogi 1F: Multiprogrammering[4]
39
Netværksserver: struktur
Protokolstak
Serverapplikation
Protokolstak
Foresp. svar
Demultipleksning afIndkommende forespørgsler(opret forbindelse)
Afkod forespørgsel,Behandl forespørgsel,Beregn svar
Netværksserver
![Page 40: Datalogi 1F Forår 2003 Multiprogrammering[4]](https://reader035.vdocuments.pub/reader035/viewer/2022070409/56814499550346895db1405d/html5/thumbnails/40.jpg)
Datalogi 1F: Multiprogrammering[4]
40
Enkelttrådet server• Nemt at programmere• En forespørgsel ad gangen• Ingen parallelisme
AfkodForesp.
Generersvar
Konstruerheader
læsdata
Fsp svar
Behandel forespørgsel
![Page 41: Datalogi 1F Forår 2003 Multiprogrammering[4]](https://reader035.vdocuments.pub/reader035/viewer/2022070409/56814499550346895db1405d/html5/thumbnails/41.jpg)
Datalogi 1F: Multiprogrammering[4]
41
Server med flere processer
Fsp Svar
AfkodForesp.
Generersvar
Konstruerheader
Læsdata
AfkodForesp.
Generersvar
Konstruerheader
Læsdata
AfkodForesp.
Læsdata
Generersvar
Konstruerheader
![Page 42: Datalogi 1F Forår 2003 Multiprogrammering[4]](https://reader035.vdocuments.pub/reader035/viewer/2022070409/56814499550346895db1405d/html5/thumbnails/42.jpg)
Datalogi 1F: Multiprogrammering[4]
42
Server med flere processer
• En proces per forespørgselresulterer i:• Høj grad af parallelisme• Spildtid på grund af
procesoprettelse/nedlæggelse (brug pulje af processer)• Spildtid pga. processkedulering• Det er vanskeligt at dele
ressourcer (data)• Synkronisering er nødvendigt
![Page 43: Datalogi 1F Forår 2003 Multiprogrammering[4]](https://reader035.vdocuments.pub/reader035/viewer/2022070409/56814499550346895db1405d/html5/thumbnails/43.jpg)
Datalogi 1F: Multiprogrammering[4]
43
Flertrådet server• En server proces • En tråd per forespørgsel• God parallelisme• Lav omkostning ved brugertråde• Delt hukommelse• Synkronisering er stadig nødvendig
Afkodforesp.
Generersvar
Konstruerheader
Læsdata
Forsp
Svar
![Page 44: Datalogi 1F Forår 2003 Multiprogrammering[4]](https://reader035.vdocuments.pub/reader035/viewer/2022070409/56814499550346895db1405d/html5/thumbnails/44.jpg)
Datalogi 1F: Multiprogrammering[4]
44
Hændelsesstyret server• En proces/tråd• Eksplicit tilstand per forespørgsel (status,
forbindelse, etc.)• God parallelisme• Server bestemmer prioritering af
forespørgsler• Undgå blokerende systemkald (asynchronous)
Afkodforesp
Sendsvar
Konstruerheader
Læsdata
Fsp SvarTilstandsmaskine
Ny fsp Fsp færdigData læstLæst fsp
![Page 45: Datalogi 1F Forår 2003 Multiprogrammering[4]](https://reader035.vdocuments.pub/reader035/viewer/2022070409/56814499550346895db1405d/html5/thumbnails/45.jpg)
45
Eksempel: Flash webserverenAsymmetrisk flerproces hændelsesstyret
– Brug hjælperprocesser/tråde ved blokerende operationer
– Har brug for interproceskommunikation (IPC)
Hjælperproces
Hjælperproces
Hjælperproces
Hjælperproces
Læs fsp CGICGI
Afkodforesp
Generersvar
Konstruerheader
Læsfildata
Fsp SvarTilstandsmaskine
Ny fsp Fsp færdigData læstData icache
Læs fsp
![Page 46: Datalogi 1F Forår 2003 Multiprogrammering[4]](https://reader035.vdocuments.pub/reader035/viewer/2022070409/56814499550346895db1405d/html5/thumbnails/46.jpg)
Datalogi 1F: Multiprogrammering[4]
46
Flash / mmapApplikation
Virtueltadresserum
Mmap’ed fil
Fysisklager
Operativsystem Ydre enhed
File
Dobbelt buffering/caching undgås
![Page 47: Datalogi 1F Forår 2003 Multiprogrammering[4]](https://reader035.vdocuments.pub/reader035/viewer/2022070409/56814499550346895db1405d/html5/thumbnails/47.jpg)
Datalogi 1F: Multiprogrammering[4]
47
Flash File I/O• Cache bestående af mmap’ede filer• Hjælper proces tilgår al data og giver
besked til server proces• Server proces kan derved tilgå data uden
at blokere• Server prøver at kontrollere
hukommelsesforbrug
Fil
Hjælperproces
ServerProcesbruger
OS
![Page 48: Datalogi 1F Forår 2003 Multiprogrammering[4]](https://reader035.vdocuments.pub/reader035/viewer/2022070409/56814499550346895db1405d/html5/thumbnails/48.jpg)
Datalogi 1F: Multiprogrammering[4]
48
Flash resultater• Afprøvning:
– kunstig genereret arbejdsbelastning– forespørgselsmønstre opsamlet fra ”den
virkelige verden”
• Resultater:– 30% - 50% procent højere ydelse end
kommercielle web servere (men kan til dels skyldes mindre funktionalitet).
![Page 49: Datalogi 1F Forår 2003 Multiprogrammering[4]](https://reader035.vdocuments.pub/reader035/viewer/2022070409/56814499550346895db1405d/html5/thumbnails/49.jpg)
Datalogi 1F: Multiprogrammering[4]
49
Mere om Flash
• Flash: An Efficient and Portable Web Server: Vivek S. Pai, Peter Druschel, Willy Zwaenepoel, i Proceedings of the USENIX 1999 Annual Technical Conference
• http://www.cs.princeton.edu/~vivek/flash/
![Page 50: Datalogi 1F Forår 2003 Multiprogrammering[4]](https://reader035.vdocuments.pub/reader035/viewer/2022070409/56814499550346895db1405d/html5/thumbnails/50.jpg)
Datalogi 1F: Multiprogrammering[4]
50
Opsummering• Kerner med afbrydelser:
– introduktion af parallelisme i kernen– implementation af udelelighed ved styring af
afbrydelsesniveau
• Tvungent processkift:– øget parallelisme i kernen (alle processer kan
afbrydes)– periodisk processkift– indlejrede afbrydelser
• Multiprogrammeringseksempel:– Flash web serveren:
• multiproces, hændelsesstyret tilstandsmaskine
![Page 51: Datalogi 1F Forår 2003 Multiprogrammering[4]](https://reader035.vdocuments.pub/reader035/viewer/2022070409/56814499550346895db1405d/html5/thumbnails/51.jpg)
Datalogi 1F: Multiprogrammering[4]
51
Kilder
• Disse slides er baseret på indholdet i Datalogi 1F kursusbog bind 4, kapitlerne 7 & 8.