Capitolo 5: Scheduling della CPU! Criteri di Scheduling! Algoritmi di Scheduling! Cenni Scheduling per sistemi multprocessore !! Modelli Asimmetrico e Simmetrico! Scheduling della CPU! 5.2! Concetti di Base! Alternanza di Sequenze di CPU- e I/O-Burst! Massimizzare l’utilizzo della CPU mediante multiprogrammazione! CPU–I/O Burst Cycle ! Processo alterna cicli di CPU ad attese di I/O! Distribuzione dei cicli di CPU (CPU-burst)! 5.3! 5.4! Istogramma dei CPU-burst! Scheduling! Scheduler a lungo termine ! Decide quali tra i job richiesti vanno selezionati per essere schedulati! Decide il grado di multiprogrammazione e crea il giusto mix di programmi ! Scheduler a breve termine! Decide quale processo pronto attivare! Il vero e proprio schedulatore della CPU! Scheduler a medio termine! Controlla lo swap in and swap out dei processi! Fa il tuning del grado di multiprogrammazione! Può liberare memoria per altri processi ! 5.5! 5.6! Schedulatore della CPU! Sceglie tra i processi pronti quello da eseguire e assegna la CPU! La Schedulazione della CPU avviene quando un processo:! Dispatcher! Il Dispatcher passa il controllo della CPU al processo selezionato dallo schedulatore a breve termine: ! 1. !Passa da attivo in stato di attesa! Cambia il contesto (context switch)! 2. !Passa da attivo a stato di pronto! Passa in modalità utente! 3. !Passa da stato di attesa a stato di pronto! Salta alla locazione giusta da cui il processo schedulato deve ripartire! Latenza di Dispatch latency – tempo necessario al dispatcher per fermare un processo e farne ripartire un altro! 4. !Termina! Scheduling secondo 1 e 4 e’ non-preemptive (senza prelazione)! Se si schedula secondo 2 e 3, preemptive (con prelazione)! 5.7! 5.8! Criteri di Scheduling! Criteri di Ottimizzazione! Utilizzo/efficienza della CPU! Massimizza uso di CPU! CPU quasi sempre occupata! Massimizza throughput! Throughput – # di processi completati per unità di tempo! Minimizza turnaround! Tempo di Turnaround – tempo necessario per completare Minimizza tempo d’attesa ! un particolare processo! Minimizza tempo di risposta! Tempo di attesa – tempo trascorso dal processo nella coda di dei processi in stato di pronto! Tempo di risposta – tempo trascorso dal momento in cui una richiesta viene sottoposta al sistema fino al momento in cui una prima risposta appare in output, tempo necessario a servire una sottorichiesta (importante in ambienti time-sharing)! 5.9! 5.10! First-Come, First-Served (FCFS) Scheduling (in ordine di arrivo)! Politiche di Scheduling! FCFS – serve le richieste nell’ordine di arrivo! SJF – preferisce processi brevi ! Round robin – alterna in maniera ordinata! ! !Process ! !P1 !Burst Time !24! ! ! ! P2 ! P3 !3! !! !3! I processi arrivano nell’ordine: P1 , P2 , P3 al tempo 0! Highest Response Ratio Next – cerca di bilanciare Il diagramma di Gantt per la schedulazione: tra processi brevi limitando i tempi di attesa! P1! P2! P3! ! ! 0! Tempo di attesa: 24! P1 = 0; P2 = 24; P3 = 27! Tempo medio di attesa: (0 + 24 + 27)/3 = 17! 5.11! 5.12! 27! 30! FCFS Scheduling (Cont.)! Shortest-Job-First (SJF) Scheduling! Consideriamo ora l’ordine di arrivo! ! Scegli il processo con il più piccolo CPU burst! ! P2 , P3 , P1 ! Schemi possibili: ! Il diagramma di Gantt diventa: Non-preemptive – una volta assegnata la CPU ad un processo attendi fino a completamento del CPU burst! preemptive – se un nuovo processo arriva con CPU burst più breve del tempo rimanente al CPU burst del processo in esecuzione, prelaziona! ! P2! 0! P3! 3! P1! 6! 30! Tempi di attesa: P1 = 6; P2 = 0; P3 = 3! noto come: Shortest-Remaining-Time-First (SRTF)! SJF ottimizza (minimizza) il tempo medio di attesa! Tempo medio di attesa: (6 + 0 + 3)/3 = 3! Schema Miglioramento significativo! Evitato l’effetto convoglio: processi brevi dopo processi lunghi! 5.13! 5.14! Esempio di SJF Non-Preemptive! ! Esempio di SJF Preemptive (SRTF)! !Process !Arrival Time !Burst Time! ! ! !P1 !0 !7! ! ! P2 !2 !4! ! ! P3 !4 !1! ! ! P4 !5 !4! SJF (non-preemptive)! P1! 0! 3! !Process !Arrival Time !Burst Time! ! !P1 !0 !7! ! ! P2 !2 !4! ! ! P3 !4 !1! ! ! P4 !5 !4! SJF (preemptive)! P3! 7! P2! 8! Tempo media di attesa = (0 + 6 + 3 + 7)/4 = 4! 5.15! P4! 12! P1! 16! 0! P2! 2! P3! 4! P2! 5! P4! 7! P1! 11! Tempo medio di attesa = (9 + 1 + 0 +2)/4 = 3! 5.16! 16! La Lunghezza dei CPU Burst! SJF Preemptive e non-preemptive! ! !Process !Arrival Time !Burst Time! ! !P1 !0 !7! Possiamo solo stimare tale lunghezza! ! ! P2 !2 !4! Possibilità: usa le lunghezza dei precedenti CPU burst! ! ! P3 !4 !1! ! ! P4 !5 !4! SJF (preemptive) – tempo di attesa media = 3! P1! 0! P2! 2! P3! 4! P2! P4! 5! ! P1! 11! 7! Es.: media esponenziale! ! 16! 1. 2. 3. 4. t n = lunghezza effettiva dell'n mo CPU burst τ n +1 = valore atteso del prossimo CPU burst α, 0 ≤ α ≤ 1 Definisci : τ n +1 = α t n + (1− α )τ n . SJF non preemptive – tempo di attesa media = 4! € P1! 0! 3! P3! 7! P2! 8! € P4! 12! 16! 5.17! 5.18! Es.: Media Esponenziale! τ n +1 = α t n + (1− α )τ n . Previsione della lunghezza di CPU Burst! α =0! τn+1 = τn! La storia (recente) non ha valore! α =1! τn+1 = α tn! € Solo il precedente CPU burst ha valore! Se espandiamo la formula otteniamo:! τn+1 = α tn+(1 - α) τn! = α tn+(1 - α) (α tn-1 + (1 - α) τn-1)! = α tn+(1 - α) α tn-1 + (1 - α)2 τn-1! = α tn+(1 - α) α tn-1 + (1 - α)2 α tn-2+(1 - α)3 τn-2! … = α tn+(1 - α) α tn-1 +… (1 - α)k α tn-k+ …(1 - α)n+1 τ0 ! Nota che α e (1 - α) sono ≤ 1, quindi ogni termine nella formula pesa meno del precedente! 5.19! 5.20! Scheduling a Priorità! Ogni processo ha associato un valore di priorità (intero)! La CPU è allocata al processo con priorità più alta (spesso numeri piccoli indicano priorità alta)! Highest Response Ratio Next! w : tempo speso dal processo in stato di pronto dall’ultima schedulazione! s : tempo totale necessario al processo (sottorichiesta) per arrivare a terminazione (risposta)! Preemptive! R = (w+s)/s! Non-preemptive! SJF è uno sceduling a priorità definita dal tempo (previsto) di CPU burst.! Lo scheduling HRRN sceglie il processo con max R! Problemi: Starvation – processi con priorità bassa potrebbero essere “dimenticati”! Soluzione: Aging – incrementare la priorità dei processi in funzione del tempo trascorso in stato di pronto! Processi brevi hanno “priorità” ! Implementa una sorta di “aging” implicito! ! ! 5.21! 5.22! Round Robin (RR)! Ogni processo riceve la CPU per un breve intervallo (time quantum), tipicamente 10-100 millisecondi. Passato tale quanto di tempo, il processo ritorna alla fine della coda dei processi in stato di pronto.! Con n processi nella coda e un quanto di tempo = q, ogni processo riceve 1/n di CPU time in blocchi di q unità per volta. Nessun processo attende più di (n-1)q unità.! Performance! q grande ⇒ FIFO! q piccolo ⇒ q deve esser maggiore del tempo di context switch, per evitare un overhead eccessivo! Es.: RR con quanto di tempo = 20! ! ! !Process !P1 !Burst Time! !53! ! ! P2 ! 17! ! ! P3 !68! ! ! P4 ! 24! Il diagramma di Gantt: P1! P2! P3! P4! P1! P3! P4! P1! P3! P3! 0! 20! 37! 57! 77! 97! 117! 121! 134! 154! 162! ! In genere, rispetto a SJF, il tempo di turnaround è più alto, ma risulta migliore il tempo di risposta! 5.23! 5.24! Tempo di Context Switch! 5.25! Code Multilivello! Turnaround Time (medio) dipende da q! 5.26! Code Multilivello! La coda dei processi pronti divisa in code separate:! es.: foreground (interactive) e background (batch)! Ogni coda è gestita dal proprio algoritmo di scheduling! foreground – RR! background – FCFS! Scheduling tra le code! Scheduling a priorità fissa; (es. prima tutti i processi in foreground quindi quelli in background). Rischio di starvation.! Time slice – ogni coda ha assegnata una percentuale di tempo di CPU in cui può schedulare i propri processi;! es.: – 80% ai processi foreground con RR! 20% ai processi background con FCFS ! 5.27! 5.28! Code Multilivello con retroazione! Processi possono cambiare coda; ! Possibilità di implementare tecniche di aging! Parametri critici:! numero di code! Algoritmo di scheduling usato in ciascuna coda! Criterio di promozione dei processi tra le code! Criterio di declassamento dei processi tra le code! Criterio di assegnazione di un processo ad una coda in funzione del servizio richiesto! Es.: Code Multilivello con retroazione! Tre code: ! Q0 – RR con q=8 milliseconds! Q1 – RR con q=16 milliseconds! Q2 – FCFS! Scheduling! Ogni nuovo job è ammesso alla coda Q0 servita con RR. Quando attivo, il processo ha 8 milliseconds per completare. Se non completa passa alla coda Q1.! In Q1 i job sono schedulati con criterio RR con q=16. Se tale quanto non risulta sufficiente, il processo passa in Q2.! In Q2 schedulazione secondo FCFS! 5.29! Code multilivello con retroazione! 5.30! Esempi: Unix classico! Code Multilivello con retroazione! Priorità ricalcolate ad ogni intervallo! Ii = [ti, ti+1] (es. ogni secondo)! !Ti : uso CPU nell’ultimo intervallo Ii ! Stima l’uso medio della CPU come! !T = (T+ Ti )/2! Calcola la priorità (base definisce le classi di processi)! !P(i) = base + T + nice! Processi che usano molta CPU vengono penalizzati! P(i) piccolo -> priorità alta! 5.31! 5.32! ! !Process! ! !Process! ! !P1 !0 ! 4 s = 240 tick! ! !P1 !0 ! ! ! P2 !1.5 ! 2 s = 120 tick! ! ! P2 !1.5 ! ! ! P3 !2.7 ! (0.1 CPU – 0.8s I/O)-cycle! ! ! P3 !2.7 ! ! ! P4 !4.5 2 s = 240 tick ! ! ! P4 !4.5 Base = 60 Tempo! Arrival Time T = (T + Ti)/2 P 1 60 0! 0.0! T! ! P = base + T! P 2 P Burst Time Distribution! P Base = 60 P 3 T! P P 4 T! P T! Processo Schedulato! P1! Tempo! T = (T + Ti)/2 P 1 P 0.0! Arrival Time 60 P ! 2 s = 240 tick ! P 3 T! P P 4 T! P 5.34! !Process! ! !Process! ! !P1 !0 ! 4 s = 240 tick! ! !P1 !0 ! ! ! P2 !1.5 ! 2 s = 120 tick! ! ! P2 !1.5 ! ! ! P3 !2.7 ! (0.1 CPU – 0.8s I/O)-cycle! ! ! P3 !2.7 ! ! ! P4 !4.5 2 s = 240 tick ! ! ! P4 !4.5 Arrival Time P 1 P 0.0! P Burst Time Distribution! ! P = base + T! P 2 T! Base = 60 P 3 T! P P 4 T! P T! Processo Schedulato! Tempo! 0! P1! 0.0! P1! 1.0! 90 60 30! ! T = (T + Ti)/2 P 2 s = 120 tick! (0.1 CPU – 0.8s I/O)-cycle! ! 2 s = 240 tick ! P 3 T! P P 4 T! P T! Processo Schedulato! 0! P1! P1! 90 60 30! 60 0! ! 5.35! 4 s = 240 tick! P = base + T! P 2 T! Burst Time Distribution! 60 2.0! ! Arrival Time P 1 P 60 1.0! Processo Schedulato! P1! ! Tempo! T! 60! 5.33! T = (T + Ti)/2 2 s = 120 tick! (0.1 CPU – 0.8s I/O)-cycle! 0! 1.0! Base = 60 4 s = 240 tick! P = base + T! P 2 T! Burst Time Distribution! 5.36! ! !Process! ! !Process! ! !P1 !0 ! 4 s = 240 tick! ! !P1 !0 ! ! ! P2 !1.5 ! 2 s = 120 tick! ! ! P2 !1.5 ! ! ! P3 !2.7 ! (0.1 CPU – 0.8s I/O)-cycle! ! ! P3 !2.7 ! ! ! P4 !4.5 2 s = 240 tick ! ! ! P4 !4.5 Base = 60 Tempo! T = (T + Ti)/2 P 1 P 0.0! Arrival Time ! P = base + T! P 2 T! Burst Time Distribution! P Base = 60 P 3 T! P P 4 T! P T! Processo Schedulato! Tempo! 0! P1! 0.0! P1! 1.0! 90 60 30! 105 60 45! 60 2.0! 0! 0 P2! T = (T + Ti)/2 P 1 P 60 1.0! P ! P 2 s = 240 tick ! P 4 T! P P1! P1! 90 105 60 45! 60 0! 0 0 60! P2! ! 0 ! 5.38! !Process! ! !Process! ! !P1 !0 ! 4 s = 240 tick! ! !P1 !0 ! ! ! P2 !1.5 ! 2 s = 120 tick! ! ! P2 !1.5 ! ! ! P3 !2.7 ! (0.1 CPU – 0.8s I/O)-cycle! ! ! P3 !2.7 ! ! ! P4 !4.5 2 s = 240 tick ! ! ! P4 !4.5 Arrival Time P 1 P P Burst Time Distribution! ! P = base + T! P 2 T! Base = 60 P 3 T! P P 4 T! P T! Processo Schedulato! Tempo! 0! P1! 0.0! P1! 1.0! 90 60 30! 105 60 45! 60 0! 0 82 0 22! 90 60 30! 60 2.0! 3.0! P2! 0 0! P3! P 4 s = 240 tick! 2 s = 120 tick! (0.1 CPU – 0.8s I/O)-cycle! ! 2 s = 240 tick ! P = base + T! P 2 T! Burst Time Distribution! P 3 T! P P 4 T! P T! Processo Schedulato! 60 0! P1! P1! 90 60 30! 105 60 45! 60 0! 0 0 22! 90 60 30! 60 0 0! P3! 82 82 22! 90 30! 60 6! P1! 3.0! 3.1! 5.39! P 1 2.0! ! Arrival Time T = (T + Ti)/2 P 60 1.0! Processo Schedulato! 0! ! Tempo! T! 60 30! 5.37! T = (T + Ti)/2 2 s = 120 tick! (0.1 CPU – 0.8s I/O)-cycle! P 3 T! ! Base = 60 4 s = 240 tick! 60 3.0! 0.0! Burst Time Distribution! P = base + T! P 2 T! 2.0! ! Arrival Time P2! ! 5.40! ! !Process! ! !Process! ! !P1 !0 ! 4 s = 240 tick! ! !P1 !0 ! ! ! P2 !1.5 ! 2 s = 120 tick! ! ! P2 !1.5 ! ! ! P3 !2.7 ! (0.1 CPU – 0.8s I/O)-cycle! ! ! P3 !2.7 ! ! ! P4 !4.5 2 s = 240 tick ! ! ! P4 !4.5 Base = 60 Tempo! Arrival Time T = (T + Ti)/2 P 1 P 0.0! ! P = base + T! P 2 T! Burst Time Distribution! P Base = 60 P 3 T! P P 4 T! P T! Processo Schedulato! Tempo! 0! P1! 0.0! P1! 1.0! 90 60 30! 105 60 45! 60 0! 0 82 0 22! 90 60 30! 60 2.0! 3.0! 3.1! 82 4.0! P2! P3! P1! 22! 90 30! 60 6! 54 30! 6! P 1 P ! 2 s = 240 tick ! P 3 T! P P 4 T! P P1! 90 105 60 45! 60 0! 0 82 0 22! 90 60 30! 60 82 22! 90 98 54 38! 75 P2! ! 0 0! P3! 30! 60 6! P1! 0 15! 63 0 3! P3! 5.42! !Process! ! !Process! ! !P1 !0 ! 4 s = 240 tick! ! !P1 !0 ! ! ! P2 !1.5 ! 2 s = 120 tick! ! ! P2 !1.5 ! ! ! P3 !2.7 ! (0.1 CPU – 0.8s I/O)-cycle! ! ! P3 !2.7 ! ! ! P4 !4.5 2 s = 240 tick ! ! ! P4 !4.5 Tempo! Arrival Time P 1 P 0.0! P Burst Time Distribution! ! P = base + T! P 2 T! Base = 60 P 3 T! P P 4 T! P T! Processo Schedulato! Tempo! 0! P1! 0.0! P1! 1.0! 90 60 30! 105 60 45! 60 0! 0 82 0 22! 90 60 30! 60 82 22! 90 98 54 38! 75 98 38! 75 2.0! 3.0! 3.1! 4.0! 4.1! ! P2! 0 0! P3! 30! 60 6! P1! 3.1! 0 15! 63 0 3! P3! 4.0! 15! 63 9! ! ! 5.43! P2! ! P 1 2 s = 120 tick! (0.1 CPU – 0.8s I/O)-cycle! ! 2 s = 240 tick ! P 3 T! P P 4 T! P T! Processo Schedulato! 0! P1! P1! 90 60 30! 105 60 45! 60 0! 0 82 0 22! 90 60 30! 60 82 22! 90 98 54 38! 75 98 38! 75 15! 63 9! 0 54! 0! 3.0! 4.1! P 4 s = 240 tick! P = base + T! P 2 T! Burst Time Distribution! 60 2.0! ! Arrival Time T = (T + Ti)/2 P 60 1.0! Processo Schedulato! P1! ! T = (T + Ti)/2 T! 0! 5.41! Base = 60 2 s = 120 tick! (0.1 CPU – 0.8s I/O)-cycle! 60 30! 4.0! ! 4 s = 240 tick! 60 3.0! 3.1! Burst Time Distribution! P = base + T! P 2 T! 2.0! ! 0 0! T = (T + Ti)/2 P 60 1.0! Arrival Time 5.0! ! P2! ! 0 0! P3! 30! 60 6! P1! 0 15! 63 6 3! P3! 5.44! P2! 0! ! !Process! ! !P1 ! ! ! Base = 60 Tempo! 0.0! ! ! P2 !1.5 ! ! P3 !2.7 ! ! P4 !4.5 P 1 2 s = 120 tick! (0.1 CPU – 0.8s I/O)-cycle! ! 2 s = 240 tick ! P 4 T! 0! P1! P1! 90 60 30! 105 60 45! 60 0! 0 82 0 22! 90 60 30! 60 82 22! 90 98 54 38! 75 98 79 4.0! 5.0! T! P T! Processo Schedulato! 60 3.0! P Processi con più alta priorità hanno quanto di tempo maggiore! Es: Quantum = (140-Priority)x20 (o x5 se Priority >119)! P 3 T! Code Multilivello! Priorità 0-99 (real time proc) 100-139 (normal proc’s) ! P = base + T! P 2 P Esempi: Linux! 4 s = 240 tick! P 2.0! 4.1! Burst Time Distribution! !0 T = (T + Ti)/2 1.0! 3.1! Arrival Time P2! ! Attivi! priorità! 0! 1! 1! 99! 99! P2! 139! 139! P4! 140! P3! 30! 60 6! P1! 0 15! 63 0 3! P3! 38! 75 15! 63 9! 0 19! 94 54 34! 64 5.45! 0 4! 60 5.46! Sistemi Multi-Processore! ! CPU scheduling deve bilanciare il carico e le condivisioni Multiprocessing Simmetrico: ogni processore schedula autonomamente;! Alternative: ! ! accede alle strutture dati di sistema e gestisce la suddivisione per tutti! Multiprogrammazione Simmetrica: ogni processore fa scheduling autonomamente; ! Coda comune! Code separate! Affinità di processo: meglio evitare che un processo passi da un processore all’altro! Affinità forte: no switching ! Affinità debole: no switching preferito ma non garantito! Bilanciamento del carico (in contrasto con l’affinità di processo) ! Migrazione guidata (push) - un processo speciale ribilancia! Migrazione spontanea (pull) – se una coda si svuota, il !processore sposta processi da una coda piena ! ! 5.47! 140! Multiple-Processor Scheduling! tra i vari processori! Multiprogrammazione asimmetrica: un solo processore Expired! priorità! Lista dei task! Lista dei task! 0! 0 0! 0 0! Priorità ricalcolate quando il proc passa da Attivi ad Expired! 5.48! Multicore Processors! ! Processori multipli sullo stesso chip! Ogni core ha il suo insieme di registri! Risparmio energetico e più veloce! !! Multi-threading! I Core possono schedulare diversi processi/thread! Multi-Thread gestito in hardware! Quad core, dual thread = (virtualmente) 8 processori! Scheduling parallelo di processi e (hw thread)! 5.49!
© Copyright 2024 Paperzz