Datalogi 1F Forår 2003 Multiprogrammering[3] Eksempler på multiprogrammeringskerner Jørgen Sværke Hansen

Slides:



Advertisements
Lignende præsentationer
HUNDE SPEED km h 34,4 HUNDE SPEED km h 34,1 HUNDE SPEED km h 32,8 HUNDE SPEED km h 31,9 HUNDE SPEED km h 31,8 HUNDE SPEED km h 30,9.
Advertisements

Den danske befolknings syn på handicappedes rettigheder
VMS data Geografisk og tidsmæssig udvikling af indsatsen i tobisfiskeriet v/ dataspecialist Josefine Egekvist Sekretariat for myndighedsbetjening.
Atomer Et programmeret forløb. En måde at lære på.
Du skal vide nogen om blodtrykket, fordi det fortæller noget om hvordan dit hjerte har det. HUSK - at hjertet ikke er til at undvære ligesom bilen.
NemID og Fællesskema 2014 v/Signe Hansen Blegmand
Funktioner Grundbegreber.
Du skal vide nogen om blodtrykket, fordi det fortæller noget om hvordan dit hjerte har det. HUSK - at hjertet ikke er til at undvære ligesom bilen.
Hjemmesidekonstruktion Tjekspørgsmål 1.Hvad er et markup-sprog – hvad bruges det til? 2.Hvad er forskellen mellem et markup-sprog og et scriptsprog? 3.Hvad.
Torbenfeldvej Vallensbæk strand Tlf.: – – dagligt brug af vores hjemmeside •AGEN LYS har en stor og omfattende.
Niveauer af abstrakte maskiner
OS[2]: Processor, tråde og skedulering
Kap. 2 Fiskeri med trawl 2.1 · En smakke med trawlet ude.
Overskrift her Navn på oplægsholder Navn på KU- enhed For at ændre ”Enhedens navn” og ”Sted og dato”: Klik i menulinjen, vælg ”Indsæt” > ”Sidehoved / Sidefod”.
Velkommen hos Juvel A/S
Dataopsamling og GPS-styring
Bolig selskabernes Landsforening– Almene lejeboliger - Maj/Juni Almene lejeboliger - Danmarkspanelet - Maj/Juni 2010.
Symbolsk maskinsprog.
SEO PÅ AU.
1 Effektiv forrentning Kjeld Tyllesen PEØ, CBS Erhvervsøkonomi / Managerial Economics Kjeld Tyllesen, PEØ, CBS.
Multiprogrammering[1]: Ydre enheder og multiprogrammer Datalogi 1F: Forår 2003 Jørgen Sværke Hansen
Flerbrugermaskine Fælles maskine Root: webserver Peter: uploader filer Pia: programudvikling 1 langvarig proces, evt. med børneprocesser skiftende behov.

