 
                                Multiprogrammazione Sistemi Operativi Giuseppe Prencipe  Obiettivi (????) Avere sempre processi in esecuzione per massimizzare l’utilizzo della CPU  IDEA alla base della MultiP (????) Scheduling della CPU Un processo è in esecuzione finché non deve attendere un evento Durante l’attesa la CPU NON resta inattiva, e si esegue un nuovo processo tra quelli pronti 1 Scheduling dei processi 2 Scheduling  Lo scheduler si occupa di decidere quale fra i processi pronti può essere mandato in esecuzione  L’algoritmo di scheduling ha impatto su: prestazioni percepite dagli utenti efficienza nell’utilizzo delle risorse della macchina  Lo scheduling ha obiettivi diversi in diversi sistemi (batch, interattivi…)  NOTA: quasi tutte le risorse del calcolatore vengono sottoposte a scheduling 3 4 Sequenza di CPU e I/O burst Scheduling L’ultima sequenza di operazioni della CPU si conclude con una richiesta di terminare l’esecuzione (come????)  Osservazione: i processi si alternano fra due stati Ciclo d’elaborazione Attesa completamento I/O 5 1 6 Diagramma delle durate delle sequenze di operazioni della CPU Tipi di processi P1 Lungo burst di CPU Attesa completamento i/o Corto burst di CPU P2 tempo  Processi compute bound (P1) and I/O bound (P2) -- durata della sequenza Curva di frequenza 7 8 Tipi di processi Tipi di processi P1 P1 P2 P2 tempo tempo  Priorità agli I/O bound  Priorità ai compute bound il funzionamento del sistema è più bilanciato 9 Tipi di processi 10 Scheduler della CPU  Quale scheduler si occupa dello scheduling della CPU? Breve termine!!!!  Due tipologie di processi : processi CPU-bound -- lunghi periodi di eleborazione fra due richieste successive di I/O processi I/O-bound -- brevi periodi di elaborazione fra due richieste successive di I/O  La coda dei processi pronti può essere realizzata in vari modi, a seconda del tipo di algoritmo usato dallo scheduler Coda in ordine d’arrivo (FIFO – First In First Out) Coda con priorità Albero Lista concatenata non ordinata ....  Gli elementi delle code sono generalmente i PD 11 2 12 Tipi di scheduling Tipi di scheduling  Lo scheduler della CPU può interevnire quando un processo  Lo scheduler della CPU può interevnire Passa da esecuzione  attesa (esempio?) quando un processo  Richiesta I/O o attesa terminazione figli Passa da esecuzione  attesa (esempio?) Passa da esecuzione  pronto (esempio?)  Richiesta I/O o attesa terminazione figli  Al verificarsi di un interrupt Passa da esecuzione  pronto (esempio?) Passa da attesa  pronto (esempio?)  Al verificarsi di un interrupt  Completamento I/O Passa da attesa  pronto (esempio?) termina  Completamento I/O termina 13 Tipi di scheduling Nessuna scelta di scheduling: si esegue un processo tra i pronti (scheduling senza diritto di 14 prerilascio – non preemptive) Tipi di scheduling  Lo scheduler della CPU può interevnire  Scheduling senza prerilascio quando un processo lo scheduler interviene solo quando un processo viene creato, termina o si blocca su una SC Passa da esecuzione  attesa (esempio?)  Richiesta I/O o attesa terminazione figli Passa da esecuzione  pronto (esempio?)  Scheduling con prerilascio  Al verificarsi di un interrupt lo scheduler può intervenire ogni volta che è necessario per ottenere gli obiettivi perseguiti Passa da attesa  pronto (esempio?)  Completamento I/O termina Va fatta una scelta di scheduling: (scheduling con diritto di prerilascio – preemptive)  quando diventa pronto un processo a più alta priorità rispetto a quello in esecuzione  quando il processo in esecuzione ha sfruttato la CPU per un tempo abbastanza lungo 15 Problemi con prerilascio  Due processi condividono dati, e mentre uno li aggiorna si ha il suo prerilascio Dispatcher  È il modulo che passa il controllo della CPU al Necessari meccanismi per coordinare l’accesso a dati condivisi processo scelto dallo scheduler  Si occupa  Durante il servizio di una SC, il nucleo può aggiornare/modificare dati del nucleo (ad es. coda di I/O) per conto del processo invocante. Se avviene il prerilascio del processo: probelmi!!!! Del cambio di contesto Del passaggio al modo utente Dei saltare alla giusta posizione del programma utente per riavviarne l’esecuzione Alcuni SO attendono il completamento della SC o bloccano I/O prima che possa avvenire un cambio di contesto. Quindi non si ha prerilascio se le strutture dati del nucleo sono incoerenti  Le interruzioni si possono verificare in ogni istante  Si attiva a ogni cambio di contesto  deve Le sezioni di codice delle procedure di servizio delle interruzioni devono essere protette da un uso simultaneo essere rapido, per diminuire il più possibile la latenza di dispatch  Tipicamente, l’inizio della procedura di servizio consiste nel disattivare le interruzioni e le riattiva quando termina 17 3 16 18 Scheduling Scheduling  Diversi algoritmi di scheduling hanno proprietà differenti  Criteri per confrontare algoritmi di scheduling Utilizzo CPU Produttività (throughput): numero di processi completati nell’unità di tempo Tempo di completamento (turnaround time): intervallo che intercorre tra la sottomissione del processo e il suo completamento Tempo d’attesa: somma dei tempi passati nella coda dei processi pronti Tempo di risposta: tempo tra la sottomissione di una richiesta e la prima risposta prodotta Obiettivi principali degli Algoritmi di Scheduling:  Fairness (Equità) - processi della stesso tipo devono avere trattamenti simili  Balance (Bilanciamento) - tutte le parti del sistema devono essere sfruttate (CPU, dispositivi …) 19 Tipi di Scheduling 20 First—come, fisrt—served (FCFS)  Scheduling in ordine d’arrivo Si realizza con una coda di PD Quando un processo entra in coda, diventa l’ultimo elemento della coda Si estraggono elementi dalla testa  Tempi d’attesa medi abbastanza lunghi 21 First—come, fisrt—served (FCFS) First—come, fisrt—served (FCFS) Process Burst Time P1 24 P2 3 P3 3  Assumiamo che i processi arrivino nell’ordine: P1, P 2, P3  Lo schema di Gantt per lo schedule FCFS è P1 0 P2 24 30  Tempo d’attesa per P1 = 0; P 2 = 24; P3 = 27  Tempo d’attesa medio: (0 + 24 + 27)/3 = 17 23 4 Se i processi arrivassero nell’ordine P2 , P 3 , P 1 (????)  Lo schema di Gantt è P2 0     P3 27 22 P3 3 P1 6 30 Tempo d’attesa per P1 = 6; P2 = 0; P3 = 3 Tempo d’attesa medio: (6 + 0 + 3)/3 = 3 Molto meglio!!!! Si può avere l’e ffetto convoglio 24 FCFS: effetto convoglio Effetto convoglio  Si crea quando i processi CPU bound hanno priorità su quelli I/O bound (cosa che capita con FCFS) Es.: un processo CPU bound e tanti I/O bound Man mano che i processi entrano nel sistema, il processo CPU bound occupa la CPU Gli altri processi, terminano I/O e entrano in pronto: dispositivi I/O inattivi Il processo CPU bound esegue un I/O Tutti gli altri processi eseguono rapidamente le operazioni CPU e tornano alle code I/O, lasciando inattiva la CPU 25 Shortest—Job—First (SJF)  Tutti i processi attendono che un lungo processo liberi la CPU  La situazione migliorerebbe (come risulta dall’esempio fatto con i 3 processi) se si dà priorità ai processi brevi  NOTA: Con l’FCFS non si ha prerilascio 26 Shortest—Job—First (SJF)  Associa ad ogni processo la lunghezza della sua prossima sequenza CPU (CPU burst). Queste lunghezze vengono usate per dare priorità ai processi brevi  2 schemi Senza prerilascio – quando la CPU viene assegnata a un processo, non viene prerilasciato fino al termine della sequenza Con prerilascio – se arriva un processo con una sequenza CPU più corta del tempo che rimane al processo in esecuzione per terminare la sua sequenza, allora il processo corrente viene prerilasciato. Questo schema è noto con il nome di Shortest-Remaining-Time-First (SRTF).  Si può dimostrare l’ottimalità dello SJF: rende minimo il tempo d’attesa medio per un dato insieme di processi  Perchè?  Si considerino 4 processi A,B,C,D con tempi di esecuzione a, b, c, d Turnaround (tempo di completamento) (A) -- a turnaround(B) -- a + b turnaround(C) -- a + b + c turnaround(D) -- a + b + c + d  turnaround totale 4a + 3b + 2c + 1d minimo quando a, b, c, d sono in ordine crescente 27 Esempio di SJF senza prerilascio Process P1 P2 P3 P4 3 Esempio di SJF con prerilascio Arrival Time Burst Time 0.0 7 2.0 4 4.0 1 5.0 4 P1 0 P3 7 P2 8 Process P1 P2 P3 P4 P1 P4 12 0 16  Average waiting time = (0 + 6 + 3 + 7)/4 = 4 P2 2 Arrival Time 0.0 2.0 4.0 5.0 P3 4 P2 5 Burst Time 7 4 1 4 P4 7 P1 11 16  Average waiting time = (9 + 1 + 0 +2)/4 = 3 29 5 28 30 Determinare la lunghezza della successiva sequenza CPU SJF  Il problema con SJF è che non esistono metodi per conoscere la lunghezza della successiva sequenza di operazioni CPU  Si stima la lunghezza del successivo CPU burst calcolando la media esponenziale delle effettive lunghezze delle precedenti sequenze di operazioni della CPU. Siano  t n = Lunghezza dell’n-esimo CPU burst  Informazioni recenti Spesso viene utilizzato come scheduling a lungo termine  Un possibile modo per usare SJF è quello di τ n+1 = valore previsto per il successivo CPU burst approssimarlo, cercando di predire il valore della lunghezza della sequenza di operazioni CPU  Storia passata 0≤α≤1  Peso relativo tra storia recente e passata Osservazione: è probabile che sia simile alle precedenti τn+1 = α tn + (1- α) τn 31 Predizione lunghezza successivo CPU burst 32 Predizione  α =0 τn+1 = τn Storia recente non conta  α =1 τn+1 = tn Solo l’ultimo CPU burst conta  Se espandiamo la formula, otteniamo τn+1 = α tn+(1 - α) α tn-1 + … +(1 - α )j α tn-j + …+(1 - α )n+1τ0  Dato che sia α che (1 - α) sono ≤ 1, ogni termine α=1/2 ha peso minore o uguale a quello del suo predecessore 33 Scheduling con priorità  Ogni processo ha una priorità  La CPU è assegnata al processo con priorità maggiore (smallest integer ≡ highest priority) 34 Scheduling con priorità  Quali tra gli algoritmi di scheduling visti finora è a priorità????  SJF Preemptive Non-preemptive  Punti chiave : come assegnare le priorità (statiche, dinamiche…) come evitare attesa indefinita della CPU nei processi a priorità più bassa come individuare i processi I/O bound Lavori con lungo CPU burst: priorità bassa Lavori con corto CPU burst: priorità alta  per elevare la loro priorità 35 6 36 Scheduling con priorità Scheduling con priorità  Molte strategie per il calcolo della priorità  Tipicamente :  Problema ≡ Starvation – processi a bassa priorità dinamica (es. più elevata per i processi che passano da bloccato a pronto) legata alla percentuale f del quanto di tempo che è stato consumato l’ultima volta che il processo è andato in esecuzione priorità potrebbero non essere mai eseguiti  Soluzione ≡ Aging – con il passare del tempo, la priorità dei processi aumenta 37 Scheduling Round Robin (sistemi interattivi)  Ogni processo ottiene la CPU per un quanto di 38 Scheduling Round Robin tempo, tipicamente 10-100 millisecondi.  Dopo questo periodo, il processo è prerilasciato e messo nella coda dei pronti (realizzata FIFO)  Se ci sono n processi nella coda dei pronti, e il quanto dura q, allora ogni processo ottiene 1/n del tempo CPU in blocchi di al più q unità di tempo  Nessun processo attende più di (n-1)q unità di tempo  Performance q grande ⇒ FCFS q piccolo ⇒ q deve essere grande rispetto alla durata del cambio di contesto (a) lista dei processi pronti (b) lista dei pronti dopo che B ha usato il suo quanto (quantum) di tempo 39 40 Esempio di RR con q = 20 Scheduling Round Robin Process P1 P2 P3 P4  Come fissare il quanto di tempo deve essere abbastanza lungo da ammortizzare il costo di un context switch (ordine 1 ms) deve essere abbastanza breve da permettere una risposta veloce agli utenti interattivi 0  RR non favorisce i processi I/O bound  È uno scheduling con prerilascio???? P2 20 37 P3 P4 57 P1 77 P3 97 117 P4 P1 P3 P3 121 134 154 162  Tipicamente, si ha un tempo d’attesa medio maggiore del SJF, ma un migliore tempo di risposta 41 7 P1 Burst Time 53 17 68 24 42 Quanto e cambio di contesto Tempo di completamento e quanto 43 Sistemi interattivi: Round Robin+Priority  È possibile combinare RR e priorità  Es.: sia P un processo I/O bound. CPU burst di P sono più corti del quanto di tempo. Se P è pronto, dovrebbe essere eseguito. Quindi si assegna a P alta priorità “La priorità associata a un processo I/O bound è 1/f, con f la frazione del quanto di tempo utilizzata dal processo” 44 Scheduling – sommario  Scheduling in sistemi batch (insieme dei job da schedulare tipicamente noto a priori) SJF (shortest job first)  Scheduling in sistemi interattivi Round Robin Code Multiple 45 46 Scheduling con code multiple Scheduling con code multiple  La coda di pronti è partizionata in code separate, a seconda dei tipi di processi In primo piano (foreground o interattivi) In sottofondo (background o batch)  Ogni coda utilizza il proprio algoritmo di scheduling foreground – RR o priorità background – FCFS  È necessario uno scheduling tra le varie code A priorità fissa (prima i foreground e poi i background): possibilità di starvation Time slice – ogni coda ottiene una certa quantità di CPU che schedula tra I suoi processi. Es.: 80% ai foreground in RR, e 20% ai background in FCFS 47 8 48 Scheduling con Code multiple Scheduling con Code multiple  Scheduling Round Robin all’interno della classe con priorità più elevata  Alcuni sistemi danno quanti più lunghi ai Esempio di algoritmo di scheduling a code multiple con 4 classi di priorità processi nelle classi basse (compute-bound) per minimizzare l’overhead del cambio di contesto  Tipicamente i processi sono assegnati in modo permanente alle code 49 Code multiple con retroazione (feedabck) 50 Esempio di Multilevel Feedback Queues  Un processo può cambiare coda  Sono caratterizzate dai seguenti parametri Numeri di code Algoritmi di scheduling per ogni coda Metodo usati per “upgrade” di un processo Metodo usati per spostare in basso un processo Metodo usato per determinare in quale coda inserire un processo che richiede un servizio 51  3 code Q0 – quanto di 8 millisecondi Q1 – quanto di 16 millisecondi Q2 – FCFS  Lo scheduler esegue tutti i lavori in Q0, poi quelli in Q1 e infine quelli in Q2  Un processo in ingresso in Q1 ha la prelazione su quelli in Q2, e uno in ingresso in Q0 ha prelazione su quelli in Q1  Un nuovo lavoro entra in Q0 (servito FCFS). Quando ottiene la CPU, viene eseguito per 8 millisec. Se non termina, viene messo in Q1  In Q1 (servito FCFS) riceve altri 16 millisec. Se ancora non termina, viene spostato in Q2 52 Scheduling per multi processore Multilevel Feedback Queues  Lo scheduling della CPU diviene più complesso quando più CPU sono disponibili  Si considerano i sistemi omogenei: qualunque unità può essere usata per eseguire qualsiasi processo in coda  Condivisione del carico Invece di usare una coda per ogni processore (qualche coda potrebbe risultare vuotaprocessore inattivo) si usa un’unica coda dei pronti  Due criteri di scheduling Ogni processore può esaminare la coda e scegliere il processo da eseguire  Bisogna porre attenzione ai problemi derivanti da accessi a una struttura dati comune   Quindi, a quale tipo di processo viene data la priorità????  Spingendosi oltre si ha la multielaborazione simmetrica: tutte le decisioni di scheduling, elaborazione delle op. di I/O e le altre attività di sistema sono svolte da un’unica unità (master server); le altre eseguono solo codice 53 9 Due processori non possono scegliere lo stesso processo I processi non devono essere perduti dalla coda Si fissa un processore responsabile dello scheduling 54 Scheduling per sistemi real-time Latenza di dispatch  Hard real-time: garantiscono il completamento delle funzioni critiche entro un tempo definito I processo dichiarano il tempo entro cui devono completare le proprie funzioni Lo scheduler deve conoscere esattamente la durata dell’esecuzione di qualsiasi tipo di funzione del sistema Sono specifici in applicazioni industriali  Soft real-time: richiedono che i processi critici abbiano una priorità maggiore di quelli multimediali, grafica interattiva) ordinari (applicazioni Scheduling a priorità  I processi critici devono avere priorità fissa (non variabile nel tempo): niente aging per i processi critici Latenza di dispatch deve essere bassa (processi critici pronti devono passare presto in esecuzione)   Le chiamate di sistema devono poter subire il prerilascio (punti di prerilascio nelle SC lunghe: in questi punti il SO verifica la presenza di processi critici da eseguire. Questi punti devono essere collocati in punti “sicuri” del codice) L’intero nucleo può subire prerilascio (Solaris 2) 55 Valutazione degli algoritmi  Modelli deterministici: fornisce una valutazione analitica dell’algoritmo. Cioè, dato un algoritmo e un carico di lavoro del sistema, fornisce una formula che valuta le prestazioni dell’algoritmo per quel carico di lavoro Molto specifica e richiede conoscenze troppo dettagliate  Reti di code: tipicamente è impossibile determinare un insieme (statico) di processi da usare nei modelli deterministici (I processi variano!!!!). Però è possibile determinare le distribuzioni delle sequenze di operazioni CPU e I/O, perché si possono misurare e/o stimare 56 Reti di code  Il sistema si descrive come una rete di unità serventi, ciascuna con una coda d’attesa  Se sono noti l’andamento degli arrivi e dei servizi, si possono calcolare l’utilizzo, la lunghezza media delle code e il tempo medio d’attesa (analisi delle reti di code)  Es.: siano n: lunghezza media di una coda W: tempo medio d’attesa in coda, e λ l’andamento medio d’arrivo dei nuovi processi in coda Durante W , quanti nuovi processi arrivano in coda????  λW Se il sistema è stabile, il numero dei processi che escono dalla coda è uguale an numero dei processi che entrano, quindi  n= ???? λW (formula di Little)  Si utilizza per calcolare una delle tre variabili, note le altre due  È comunuqe complicato fornire distribuzioni realistiche 57 Valutazione tramite simulazioni 58 Valutazione tramite simulazioni  Per avere valutazioni più precise si usano simulazioni  I dati (utilizzo CPU, I/O, arrivi in coda, terminazioni, ecc) si possono ottenere tramite numeri generati casualmente (utilizzando varie distribuzioni: uniforme, Poisson, esponenziale)  Oppure tramite trace tape 59 10 60 Scheduling dei Thread Valutazione tramite realizzazione  Costi alti  Lo scheduling dei thread utilizza algoritmi simili a quelli visti finora viene implementato in modo diverso nel thread a livello utente e a livello kernel 61 62 Scheduling thread user-level Scheduling dei Thread  Lo scheduling dei thread user level il SO non conosce l’esistenza dei thread, quindi schedula i processi durante l’esecuzione di un processo lo schedulatore della libreria dei thread decide quale thread mandare in esecuzione le interruzioni del clock non sono visibili allo schedulatore di livello utente lo schedulatore può intervenire solo se invocato esplicitamente (es. thread_yield) non c’è prerilascio (all’interno di un singolo processo) Possible scheduling of user-level threads  50-msec process quantum  threads run 5 msec/CPU burst 63 64 Scheduling thread kernel-level Scheduling dei Thread  Lo scheduling dei thread kernel level il SO schedula i thread (non i processi) quando un thread si blocca il SO può decidere di mandare in esecuzione un altro thread di quel processo o un thread di un processo diverso  può scegiere se pagare il cambio di contesto o no le interruzioni del clock permettono allo schedulatore di tornare in esecuzione alla fine del quento di tempo  i quanti di tempo sono assegnati direttamente ai thread  si può effettuare prerilascio Possible scheduling of kernel-level threads  50-msec process quantum  threads run 5 msec/CPU burst 65 11 66 Per oggi basta.... 67 12