4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)1 2G1518 Datorteknik Föreläsning 9 1. CPU-scheduling 2. Semaforer (förberedelse till hemlab 3) version vt07 för IT/ME och 2IT
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)2 F1F2F3F4F5F6F7F8F9F10Ö2Ö1Ö3Ö4Ö5LAB-1LAB-2Hemlab-1Ö6Ö7LAB-3Hemlab-2Ö8Hemlab-3Ö9TentamenÖ10 Assemblerkod 4 stegs pipeline Nios2time Nios2io C-kod Nios2int Cache-minnen CPU-scheduling 2G1518 Datorteknik
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)3 2G1518 Datorteknik Föreläsning 9 1. CPU-scheduling (förberedelse till hemlab 3)
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)4 Realtidskärna Viktiga begrepp (en del) Kursboken kap CPU - scheduling Time Slice Timer Interrupt Context Switch (process/thread switch) Process Control Block / Thread Control Block Ready Queue Round Robin
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)5 CPU-scheduling Round Robin OS Tråd 1 Tråd 2 Tråd 3 time-slice time-out time-ut time-out context switches...
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)6 Åtgärder vid Context Switch Save PCB: Spara undan viktig information, dvs allt som behövs för att kunna fortsätta exekvering vid senare tidpunkt. (PCB – Process Control Block) Put in RQ: Placera processen/tråden i Ready-Queue Get from RQ: Välj en ny, viktig, process/tråd ur Ready- Queue Unsave PCB: Kopiera in dess PCB till processorn Return: Starta/fortsätt exekvering av den nyhämtade processen/tråden
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)7 Program-Kod för context switch Hit kommer man vid interrupt från Timern # Denna kod exekveras med PIE=0, avbrott avstängda timerint: subiR29, r29, 4# justera återhoppsadress / ea pushr29# skydda returadress/ea på stacken …# kvittera timern med mera ”cmpcond r24, ri, rj”# har det gått en time-slice bner24, r0,contextswitch# så gör contextswitch # annars... cswret:popr29# återställ returadress/ea eret# tillbaks till samma tråd/process
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)8 Program-Kod för context switch (forts.) contextswitch: pushr31# skydda returadress i r31/ra call PCBSAVE# spara PCB i minnet (på lokal stack) move r4, sp# kopiera sp till r4 call RQPUT# skriv sp i Ready Queue # här görs ”språnget” mellan 2 processer/trådar call RQGET # läs ny sp från Ready Queue move sp, r2# kopiera r2 till sp call PCBUNSAVE # kopiera PCB till processorn popr31# återställ r31/ra... cswret:popr29# återställ returadress/ea eret# tillbaks till utvald tråd/process
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)9 Nios-II Process Control Block - PCB Thread Control Block - TCB r1—r26 r28, r30 ctrl2 # bstatus sp r29 #returadress r31 #returadress ctrl3 # ienable ctrl1 # estatus
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)10 Realtidskärna Viktiga begrepp (igen) Time-Slice# millisekunder PCB Save # spara undan Process Control Block RQ Put# pekare till tråd läggs i Ready Queue RQ Get# pekare till tråd tas ur Ready Queue PCB Unsave # återställ Process Control Block Exit# avsluta en tråd CreateThread (Addr, SP, PRIO) # initiera ett Process Control Block Yield# släpp resten av en Time-Slice (Sleep# ”sov en stund” (inte nu!) )
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)11 CPU-scheduling Exit (System Call) OS Tråd 1 Tråd 2 Tråd 3 time-slice time-out exit time-out Round Robin Tråd 2 borta ur RQ !
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)12 OS Tråd 1 Tråd 2 Tråd 3 time-slice time-out Round Robin CPU-scheduling Create (System Call) create Tråd 2 tillkom i RQ !
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)13 OS Tråd 1 Tråd 2 Tråd 3 time-slice time-out Sound Robin CPU-scheduling Yield (System Call) yield < time-slice Tråd 2 vilar i RQ !
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)14 Ready Queue Current Thread and PCB:s PCB2 Process Control Block PCB4 Process Control Block PCB6 Process Control Block PCB1 Process Control Block Ready Queue Ready Queue innehåller (stack-) pekare till PCB:er Current Thread (5)
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)15 Ready Queue PCB Save PCB2 Process Control Block PCB4 Process Control Block PCB1 Process Control Block Ready Queue Current Thread (5) sp PCB5 Process Control Block PCB6 Process Control Block
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)16 Ready Queue RQ Put PCB2 Process Control Block PCB4 Process Control Block PCB1 Process Control Block Ready Queue Current Thread (5) PCB5 Process Control Block PCB6 Process Control Block
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)17 Ready Queue Select new Process/Thread PCB2 Process Control Block PCB4 Process Control Block PCB1 Process Control Block Ready Queue PCB5 Process Control Block PCB6 Process Control Block Current Thread (2)
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)18 Ready Queue RQ Get PCB2 Process Control Block PCB4 Process Control Block PCB6 Process Control Block PCB1 Process Control Block Ready Queue PCB5 Process Control Block Current Thread (2) sp
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)19 Ready Queue, Data Structure Circular Buffer, FIFO wraddr: rdaddr: rqend: queue: ledig upptagen Utanför queue
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)20 Ready Queue, Data Structure.equMAX_THREADS, 16.data.align2# 2 2 wraddr:.wordqueue# *skrivadress rdaddr:.wordqueue# *läsadress queue:.fillMAX_THREADS, 4, 0 rqend:.word# slutmärke
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)21 Ready Queue, Data Structure Circular Buffer, FIFO wraddr: rdaddr: rqend: queue: ledig upptagen Utanför queue
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)22 Nios-II: Subrutinen rqinit rqinit:moviar8, queue moviar9, wraddr moviar10, rdaddr str8, 0(r9) str8, 0(r10) ret
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)23 Nios-II: Subrutinen RQPUT RQPUT:moviar8, wraddr ldwr9, 0(r8) stwr4, 0(r9)# skriv från r4 addir9, r9, 4# öka wraddr moviar10, rqend bner9, r10, putend moviar9, queue putend:stwr9, 0(r8) ret #OBS ingen kontroll om kön är full
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)24 Nios-II: Subrutinen RQGET RQGET:moviar8, rdaddr ldwr9, 0(r8) ldwr2, 0(r9)# skriv från r4 addir9, r9, 4# öka wraddr moviar10, rqend bner9, r10, getend moviar9, queue getend:stwr9, 0(r8) ret #OBS ingen kontroll om kön är tom
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)25 Program-Kod för context switch (repris) contextswitch: pushr31# skydda returadress i r31/ra call PCBSAVE# spara PCB på lokal stack move r4, sp# kopiera sp till r4 call RQPUT# skriv sp i Ready Queue # här görs ”språnget” mellan 2 processer/trådar call RQGET # läs ny sp från Ready Queue move sp, r2# kopiera r2 till sp call PCBUNSAVE # kopiera PCB till processorn popr31# återställ r31/ra... cswret:popr29# återställ returadress/ea eret# tillbaks till utvald tråd/process(
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)26 Kod för context switch mer liknande boken sid 201 contextswitch: pushr31# skydda returadress i r31 call PCBSAVE# spara PCB på lokal stack move r4, sp# kopiera sp till r4 call ITS_scheduler# RQPUT och RQGET i C-kod move sp, r2# kopiera r2 till sp call PCBUNSAVE # kopiera PCB till processorn popr31# återställ r31 cswret:popr29# återställ returadress/ea eret# tillbaks till utvald tråd/process
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)27 Nios-II (repris) Process Control Block - PCB Thread Control Block - TCB r1—r26 r28, r30 ctrl2 # bstatus sp r29 #returadress r31 #returadress ctrl3 # ienable ctrl1 # estatus
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)28 Nios-subrutin spara PCB å stacken PCBSAVE: PUSHALL# alla utom r0, r27, r29 och r31 PUSHCTL 3# pusha ienable PUSHCTL 2# pusha bstatus PUSHCTL 1# pusha estatus ret# jmp r31 PCBUNSAVE: POPCTL 1# poppa estatus POPCTL 2# poppa bstatus POPCTL 3# poppa ienable POPALL# alla utom r0, r27, r29 och r31 ret# jmp r31
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)29 Nios-II: Macro för controlreg stacken # att ändra innehåll i r24/et är OK.macroPUSHCTLnum rdctlr24, ctl\num pushr24.endm # att ändra innehåll i r24/et är OK.macroPOPCTLnum popr24 wrctlr24, ctl\num.endm
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)30 Nios-II: Macro för att pusha register på stacken.macroPUSHALL #except r0, r27, r29, r31 pushr1 pushr2... pushr25 pushr26 pushr28 pushr30.endm
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)31 Nios-II: Macro för att poppa register på stacken.macroPOPALL #except r0, r27, r29, r31 popr30 popr28 popr26 popr25... popr2 popr1.endm
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)32 Nios-II: Macro för att lagra register till stacken.macroSTWALL #except r0, r27, r29, r31 subisp, sp, 32*4# 32 platser stwr1, 4*1(sp) stwr2, 4*2(sp)... stw r25, 4*25(sp) stwr26, 4*26(sp) stwr28, 4*28(sp) stwr30, 4*30(sp).endm
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)33 Nios-II: Macro för att ladda register från stacken.macroLDWALL #except r0, r27, r29, r31 ldwr1, 4*1(sp) ldwr2, 4*2(sp)... ldw r25, 4*25(sp) ldwr26, 4*26(sp) ldwr28, 4*28(sp) ldwr30, 4*30(sp) addisp, sp, 32*4# 32 platser.endm
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)34 Nios-II, Statusregister 0 och 1 status och estatus U PIE PIE = Processor Interrupt Enable (1=enable, 0=disable) U = User Mode (1=User Mode, 0=Supervisor Mode EU EPIE EPIE = Processor Interrupt Enable (1=enable, 0=disable) EU = User Mode (1=User Mode, 0=Supervisor Mode ctl0 - status ctl1 - estatus
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)35 Nios-II Statusregister 3 ienable, ctl3 För var och en av de 32 IRQ-signalerna finns en maskbit vars värde 0 förbjuder avbrott (disable) värde 1 tillåter avbrott (enable)
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)36 PAUS-RUTA Snart kommer nästa portion
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)37 2G1518 Datorteknik Föreläsning 9 2. Semaforer (förberedelse till hemlab 3)
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)38 Samverkande processer Användning av semaforer vid Synkronisering Ömsesidig uteslutning
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)39 Semafor, vad är det En heltalsvariabel (0, 1, 2, 3 … -1, -2 ??) (men med) Speciella egenskaper Operationer (atomära - odelbara) signal (sem) ~ öka med 1 wait (sem) ~ minska med 1 om det går (annars ”vänta” tills det går) Binär semafor, kan anta värde 0 eller 1
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)40 Semafor korgbollsanalogi KORG BOLL
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)41 Semafor korgbollsanalogi KORG BOLL SIGNAL är ungefär: Lägg en till boll i korgen (och fortsätt sedan…)
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)42 Semafor korgbollsanalogi KORG BOLL WAIT är ungefär: Vänta (vid behov) tills det finns minst en boll i korgen Ta en boll ur korgen (och fortsätt sedan …)
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)43 Dijkstra Signal - Verhogen; V(sem) Wait - Proberen; P(sem)
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)44 Samverkan mellan processer med hjälp av semaforer Synkronisering Ömsesidig uteslutning (Mutual Exclusion) Rendez Vous (dubbel synkronisering)
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)45 Synkronisering: P1 i T1 krävs före P2 i T2 … P1: … signal … wait P2: … T1: T2:
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)46 Synkronisering P1 i T1 krävs före P2 i T2 … P1: … signal … wait P2: … T1: T2:
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)47 Synkronisering P1 i T1 krävs före P2 i T2 … P1: … signal … wait P2: … T1: T2:
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)48 Synkronisering P1 i T1 krävs före P2 i T2 … P1: … signal … wait P2: … T1: T2:
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)49 Synkronisering P1 i T1 krävs före P2 i T2 … P1: … signal … wait P2: … T1: T2:
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)50 Synkronisering P1 i T1 krävs före P2 i T2 … P1: … signal … wait P2: … T1: T2:
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)51 Synkronisering P1 i T1 krävs före P2 i T2 … P1: … signal … wait P2: … T1: T2:
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)52 Synkronisering P1 i T1 krävs före P2 i T2 … P1: … signal … wait P2: … T1: T2:
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)53 Synkronisering P1 i T1 krävs före P2 i T2 … P1: … signal … wait P2: … T1: T2:
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)54 Ömsesidig uteslutning: P1 i T1 kritisk liksom P2 i T2 … wait P1: … signal … wait P2: signal … T1: T2: P1 och P2 får inte exekveras ”samtidigt”
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)55 Ömsesidig uteslutning P1 i T1 kritisk liksom P2 i T2 … wait P1: … signal … wait P2: signal … T1: T2: P1 Och P2 får inte exekveras ”samtidigt”
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)56 Ömsesidig uteslutning P1 i T1 kritisk liksom P2 i T2 … wait P1: … signal … wait P2: signal … T1: T2: P1 Och P2 får inte exekveras ”samtidigt”
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)57 Ömsesidig uteslutning P1 i T1 kritisk liksom P2 i T2 … wait P1: … signal … wait P2: signal … T1: T2: P1 Och P2 får inte exekveras ”samtidigt”
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)58 Ömsesidig uteslutning P1 i T1 kritisk liksom P2 i T2 … wait P1: … signal … wait P2: signal … T1: T2: P1 Och P2 får inte exekveras ”samtidigt”
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)59 Ömsesidig uteslutning P1 i T1 kritisk liksom P2 i T2 … wait P1: … signal … wait P2: signal … T1: T2: P1 Och P2 får inte exekveras ”samtidigt”
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)60 Ömsesidig uteslutning P1 i T1 kritisk liksom P2 i T2 … wait P1: … signal … wait P2: signal … T1: T2: P1 Och P2 får inte exekveras ”samtidigt”
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)61 Ömsesidig uteslutning P1 i T1 kritisk liksom P2 i T2 … wait P1: … signal … wait P2: signal … T1: T2: P1 Och P2 får inte exekveras ”samtidigt”
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)62 Ömsesidig uteslutning P1 i T1 kritisk liksom P2 i T2 … wait P1: … signal … wait P2: signal … T1: T2: P1 Och P2 får inte exekveras ”samtidigt”
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)63 Rendez Vous T1 och T2 inväntar varandra innan S1 och S2 exekverar … P1: … signal wait S1 … P2: … signal wait S2 T1: T2:
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)64 Testprogram (hem-laboration 3) Producers, p stycken, producerar primtal Consumers, c stycken, konsumerar primtal FIFO (buffert) med x platser för primtal
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)65 Producer init:tal := start ploop:räkna ut nästa primtal, tal anropa PUT-FIFO (tal) br ploop
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)66 Producer ”NiosII-kod” / makron prod:moviar4, start ploop:callNextPrime# subrutin PUTFIFO# macro brploop
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)67 Consumer init:vid behov ? cloop:anropa GET-FIFO (tal) konsumera primtalet (skrivut tal) brcloop
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)68 Consumer ”Nios-kod” / makron cons:nop cloop:GETFIFO# macro callPrintPrime# subrutin brcloop
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)69 PUT-FIFO Skriv data till FIFO-buffert på ett säkert sätt Det måste finnas minst en ledig plats ”Samtidig” skrivning är kritisk Vad är det som är kritiskt ? Hantering av skrivpekaren wraddr !
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)70 FIFO Queue, Data Structure (jfr med RQ!) wraddr: rdaddr: fifoend: fifo: ledig upptagen
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)71 FIFO Queue, Data Structure.equnrfifo, 16.data.align4 wraddr:.wordfifo rdaddr:.wordfifo fifo:.fillnrfifo, 4, 0 fifoend:.word
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)72 Nios-II: Subrutinen fifoinit fifoinit:moviar8, fifo moviar9, wraddr moviar10, rdaddr str8, 0(r9) str8, 0(r10) ret
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)73 Nios-II: Subrutinen wrfifo wrfifo:moviar8, wraddr ldwr9, 0(r8) stwr4, 0(r9)# skriv från r4 addir9, r9, 4# öka wraddr moviar10, fifoend bner9, r10, wrend moviar9, fifo wrend:stwr9, 0(r8) ret #OBS ingen kontroll om kön är full
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)74 Nios-II: Subrutinen rdfifo rdfifo:moviar8, rdaddr ldwr9, 0(r8) ldwr2, 0(r9)# skriv från r4 addir9, r9, 4# öka wraddr moviar10, fifoend bner9, r10, rdend moviar9, fifo rdend:stwr9, 0(r8) ret #OBS ingen kontroll om kön är tom
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)75 anrop … wait … wait … wrfifo … signal … signal … retur PUT-FIFO nrempty wrmut nrfull
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)76 ”Nios-kod” för PUTFIFO (bara en massa macron) PUTFIFO:WAITnrempty WAITwrmut callwrfifo SIGNALwrmut SIGNALnrfull RETURN
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)77 Nios-II-kod Macro för System Call.macroSysCallindex moviar4, \index trap.endm
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)78 Nios-II-kod Macro för Wait och Signal.macroSIGNALsem moviar5, \sem SysCall6# trap med 6 i r4.endm.macroWAITsem moviar5, \sem SysCall7# trap med 7 i r4.endm
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)79 GET-FIFO Läs data från FIFO-buffert på ett säkert sätt Det måste finnas minst en upptagen plats Samtidig läsning är kritisk Vad är det som är kritiskt ? Hantering av rdaddr !
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)80 GET-FIFO nrempty rdmut nrfull retur … signal … signal … rdfifo … wait … wait … anrop
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)81 Nios-kod för GETFIFO (bara en massa macron) GETFIFO:WAITnrfull WAITrdmut callrdfifo SIGNALrdmut SIGNALnrempty RETURN
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)82 CPU-scheduling OS Prod 1 Prod 2 Prod 3 Cons 1 Cons 2 time-slice
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)83 En process kan göra yield Lämna bort resten av sin time-slice Speciellt vid wait-operation på semafor Nästa thread bör få en hel time-slice Vid en semafor finns ”väntande threads” En signal kan flytta en thread till RQ Det finns olika varianter vid signal (vilken tråd ska fortsätta efter signal ?)
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)84 Några sidor om SIGNAL som System Call med TRAP 6 WAIT som System Call med TRAP 7 YIELD som System Call med TRAP 8 EXIT som System Call med TRAP 9 Nios-II-kod för signal, wait och yield ...
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)85 Signal med Nios-II-kod pekare till semafor i r5 # Om anrop görs med SysCall 6 är PIE redan= 0 #DI# enter critical trap6:ldwr24, 0(r5)# hämta värde addir24, r24, 1# lägg till en boll stwr24, 0(r5)# skriv värde #EI# NEJ ! eret# medför även EI
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)86 Wait med Nios-II-kod pekare till semafor i r5 Om anrop görs med TRAP7 är PIE redan =0 trap7: ldwr24, 0(r5)# läs nytt semaforvärde bgtr24, r0, ball# hopp om minst en boll noball:PUSHCTL 1# skydda estatus PUSHr29# skydda ea EI# släpp in TimerInt, OBS OBS ! # YIELD# om så önskas med SysCall 8 DI# hindra TimerInt POPr29# återställ ea POPCTL 1# återställ estatus brtrap7# och leta boll igen ball:subir24, r24, 1# ta en boll stwr24, 0(r5)# semaforvärde skrivs tillbaks eret# medför även EI
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)87 Program-Kod för context switch (uppdaterad repris) contextswitch: pushr31# skydda returadress i r31/ra call PCBSAVE# spara PCB på lokal stack move r4, sp# kopiera sp till r4 call RQPUT# skriv sp i Ready Queue # här görs ”språnget” mellan 2 processer/trådar exit:call RQGET # läs ny sp från Ready Queue move sp, r2# kopiera r2 till sp call PCBUNSAVE # kopiera PCB till processorn popr31# återställ r31/ra... cswret:popr29# återställ returadress/ea eret# tillbaks till utvald tråd/process
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)88 Yield med Nios-kod YIELD-anrop görs med TRAP 8 TRAP 8 görs med SysCall 8 Vad ska utföras av YIELD ? Samma sak som context switch !
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)89 Kod för YIELD Hit kommer man efter YIELD-anrop och det ska göras Context Switch (Timern ska justeras till hel time-slice …) trap8: pushr29 brcontextswitch
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)90 EXIT med Nios-kod EXIT-anrop görs med TRAP (t.ex TRAP9) TRAP 9 görs med SysCall 9 Vad ska utföras av EXIT ? Tråden ska ej placeras i RQ !
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)91 Kod för EXIT Hit kommer man efter EXIT-anrop och det ska göras Context Switch ( Timern ska justeras till hel time-slice …) trap9: brexit
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)92 Hem-laboration 3 ingår i kursen våren 2006 Material ingår i tentamen (se extentor) Lab-PM finns på hemsidan Labben körs på MIPS-simulatorn ! Labben ska redovisas muntligt Ensam eller i grupp om 2 (ev 2 grupper)
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)93 Hem-laboration 3 CPU-scheduling / semaforer Idle-tråd kan göra Yield Producer skriver primtal till FIFO Consumer läser primtal från FIFO Antal Producers varieras Antal Consumers varieras Antal platser i FIFO varieras Beteende vid WAIT varieras
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)94 OS Idle (gör inte yield) Prod 1 time-slice Round Robin CPU-scheduling Idle-tråd och en Producer Idle tar cirka 50% av tiden Prod 1 får cirka 50% av tiden
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)95 OS Idle (Idle gör yield) Prod 1 time-slice Round Robin CPU-scheduling Idle-tråd och en Producer Idle tar cirka 0% av tiden Prod 1 får nästan 100% av tiden
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)96 OS Idle (gör yield) Proc 1 Proc 2 Proc 3 time-slice Round Robin CPU-scheduling Idle-tråd och tre Processer Proc 1 får cirka 33% av tiden
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)97 OS Idle Proc 1 Proc 2 Proc 3 Proc 4 Proc 5 time-slice Round Robin CPU-scheduling Idle-tråd och fem Processer Proc 1 får cirka 20% av tiden
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)98 CPU-scheduling endast Idle-tråd OS Idle time-slice Round Robin Idle får cirka 100% av tiden
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)99 Med time-slice 10 millisekunder Hur många instruktioner? $Antag 1 GHz processor $Antag 1 instruktion per CPU-cykel $ instruktioner per sekund $ instruktioner per millisekund $ instruktioner per time slice
4 June G1518, Föreläsning 9, vt07 (IT/ME/2IT)100 Windows OS ctrl-alt-del öppnar Windows Task Manager Klicka på Processes och studera längst ner:... System Idle Process SYSTEM många%