Representations for Path Finding in Planar Environments.
Grundlæggende regnskabsforståelse
Multiprogrammering[2] Datalogi 1F Forår 2003 Synkronisering og grænseflader Jørgen Sværke Hansen
Datalogi 1F: Multiprogrammering[2]
Datalogi 1F: Multiprogrammering[4] 1 Planen for i dag Repetition af kerner med afbrydelser Kerner med tvungent processkift Præsentation af K1.
Kursus om borger.dk og brugen af digital signatur
Østjysk rapport om udligning og tilskud Seminar om udligning den 26. April 2010 Job og Økonomidirektør Asbjørn Friis Jensen, Favrskov.
Titel: Arial, fed, skriftstr. 20, mørkegrå. Tekst: Arial, normal, fed eller kursiv, skriftstr. 10, 12 og 14 til print – 16 og 18 til projektor – mørkegrå.
Sådan vedligeholdes grundkortets 4 faner Vil du ændre de kort, der vises via Skoleporten > Om skolen > Grundplaner, skal du blot ændre i disse filer: Grundplan_Oversigt.gif.
Pleje og Sundhed Gennemførte719 Inviterede895 Svarprocent80% FREDERICIA KOMMUNE MTU og Psykisk APV 2012 Rapportspecifikationer.
1 UNION-FIND. 2 inddata: en følge af heltalspar (p, q); betydning: p er “forbundet med” q uddata: intet, hvis p og q er forbundet, ellers (p, q) Eksempel.
Operativsystemer [3]: Synkronisering og baglåse Datalogi 1F: Forår 2003 Jørgen Sværke Hansen
1 Powerpointserie om In-line færdiggørelse ved Heatsettrykning Avisrotation Magasindybtryk Den Grafiske Højskole.
Datalogi 1F Forår 2003 Multiprogrammering[4] Kerner og processer Jørgen Sværke Hansen
Trivselsundersøgelse og ledelsesevaluering Anæstesiologisk Afdeling Flere ledere
MATLAB Programmering Anders P. Ravn Institut for Datalogi Aalborg Universitet Forår 2005 d = size(s); for k = 1:d(1), for n = 1:d(2), if (s(k,n) < 0) r(k,n)
ETU 2008 | Elevtilfredshedsundersøgelse Erhvervsskolen Nordsjælland HTX (Teknisk Gymnasium) - Hillerød Baseret på 313 besvarelser.
Datalogi 1F Forår 2003 G1 Jørgen Sværke Hansen
Globaliseringsredegørelsen 24.mar. 14 Figurer fra Danmark tiltrækker for få udenlandske investeringer i Sådan ligger landet
1 Sortering I elementære metoder. 2 Plan Terminologi Elementære metoder til sortering -sortering ved udvælgelse -sortering ved indsættelse -Shellsort.
Matematik B 1.
Claus Brabrand, ITU, Denmark Mar 10, 2009EFFECTIVE JAVA Effective Java Presentation Workshop Claus Brabrand [ ] ( “FÅP”: First-year Project.
1 Tråde 2 Plan Trådbegrebet Synkronisering Koordinering Eksempel: et flertrådet spil.
Grunde til at jeg elsker dig
Januar 2009 MandagTirsdagOnsdagTorsdagFredagLørdagSøndag Uge 2. Anette Ø. Kl Tina H. Lone M. 6 Kl Britt H. 7 Kl Vinnie G. Gerda.
Fundamentale datastrukturer
FEN KbP/seminar2: design11 Kontraktbaseret programmering Seminar 2 Klassedesign – grundprincipper Eksempler: Stack Dictionary.
Opslagsfelter (Access, del 6). RHS – Informationsteknologi – Udgangspunkt Vi er ofte i den situation, at valg af en type for et felt ikke begrænser.
10.mar. 15 Udvikling i løn, priser og konkurrenceevne Dansk Industri.
1 Fundamentale datastrukturer. 2 Definitioner: abstrakt datatype, datastruktur Elementære datastrukturer og abstrakte datatyper : arrays, stakke, køer,
Procestræ under afvikling af cp init login shell cp cp src dest.
1 Kap. 4, Jordens Tyngdefelt = Torge, 2001, Kap. 3. Tyngdekraftens retning og størrelse g (m/s 2 ) Acceleration Tyngdepotentialet (W): evene til at udføre.
03 – Udtryk og metoder. 2 NOEA2009Java-kursus – Udtryk og metoder Udtryk i Java Java har standard udtrykene… Værditildeling Subrutiner og funktionskald.
Process Control Hardware baggrund Process begrebet i et OS Process tilstande Context switching.
Per Printz Madsen 1 Linux kernen Monolithic kernel Support for dynamiske moduler Få kerne tråde Preemptive.
VTU 2008 | Virksomhedstilfredshedsundersøgelse Aalborg Tekniske Skole Svarprocent: 27% (414 besvarelser ud af mulige)
Deadlock Definition deadlock (baglås) er en tilstand som en mængde af processer kan være i en mængde processer er i deadlock hvis alle processerne står.
Datalogi 1F: Multiprogrammering[3] 1 Planen for idag Kerner uden afbrydelser (KB4 kap. 6): –akernen: kerne med decentralt processkift –bkernen: kerne med.
I o p o DAIMI, AU, November 1999Programkonstruktion I9E.1 Konstruktion og brug af klasser – en stak og en HP-regnemaskine push pop.
 Michael E. Caspersen, 2000Introducerende objektorienteret programmering6A.1 Programmering med interfaces – en stak og en HP-regnemaskine push pop.
DAIMIProgrammering af Store Systemer1 Concurrency i Java – Samarbejdende tråde.
Programmering med interfaces Separering af specifikation, anvendelse og implementation.
Programmering med interfaces – en stak og en HP-regnemaskine push pop.
Multiple processer på web-site Web- server filer Kunde 1 Kunde 2 Kunde p1p2p internet.
Programmering med interfaces – en stak og en HP-regnemaskine push pop.
Embedded SW – C & picoBlaze
Præsentationens transcript:

Datalogi 1F Forår 2003 Multiprogrammering[3] Eksempler på multiprogrammeringskerner Jørgen Sværke Hansen

Datalogi 1F: Multiprogrammering[3] 2 Planen for idag Kerner uden afbrydelser (KB4 kap. 6): –akernen: kerne med decentralt processkift –bkernen: kerne med centralt processkift Kerne med afbrydelser (KB4 kap. 7): –løst koblede drivprogrammer –kerne med tætkoblede drivprogrammer

Datalogi 1F: Multiprogrammering[3] 3 Kerne med decentralt processkift KInitProc(…)KWaitQ KPause()KCurProc KSelectNewProcess() KInitSem()KReadChar() KWait()KWriteChar() KSignal() KReadLine() KWriteLine() readerProc writerProc

Datalogi 1F: Multiprogrammering[3] 4 Brugerprogrammerne void reader() { rsem.Init(1); wsem.Init(0); for(;;) { rsem.Wait(); buf.Read(); wsem.Signal(); } void Writer() { for(;;) { wsem.Wait(); if(buf == ”exit\r”) asm(”call_pal 0xAD”); buf.Write(); rsem.Signal(); }

Datalogi 1F: Multiprogrammering[3] 5 Processer i akerne Proces kontrolblokken i akerne: –CPU registre (gemt på stakken) –Vi gemmer kun stakpeger –Køpegere beregnet for ventekø struct Process : public Queueable { Registers *sp; }

Datalogi 1F: Multiprogrammering[3] 6 Processkift akernen: –har frivilligt processkift –benytter aktiv venten En proces kalder KPause hvis den venter på en hændelse (fungerer som yield() i Java) Aktiv venten: void KGenericProcedure() { while( ) { KPause(); <udfør aktion efter hændelse er indtruffet>; }

Datalogi 1F: Multiprogrammering[3] 7 KPause KPause foretager skiftet fra en proces til en anden: void KPause() { ; }

Datalogi 1F: Multiprogrammering[3] 8 Ventende processer AP: KPause registre P1 AP: KWait AP: KPause registre P2 AP: KReadChar AP: KPause registre P3 AP: KWriteChar PCB P1: sp PCB P2: sp PCB P3: sp struct process AP: KSelectNewP… AP: KSelectNewP… AP: KSelectNewP…

Datalogi 1F: Multiprogrammering[3] 9 Semaforoperationer void KSignal(KSem& sem) { sem++;// Aktivering af ventende } // sker ved aktiv venten void KWait(KSem& sem) { while (!sem) // Aktiv venten KPause(); sem--; }

Datalogi 1F: Multiprogrammering[3] 10 I/O operationer char KReadChar() { while(!(rdio(com1Lsr) & 0x01)) KPause(); return rdio(com1Rbr); } void KWriteChar(char ch) { while(!(rdio(com1Lsr) & 0x20)) KPause(); wrio(com1Thr, ch); }

Datalogi 1F: Multiprogrammering[3] 11 Kontrolregistre på UART

Datalogi 1F: Multiprogrammering[3] 12 I/O operationer (2) void KReadLine(char* p, int max) { for (int i = 0; i < max-1; i++) if((*p++ = KReadChar()) == ’\r’) break; *p = ’\0’; } void KWriteLine(char *p, int max) { for (int i = 0; (i < max) && *p; i++,p++) KWriteChar(*p); }

13 Ventende processer: igen PCB P1: sp PCB P2: sp PCB P3: sp struct process AP: KReadLine AP: KWriteLine AP: KPause registre P1 AP: KWait AP: KPause registre P2 AP: KReadChar AP: KPause registre P3 AP: KWriteChar AP: KSelectNewP… AP: KSelectNewP… AP: KSelectNewP…

Datalogi 1F: Multiprogrammering[3] 14 KPause: implementation ( klib.s ) KPause: lda sp,-STAKRAMME(sp) stq $0, 0(sp) stq $1, 8(sp) … stq$29, 0xE8(sp) bis sp, 0, a0 // stakpeger er parameter lda pv, KSelectNewProcess jsr ra, (pv) bis v0, 0, sp // ny stakpeger er returværdi ldq $0, 0(sp) ldq $1, 8(sp) … ldq $29, 0xE8(sp) lda sp, STAKRAMME(sp) ret (ra) SAVE_REGS REST_REGS

Datalogi 1F: Multiprogrammering[3] 15 KPause(): et par kommentarer Tæl stakpeger ned inden registre lægges på stakken: –en afbrydelse vil bruge samme stakpeger og kan overskrive værdier hvis sp er for høj Tæl stakpeger op EFTER registre er fjernet fra stakken Selve skiftet af KCurProc sker ikke i KPause men i KSelectNewProcess

Datalogi 1F: Multiprogrammering[3] 16 KSelectNewProcess Registers* KSelectNewProcess(Registers* sp) { KCurProc->sp = sp; KWaitQ.Put(KCurProc); KCurProc = KWaitQ.Get(); return KCurProc->sp; } Skedulering foregår round-robin Hvad er det for noget med Registers* ? Var det ikke stakpegeren???

17 struct Registers struct Registers { unsigned long r [30]; unsigned long ps, pc, gp, a0, a1, a2; }; r[0] r[1] r[29] ps a2 struct registers placering i lageret r[0] r[1] r[29] AP: KPause en processtak ved kald af KSelectNewProcess PAL kald stakramme Registers*

18 KCurProc PCB P3: sp PCB P2: sp PCB P1: sp void KWriteChar(char ch) { while(!(rdio(com1Lsr) & 0x20)) KPause(); wrio(com1Thr, ch); } void KWait(KSem& sem) { while (!sem) KPause(); sem--; } char KReadChar() { while(!(rdio(com1Lsr) & 0x01)) KPause(); return rdio(com1Rbr); } Ventende processer: igen igen AP: KPause registre P1 AP: KWait AP: KPause registre P2 AP: KReadChar AP: KPause registre P3 AP: KWriteChar struct process AP: KReadLine AP: KWriteLine KCurProc AP: KSelectNewP… AP: KSelectNewP… AP: KSelectNewP…

19 KCurProc PCB P3: sp PCB P2: sp PCB P1: sp void KWriteChar(char ch) { while(!(rdio(com1Lsr) & 0x20)) KPause(); wrio(com1Thr, ch); } void KWait(KSem& sem) { while (!sem) KPause(); sem--; } char KReadChar() { while(!(rdio(com1Lsr) & 0x01)) KPause(); return rdio(com1Rbr); } Ventende processer: igen igen AP: KPause registre P1 AP: KWait AP: KPause registre P2 AP: KReadChar AP: KPause registre P3 AP: KWriteChar struct process AP: KReadLine AP: KWriteLine KCurProc AP: KSelectNewP… AP: KSelectNewP… AP: KSelectNewP…

Datalogi 1F: Multiprogrammering[3] 20 OK – nok show: hvordan starter vi akernen? // Reader processens kernedatastrukturer extern void Reader (); Process readerProc; unsigned long readerStack [stackSize]; void main() { KWait.Init(); KInitProc(Reader, readerStack, &readerProc); KInitProc(Writer, writerStack, &writerProc); KCurProc = KWaitQ.Get(); KFirst(KCurProc->sp); }

Datalogi 1F: Multiprogrammering[3] 21 Hvad sker der i KInitProc? KInitProc initialiserer en proces’ stak, så det ser ud som om den er afbrudt af KPause(): void KInitProc(void (*startAddr) (), void *Stack, Process *proc) { Stack += (stackSize * sizeof(unsigned long) – sizeof(Registers) ); proc->sp = (Registers *) Stack; proc->sp->r[26] = proc->sp->r[27] = (unsigned long) startAddr; // ra & pv KWaitQ.Put(proc); }

Datalogi 1F: Multiprogrammering[3] 22 Og så skal det hele sættes igang KCurProc = KWaitQ.Get(); KFirst(KCurProc->sp); hvor KFirst er defineret ved: KFirst:ldgp gp, (pv) ldq pv, 0xD8(a0) // Pop pv addq a0, 0xF0,a0 // Skip registre bis a0, 0, sp // Sæt sp jmp (pv) // Hop til processtart

Datalogi 1F: Multiprogrammering[3] 23 OK, hvad var det for noget med decentralt skift? Venteløkkerne for de enkelte I/O og semaforoperationer var spredt ud over kernen: –ineffektivt: registre skal poppes og pushes hele tiden –svært at vedligeholde: hvad nu hvis vi gerne vil ændre vores aktiv venten strategi –ugennemsigtigt: vi ved ikke hvilke hændelser de enkelte processer venter på

Datalogi 1F: Multiprogrammering[3] 24 Kerne med centralt processkift I modsætning til akerne.cc ønsker vi at have en central venteløkke og processkift Hvordan specificerer en proces hvad den venter på? Vi indfører operationen KSleep(), der kan vente på at en hændelse indtræder

Datalogi 1F: Multiprogrammering[3] 25 Hændelser En proces kan vente på: –CPU (den er klar til at blive udført) –Ydre enheder (en operation bliver færdigbehandlet) –Semafor (ankomst af et signal) Specifikationen af en hændelse skal kunne omfatte alle ovenstående hændelser

Datalogi 1F: Multiprogrammering[3] 26 struct Event struct Event { enum { IO, SEM, CPU } id; union { struct { int addr; char mask; } io; struct { KSem* addr; } sem; } Event(int, char);// vent på I/O Event(KSem&);// vent på semafor Event();// vent på CPU }

Datalogi 1F: Multiprogrammering[3] 27 Ny udgave af semaforoperation Ny udgave: void KWait (KSem& sem) { if(!sem) KSleep( Event(sem) ); sem--; } Gammel udgave: void KWait(KSem& sem) { while (!sem) // Aktiv venten KPause(); sem--; }

Datalogi 1F: Multiprogrammering[3] 28 I/O operationerne char KReadChar() { if (!rdio(com1Lsr) & 0x01) KSleep( Event(com1Lsr, 0x01) ); return rdio(com1Rbr); } void KWriteChar(char ch) { if (!rdio(com1Lsr) & 0x20) KSleep( Event(com1Lsr, 0x20) ); wrio(com1Thr, ch); }

Datalogi 1F: Multiprogrammering[3] 29 Proceskontrolblokken Nu bliver processens tilstand udvidet med hvilken hændelse en proces venter på (hvis nogen): struct Process { Registers* sp; Event waitsFor; } *KCurProc;

Datalogi 1F: Multiprogrammering[3] 30 KSleep() En ”overbygning” til KPause(), der registerer hvilken hændelse en proces venter på: void KSleep(Event e) { KCurProc->waitsFor = e; KPause(); }

Datalogi 1F: Multiprogrammering[3] 31 Den centrale venteløkke Registers* KSelectNewProcess(Registers* sp) { KCurProc->sp = sp; for(int found = 0; !found; ) { KWaitQ.Put(KCurProc); KCurProc = KWaitQ.Get(); switch(KCurProc->waitsFor.id) { case Event::CPU: found = 1; break; case Event::IO: if(rdio(KCurProc->waitsFor.io.addr)& KCurProc->waitsFor.io.mask) found = 1; break; case Event::SEM: if(*KCurProc->waitsFor.sem.addr) found = 1; break; } return KCurProc->sp; }

32 Ventende processer: igen igen igen AP: KPause registre P1 AP: KWait AP: KPause registre P2 AP: KReadChar AP: KPause registre P3 AP: KWriteChar AP: KSleep PCB P1: sp waitsfor = SEM struct process PCB P2: sp waitsfor = IO PCB P3: sp waitsfor = IO KCurProc AP: KSelectNewP… AP: KSelectNewP… AP: KSelectNewP… void KWriteChar(char ch) { if (!rdio(com1Lsr) & 0x20) KSleep( Event(com1Lsr, 0x20); wrio(com1Thr, ch); }

Datalogi 1F: Multiprogrammering[3] 33 Kerne med centralt processkift KInitProc(…)KWaitQ KSleep()KCurProc KPause() KSelectNewProcess() KInitSem()KReadChar() KWait()KWriteChar() KSignal() KReadLine() KWriteLine() readerProc writerProc

Datalogi 1F: Multiprogrammering[3] 34 Kerner med aktiv venten Vi har flere gange diskuteret at aktiv venten ikke er den mest effektive måde at opdage en hændelse på: –selv med en central venteløkke spilder vi tid på at undersøge ydre enheders statusregistre når der ikke er behov for det forsinker aktivering af processer, der enten venter på CPU eller har modtaget en hændelse Men det giver simple kerner: –det hele kan forstås som en sekventiel proces

Datalogi 1F: Multiprogrammering[3] 35 Kerner med afbrydelser Slut med aktiv venten Afbrydelsesprocedure aktiverer ventende processer Men alting bliver mere uforudsigeligt, idet afbrydelser kan indtræde når som helst: –data kan deles mellem afbrydelsesprocedurer og resten af kernen –brug for udelelig adgang til delt data

Datalogi 1F: Multiprogrammering[3] 36 Processkift Da vi ikke har aktiv venten, skal vi holde rede på de ventende processer. Vi benytter to proceskøer: –KWaitQ: kø af processer der venter på en hændelse (semaforsignal eller ydre enhed) –KReadyQ: kø af processer der er klar til at blive udført (venter på at få adgang til CPU) Processer bør først forlade KWaitQ når hændelsen de venter på er indtrådt

Datalogi 1F: Multiprogrammering[3] 37 Suspendering af processer KPause kalder KSelectNewProcess, der sætter den aktive proces til at vente: Registers* KSelectNewProcess(Registers* sp) { KCurProc->sp = sp; KWaitQ.Put(KCurProc); KCurProc = KReadyQ.Get(); // Her er forskellen return KCurProc->sp; }

Datalogi 1F: Multiprogrammering[3] 38 Aktivering af processer Vi aktiverer processerne når vi får en afbrydelse: void KInterruptHandler() { while(!KWaitQ.isEmpty()) KReadyQ.Put(KWaitQ.Get()); } Men hov? alle processerne startes? Ja, for vi genbruger vores kerne med decentralt processkift

Datalogi 1F: Multiprogrammering[3] 39 I/O operationer char KReadChar() { while(!(rdio(com1Lsr) & 0x01)) KPause(); return rdio(com1Rbr); } void KWriteChar(char ch) { while(!(rdio(com1Lsr) & 0x20)) KPause(); wrio(com1Thr, ch); } Alle ventende processer aktiveres og udfører check på om hændelse er indtrådt decentralt

Datalogi 1F: Multiprogrammering[3] 40 Afbrydelseshåndtering i ckerne Afbrydelse fra ydre enhed aktiverer afbrydelseshåndtering via PAL kode: –først aktiveres ent_int –ent_int kalder KInterruptHandler –derefter returneres til ent_int –ent_int returnerer fra afbrydelse ent_int specificeres i ckernens main funktioner via PAL_wrent

Datalogi 1F: Multiprogrammering[3] 41 ent_int ent_int:SAVE_REGS br t0, 1f 1:ldgp gp, (t0) lda pv, KInterruptHandler jsr ra, (pv) REST_REGS call_pal PAL_rti

Datalogi 1F: Multiprogrammering[3] 42 Stak under afbrydelse AP: buf.Write() AP: KWriteLine proces Write() void KWriteLine(char *p, int max) { for (int i=0; (i<max) && *p; i++,p++) KWriteChar(*p); } PAL stakramme AP: ent_int ent_int: SAVE_REGS br t0, 1f 1: ldgp gp, (t0) lda pv, KInterruptHandler jsr ra, (pv) REST_REGS call_pal PAL_rti void KInterruptHandler() { while(!KWaitQ.isEmpty()) KReadyQ.Put(KWaitQ.Get()); } AP: KInterruptHa… AP: KReadyQ.Put… void KReadyQ.Put() {…} AP: KWriteChar Stak for Proces Writer

Datalogi 1F: Multiprogrammering[3] 43 Synkronisering med ydre enheder char KReadChar() { while(!(rdio(com1lsr) & 0x01)) KPause();// Opdaterer KWaitQ indirekte return rdio(com1Rbr); } void KInterruptHandler() { while(!KWaitQ.isEmpty()) KReadyQ.Put(KWaitQ.Get()); } Test på LSR og ventekøoperation i KReadChar skal udføres udeleligt, ellers kan følgende ske …

Datalogi 1F: Multiprogrammering[3] 44 Uheldig rækkefølge while(!(rdio(com1lsr) & 0x01)) sætter ready-bit while(!KWaitQ.isEmpty()) KPause(); AAAAARGH: vi opdager ikke at tegnet er læst

Datalogi 1F: Multiprogrammering[3] 45 Implementering af udelelighed Luk for afbrydelser: char KReadChar() { forbid(); while(!(rdio(com1lsr) & 0x01)) KPause(); char ch = rdio(com1Rbr); permit(); return ch; } Nu bliver vi ikke afbrudt mellem check af statusregister og KWaitQ.Put()

Datalogi 1F: Multiprogrammering[3] 46 Køoperationerne skal også beskyttes Eksempel: int isEmpty() { int oldipl = forbid(); int b = (size == 0); permit(oldipl); return b; }; Gem ipl – så undgår vi at lukke op for afbrydelser ved et uheld Vigtigt hvis operationer kan benyttes af afbrydelsesprocedurer

Datalogi 1F: Multiprogrammering[3] 47 Hvad gør vi når klarkøen er tom? En tomgangsproces: –en proces som aldrig kommer i ventekøen, men som hele tiden frivilligt opgiver CPU’en En tomgangsløkke i KSelectNewProcess: while( KReadyQ.isEmpty() ) /* Do nothing */;

Datalogi 1F: Multiprogrammering[3] 48 Tætkoblede drivprogrammer I stedet for at vække alle processer ved en afbrydelse kan vi have en ventekø for hver hændelse: char KReadChar() { while(!(rdio(com1lsr) & 0x01)) KPause(KReadQ); return rdio(com1Rbr); }

Datalogi 1F: Multiprogrammering[3] 49 KSelectNewProcess tager en ventekø som argument Registers* KSelectNewProcess(Registers* sp, Queue & blockOn) { KCurProc->sp = sp; blockOn.Put(KCurProc); while( KReadyQ.isEmpty() ) /* Do nothing */; KCurProc = KReadyQ.Get(); return KCurProc->sp; }

Datalogi 1F: Multiprogrammering[3] 50 Afbrydelsesprocedure ved tæt kobling void KInterruptHandler() { if( rdio(com1Iir) & 2) while(!KReadQ.isEmpty()) KReadyQ.Put(KReadQ.Get()); else if( rdio(com1Iir) & 3) while(!KWriteQ.isEmpty()) KReadyQ.Put(KWriteQ.Get()); }

Datalogi 1F: Multiprogrammering[3] 51 Opsummering Kerner uden afbrydelser: –baseret på aktiv venten Kerne med decentralt processkift: –venteløkker i styreprogrammer og semaforoperationer Kerne med centralt processkift –processer specificere en hændelse de venter på –én venteløkke der undersøger om hændelser er sket for alle ventende processer Kerne med afbrydelser: –afbrydelser aktiverer ventende processer –tæt koblede drivprogrammer: en kø per hændelse

Datalogi 1F: Multiprogrammering[3] 52 Kilder Disse slides er baseret på indholdet i Datalogi 1F kursusbog bind 4, kapitlerne 6 & 7.